本篇文章整理了 Iptables 的基本概念及入門知識,旨在幫助大家快速了解和使用 iptables。
1 什麼是Iptables
認識Netfilter
在講Iptables之前我們必須要先認識一下Netfilter;
Netfilter是由Rusty Russell提出的Linux 2.4核心防火牆架構,該架構既簡潔又靈活, 可實作安全政策應用中的許多功能,如資料包過濾、資料包處理、位址僞裝、透明代理、動态網絡位址轉換(Network Address Translation,NAT),以及基于使用者及媒體通路控制(Media Access Control,MAC)位址的過濾和基于狀态的過濾、包速率限制等。
Netfilter是Linux作業系統核心層内部的一個資料包處理子產品,它具有如下功能:
- 網絡位址轉換(Network Address Translate)
- 資料包内容修改
- 資料包過濾防火牆
Netfilter 平台中制定了資料包的五個挂載點,這5個挂載點分别是
PRE_ROUTING
、
INPUT
OUTPUT
FORWARD
POST_ROUTING
Netfilter 所設定的規則是存放在核心記憶體中的,通過 Netfilter 放出的接口來對存放在核心記憶體中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables,鍊chains,規則rules組成。
認識Iptables
Iptables 是 Linux 防火牆工作在使用者空間的管理工具,用來設定、維護和檢查 Linux 核心的 IP 資料包過濾規則.
那麼Iptables和Netfilter到底什麼關系;
簡單來說就是Iptables配置規則,而Netfilter執行規則。
Iptables會把配置好的防火牆政策交給核心層的Netfilter網絡過濾器來處理.
2 iptables主要特點
iptables主要特點
- 列出資料包過濾器規則集的内容
- 添加 / 删除 / 修改資料包過濾器規則集中的規則
- 列出 / 清零資料包過濾器規則集的每個規則計數器
基本概念
iptables 可以檢測、修改、轉發、重定向和丢棄 IP 資料包。
其代碼已經内置于核心中,并且按照不同的目的被組織成表(table)的集合。表由一組預先定義的鍊 (chain) 組成,鍊包含周遊順序規則。
每一條規則包含條件比對和相應的動作(稱為目标),如果條件比對為真,該動作會被執行。
下圖簡要描述了網絡資料包通過 iptables 的過程
檢視源圖像
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SY3IWO5cTNmJzMxYzM0MjYwgTZ0IjZjBDNjN2YyMWZw8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
當一個資料包進入網卡時,資料包首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉送出去.
如果資料包是進入本機的,資料包就會沿着圖向下移動,到達INPUT鍊。資料包到達INPUT鍊後,任何程序都會收到它。
本機上運作的程式可以發送資料包,這些資料包經過OUTPUT鍊,然後到達POSTROUTING鍊輸出.
如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過FORWARD鍊,然後到達POSTROUTING鍊輸出.
3 四表五鍊
表(tables)
iptables 包含 4 張表(優先級為:raw > mangle > nat > filter):
filter 表:用于存放所有有防火牆相關操作的預設表。
nat 表:用于網絡位址轉換(例如:DNAT 和 SNAT)
mangle 表:用于對特定資料包的修改
raw 表:用于配置資料包,raw 中的資料包不會被系統跟蹤。
在大多數情況下僅需要使用 filter 和 nat,不會用到 raw,mangle,這2張表用于更複雜的情況——包括多路由和路由判定。
鍊(chains)
鍊就是位置:共有五個
進路由(PREROUTING)
進系統(INPUT)
轉發(FORWARN)
出系統(OUTPUT)
出路由(POSTROUTING)
表由鍊組成,鍊是一些按順序排列的規則的清單。Iptables 一共包含 5 條鍊:
INPUT 鍊:用于處理進入本機的資料包
OUTPUT 鍊:用于處理從本機輸出的資料包
FORWARD 鍊:用于轉發資料包
PREROUTING 鍊:用于在路由決策前對資料包做相關操作,經常用來做 DNAT
POSTROUTING 鍊:用于在路由決策後對資料包做相關操作,經常用來做 SNAT
filter 表包含 INPUT、OUTPUT 和 FORWARD 3 條内建的鍊,
nat 表包含 PREROUTING、POSTROUTING 和 OUTPUT 鍊。
mangle 表包含 PERROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD 鍊。raw 表包含 PREROUTING 和 OUTPUT 鍊。
預設情況下,任何鍊中都沒有規則。可以向鍊中添加自己想用的規則。
四表五鍊之間的關系如圖
4 規則
規則(rules)
資料包的過濾基于規則。規則由一個目标(資料包包比對所有條件後的動作)和很多比對(導緻該規則可以應用的資料包所滿足的條件)指定。
一個規則的典型比對事項是資料包進入的端口(例如:eth0 或者 eth1)、資料包的類型(ICMP、TCP 或者 UDP)和資料包的目的端口。
資料包通過防火牆的時候是按順序比對規則的,從上往下依次比對,一個包不符合某條規則,就會由後面的規則來處理,如果都不符合,就由預設的規則處理。
規則注意事項:
規則表示一條鍊上某個表的一些比對條件,比如拒絕某個 IP 通路
一個鍊上某個表可以設定多條規則
規則的順序很重要,一旦有一個規則比對成功了,後面的規則将會被忽略
如果所有規則沒有比對,那麼會有一個預設規則
修改規則的邏輯最好是先删除某條規則,再加入新的規則
iptables 所有的規則都儲存在 /etc/sysconfig/iptables
設定了新的規則後,必須使用 service iptables save 進行儲存或者使用iptable-save > /etc/sysconfig/iptables,否則重新開機後,新設定的規則将失效
一個規則中存在多個比對條件時,這些條件預設規則是與的關系,比如端口,IP必須滿足才算比對
5 處理動作
處理動作(target)
ACCEPT:允許資料包通過。
DROP:直接丢棄資料包,不給任何回應資訊。
REJECT:拒絕資料包通過,必要時會給資料發送端一個響應的資訊,用戶端剛請求就會收到拒絕的資訊。
REDIRECT:在本機做端口映射。
SNAT:源位址轉換,解決内網使用者用同一個公網位址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,适用于動态的、臨時會變的ip上。
DNAT:目标位址轉換。
LOG:在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則,也就是說除了記錄以外不對資料包做任何其他操作,仍然讓下一條規則去比對。
6 iptables指令格式
指令格式(options)
iptables -t filter -I INPUT -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
文法選項(options)
[-t 表名]:該規則所操作的哪個表,可以使用filter、nat等,如果沒有指定則預設為filter
-A:新增一條規則,到該規則鍊清單的最後一行
-I:插入一條規則,原本該位置上的規則會往後順序移動,沒有指定編号則為1
-D:從規則鍊中删除一條規則,要麼輸入完整的規則,或者指定規則編号加以删除
-R:替換某條規則,規則替換不會改變順序,而且必須指定編号。
-P:設定某條規則鍊的預設動作
-nL:-L、-n,檢視目前運作的防火牆規則清單
chain名:指定規則表的哪個鍊,如INPUT、OUPUT、FORWARD、PREROUTING等
[規則編号]:插入、删除、替換規則時用,--line-numbers顯示号碼
[-i|o 網卡名稱]:i是指定資料包從哪塊網卡進入,o是指定資料包從哪塊網卡輸出
[-p 協定類型]:可以指定規則應用的協定,包含tcp、udp和icmp等
[-s 源IP位址]:源主機的IP位址或子網位址
[--sport 源端口号]:資料包的IP的源端口号
[-d目标IP位址]:目标主機的IP位址或子網位址
[--dport目标端口号]:資料包的IP的目标端口号
-m:extend matches,這個選項用于提供更多的比對參數,如:
-m state --state ESTABLISHED,RELATED
-m tcp --dport 22
-m multiport --dports 80,8080
-m icmp --icmp-type 8
<-j 動作>:處理資料包的動作,包括ACCEPT、DROP、REJECT等
ACCEPT:允許資料包通過
DROP:直接丢棄資料包,不給任何回應資訊
REJECT:拒絕資料包通過,必要時會給資料發送端一個響應的資訊。
SNAT:源位址轉換。在進入路由層面的route之後,出本地的網絡棧之前,改寫源位址,目标位址不變,并在本機建立NAT表項,當資料傳回時,根據NAT表将目的位址資料改寫為資料發送出去時候的源位址,并發送給主機。
MASQUERADE,是SNAT的一種特殊形式,适用于像adsl這種臨時會變的ip上
DNAT:目标位址轉換。和SNAT相反,IP包經過route之前,重新修改目标位址,源位址不變,在本機建立NAT表項,當資料傳回時,根據NAT表将源位址修改為資料發送過來時的目标位址,并發給遠端主機。
REDIRECT:是DNAT的一種特殊形式,将網絡包轉發到本地host上(不管IP頭部指定的目标位址是啥),友善在本機做端口轉發。
LOG:在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則
7 常見執行個體
儲存防火牆規則
iptables-save
#儲存防火牆規則
預設檢視 filter 表
iptables –nvL –t [filter|nat|mangle|raw]
#預設檢視 filter 表
cat /etc/sysconfig/iptables
#檢視已儲存的防火牆規則
重新開機iptables
service iptables restart
#重新開機iptables
清除 iptables 規則
iptables -F -t [filter|nat|mangle|raw]
#預設清除 filter 表
清空規則鍊中的資料包電腦和位元組計數器
iptables -Z -t [filter|nat|mangle|raw]
#預設清除 filter 表
定義規則鍊中的預設目标(動作)
iptables -P INPUT DROP
#定義 filter 表的 INPUT 鍊預設目标為 DROP
iptables -P FORWARD ACCEPT
#定義 filter 表的 FORWARD 鍊預設目标為 ACCEPT
iptables -P OUTPUT ACCEPT
#定義 filter 表的 OUTPUT 鍊預設目标為 ACCEPT
開放 IP / 協定 / port
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
#允許源 192.168.1.100 的資料包進入本機
iptables -A INPUT -p ospf -j ACCEPT
#允許所有 ospf 協定資料包進入本機
iptables -A INPUT -p icmp -j ACCEPT
#允許所有 icmp 協定資料包進入本機
iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT
#允許本地回環
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允許通路 22 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允許通路 80 端口
記錄日志
iptables -A PREROUTING -s 172.1.0.0/16 -i eth0 -j LOG
#所有從 eth0 網卡進入的源 172.1.0.0/16 的資料包記錄在 log 日志中
啟動網絡轉發規則
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
#讓内網192.168.188.0/24使用公網 IP 210.14.67.127上網
限速
iptables -I INPUT -p tcp -s 192.168.1.100 -m limit --limit=5000/s --limit-burst=100 -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.1.100 -j DROP