- netfilter/iptables學習
- 一、鏈和表
- 表:filter:用於過濾的時候
- nat:用於作nat的時候
- 鏈:INPUT:位於filter表,匹配目的IP是本機的數據包
- FORWARD:位於filter表,匹配穿過本機的數據包
- PREROUTING:位於nat表,用於修改目的地址(DNAT)
POSTROUTING:位於nat表,用於修改源地址(SNAT)
- 二、iptables語法結構:
- iptables [-t 要操做的表] <操做命令> [要操做的鏈] [規則號碼] [匹配條件] [-j 匹配到之後的動做]
- 操做命令:(-A -I -D -R -P -F)
- 查看命令:(-[vxn]L)
- -A <鏈名>:APPEND,追加一條規則。
- 如:iptables -t filter -A INPUT -j DROP 在filter表的INPUT鏈中,匹配全部訪問本機IP的數據包,匹配到的丟棄。
-
- -I <鏈名> [規則號碼]:INSERT,插入一條規則
- 如:iptables -I INPUT 3 -j DROP 在filter表的INPUT鏈中插入一條規則,插入成第三條。 -t filter可不寫,默認是filter表
-
- -D <鏈名> <規則號碼|具體規則內容>:DELETE,刪除一條規則。
- 如:iptables -D INPUT 3 刪除filter表INPUT鏈中第三條規則,無論是啥東東。
- iptables -D INPUT -s 192.168.0.1 -j DROP 刪除filter表INPUT鏈中匹配「-s 192.168.0.1 -j DROP」規則,不論位置。
-
- -R <鏈名> <規則號碼> <具體規則內容>:REPLACE,替換一條規則
- 如:iptables -R INPUT 3 -j ACCEPT 替換filter表中INPUT鏈的第三條規則內容替換爲"-j ACCEPT"
-
- -P <鏈名> <動做>:POLICY,設置某個鏈的默認規則。
- 如:iptables -P INPUT DROP 設置filter表IPUT鏈的默認規則爲DROP,當數據包未被規則列表中的任何規則匹配到時,按此默認規則處理。*:此處是惟一的匹配動做前不加-j的狀況。
-
- -F [鏈名]:FLUSH,清空規則
- 如:iptables -F INPUT 清空filter表INPUT鏈的全部規則。
- iptables -t nat -F PREROUTING 清空nat表PREROUTING鏈中全部的規則。在設置了默認規則DROP後,使用-F必定要當心。
-
- -L [鏈名]:LIST,列出規則。
- v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數。
- x:在v的基礎上,禁止自動單位換算。(K,M)
- n:只顯示IP地址和端口號碼,不顯示域名和服務名稱。
- 如:iptables -L 粗略列出filter表全部鏈及全部規則。
- iptables -t nat -vnL 用詳細方式列出nat表的全部鏈和規則,只顯示IP地址和端口號
- iptables -t nat -vxnL PREROUTING 用詳細方式列出nat表的PREROUTING鏈的全部規則及詳細數字,不反解。
-
- 三、匹配條件
- 流入、流出接口(-i,-o)
- 來源、目的地址(-s,-d)
- 協議類型(-p)
- 來源、目的端口(--sport,--dport)
-
- (1)、按網絡接口匹配。
- 如:-i eth0 匹配是否從網絡接口eth0進來
- -o eth0 匹配是否從網絡接口eht0出去
-
- (2)、
- 匹配來源地址: -s [匹配來源地址] 來源地址能夠是IP,net,domain,也能夠爲空
- 如:-s 192.168.0.1 匹配來自192.168.0.1的數據包。
- -s 192.168.1.0/24 匹配來自192.168.1.0/24網絡的數據包。
- -s www.abc.com 匹配來自域名www.abc.com網絡的數據包。
- -d [匹配目的地址] 目的地址可使IP,NET,domain,也能夠爲空。
- 如:-d 202.131.78.220 匹配去往202.131.78.220的數據包。
- -d 202.131.0.0/16 匹配去往202.131.0.0/16網絡的數據包。
- -d www.abc.com 匹配去往域名www.abc.com的數據包。
-
- (3)、按協議類型匹配。
- -p <匹配協議類型> 協議類型能夠是tcp,udp,icmp等,也能夠爲空。
- 如:-p tcp
- -p udp
- -p icmp --icmp-type 類型
-
- (4)、按來源目的端口匹配。
- --sport <匹配源端口> 源端口能夠是個別端口,也能夠是端口範圍。
- 如:--sport 1000 匹配源端口是1000的數據包。
- --sport 1000:3000 匹配源端口是1000-3000的數據包(含1000,3000)
- --sport :3000 匹配源端口是3000如下的數據包(含3000)
- --sport 1000: 匹配源端口是1000以上的數據包(含1000)
- --dport <匹配目的端口> 目的端口能夠是個別端口,也能夠是端口範圍。
- 如:--dport 80 匹配目的端口是80的數據包
- --dport 6000:8000 匹配目的端口是6000-8000的數據包(包含6000-8000)
- --dport :3000 匹配目的端口是3000如下的數據包(含3000)
- --dport 1000: 匹配目的端口是1000以上的數據包(含1000)
- 注:--sport 和 --dport必須配合-p參數使用。
-
- 匹配應用舉例:
- -p udp --dport 53 匹配網絡中目的端口是53的udp協議數據包
- -s 10.1.0.0/24 -d 172.17.0.0/16 匹配來自10.1.0.0/24去往172.17.0.0/16的全部數據包
- -s 192.168.0.1 -d www.abc.com -p tcp --dport 80 匹配來自192.168.0.1,去往www.abc.com的80端口的tcp協議數據包。
- 條件越多,匹配越細緻,匹配範圍越小。
-
- 四、動做
- ACCEPT
- DROP
- SNAT
- DNAT
- MASQUERADE
-
- -j ACCEPT 經過,容許數據包經過本鏈而不攔截它。
- 如:iptables -A INPUT -j ACCEPT 容許全部訪問本機的IP數據包經過。相似cisco中ACL裏面的permit
-
- -j DROP 丟棄,阻止數據包經過本鏈而丟棄它。相似cisco中ACL裏面的deny
- 如:iptables -A FORWARD -s 192.168.80.39 -j DROP 阻止來源地址爲192.168.80.39的數據包經過本機。
-
- -j DNAT --to IP[-IP] [:端口-端口] (nat表的PREROUTING鏈) 目的地址轉換。DNAT支持轉換爲單IP,也支持轉換到IP地址池(一組連續的IP地址)
- 如:iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1 把從ppp0進來的藥訪問tcp/80的數據包目的地址轉爲192.168.0.1
- iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 -j DNAT --to 192.168.0.2:80
- iptables -t nat -A PREROUTING -i PPP0 -P tcp --dport 80 -j DNAT --to 192.168.0.1-192.168.0.10
-
- -j SNAT --to IP[-IP] [:端口-端口](nat表中的POSTROUTING鏈) 源地址轉換。SNAT支持轉換爲單IP,也支持轉換到IP地址池(一組練習的IP地址)
- 如:iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1 將內網192.168.0.0、24的源地址改成1.1.1.1,用於nat
- iptables -t nat -A POSTROUTING -S 192.168.0.0/24 -J SNAT --TO 1.1.1.1-1.1.1.10
-
- -j MASQUERADE 動態源地址轉換。(動態IP的狀況下使用)
- 如:iptables -t nat -A POSTROUTING -S 192.168.0.0/24 -j MASQUEREADE 將源地址是192.168.0.0/24的數據包進行地址假裝。
-
- 五、附加模塊。
- 按包狀態匹配。(state)
- 按來源mac匹配(mac)
- 按包速率匹配(limit)
- 多端口匹配(multiport)
-
- (1)、-m state --state 狀態
- 狀態:NEW、RELATED、ESTABLISHED、INVALID
- NEW:有別於tcp的syn
- ESTABLISHED:鏈接態。
- RELATED:衍生態,與conntrack關聯(ftp)
- INVALID:不能被識別屬於哪一個鏈接或沒有任何狀態。
- 如:iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-
- (2)、-m mac --mac-source MAC 匹配某個MAC地址
- 如:iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP 阻斷來自某MAC地址的數據包經過本機。
- 注:報文在通過路由後,數據包中原有的MAC信息會被替換,因此在路由後的iptables中使用mac模塊是沒有意義的。
-
- (3)、-m limit --limit 匹配速率 [--burst 緩衝數量] 用必定的速率去匹配數據包
- 如:iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50m/s -j ACCEPT
- iptables -A FORWARD -d 192.168.0.1 -j DROP
- 注:limit英語上看是限制的意思,但實際上只是按必定速率去匹配,要想限制的話後面要再跟一條DROP
-
- (4)、multiport
- -m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n] 一次性匹配多個端口,能夠匹分源端口,目的端口或不指定端口。
- 如:iptables -A INPUT -P tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT 匹配到達本機端口的21,22,25,80,110的數據包經過。 必須於-p參數一塊兒使用。