原理簡介
安裝運行
特殊介紹
1.iptables的3個表:
filter: 顧名思義,用于過濾的時候
nat: 顧名思義,用于做NAT 的時候
manager:見下
2.iptables的5條鏈
INPUT: 匹配目的IP 是本機的數據包
OUPUT: 匹配源IP是本機的數據包
FORWARD: 匹配穿過本機的數據包
PREROUTING: 用于修改目的地址(DNAT)
POSTROUTING:用于修改源地址(SNAT)
3.manager簡介
這個表主要用來mangle數據包。我們可以改變不同的包及包頭的內容,比如 TTL,TOS或MARK。 注意MARK并沒有真正地改動數據包,
它只是在內核空間為包設了一個標記。防火墻內的其他的規則或程序(如tc)可以使用這種標記對包進行過濾或高級路由。這個表有五個內建的鏈:
PREROUTING,POSTROUTING,OUTPUT,INPUT和 FORWARD。
PREROUTING在包進入防火墻之后、路由判斷之前改變
包,POSTROUTING是在所有路由判斷之后。
OUTPUT在確定包的目的之前更改數據包。INPUT在包被路由到本地之后,但在用戶空間的程序看到它之前改變包。注意,mangle表不能做任何
NAT,它只是改變數據包的TTL,TOS或MARK,而不是其源目的地址。NAT是在nat表中操作的,以下是mangle表中僅有的幾種操作:
◆ TOS
◆ TTL
◆ MARK
TOS操作用來設置或改變數據包的服務類型域。這常用來設置網絡上的數據包如何被路由等策略。
注意這個操作并不完善,有時得不所愿。它在Internet上還不能使用,而且很多路由器不會注意到這個域值。換句話說,不要設置發往Internet的包,除非你打算依靠TOS來路由,比如用iproute2。
TTL操作用來改變數據包的生存時間域,我們可以讓所有數據包只有一個特殊的TTL。它的存在有一個很好的理由,那就是我們可以欺騙一些ISP。為什么要欺騙他們呢?因為他們不愿意讓我們共享 一個連接。
那些ISP會查找一臺單獨的計算機是否使用不同的TTL,并且以此作為判斷連接是否被共享的標志。
MARK用來給包設置特殊的標記。iproute2能識別這些標記,并根據不同的標記(或沒有標記) 決定不同的路由。用這些標記我們可以做帶寬限制和基于請求的分類。
語法概述
-t
-t 要操作的表
如果不加-t則用默認表filter
例如:
iptables -t nat
對nat表進行操作
-A
-A <鏈名> APPEND,追加一條規則(放到最后)
例如:
iptables -t filter -A INPUT -j DROP
在filter 表的INPUT 鏈里追加一條規則(作為最后一條規則)
匹配所有訪問本機IP 的數據包,匹配到的丟棄
-I
-I <鏈名> [規則號碼] INSERT,插入一條規則
例如:
iptables -I INPUT -j DROP
在filter 表的INPUT 鏈里插入一條規則(插入成第1 條)
iptables -I INPUT 3 -j DROP
在filter 表的INPUT 鏈里插入一條規則(插入成第3 條)
注意:
1、-t filter 可不寫,不寫則自動默認是filter 表
2、-I 鏈名[規則號碼],如果不寫規則號碼,則默認是1
3、確保規則號碼≤ (已有規則數+ 1),否則報錯
-D
-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”的規則(不管其位置在哪里)
注意:
1、若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條
2、按號碼匹配刪除時,確保規則號碼≤ 已有規則數,否則報錯
3、按內容匹配刪除時,確保規則存在,否則報錯
-R
-R <鏈名> <規則號碼> <具體規則內容> REPLACE,替換一條規則
例如:
iptables -R INPUT 3 -j ACCEPT
將原來編號為3 的規則內容替換為“-j ACCEPT”
注意:
確保規則號碼≤ 已有規則數,否則報錯
-P
-P <鏈名> <動作> POLICY,設置某個鏈的默認規則
例如:
iptables -P INPUT DROP
設置filter 表INPUT 鏈的默認規則是DROP
注意:
當數據包沒有被規則列表里的任何規則匹配到時,按此默認規則處理。動作前面不能加–j,這也是唯一一種匹配動作前面不加–j 的情況。
-F
-F [鏈名] FLUSH,清空規則
例如:
iptables -F INPUT
清空filter 表INPUT 鏈中的所有規則
iptables -t nat -F PREROUTING
清空nat 表PREROUTING 鏈中的所有規則
注意:
1、-F 僅僅是清空鏈中規則,并不影響-P 設置的默認規則
2、-P 設置了DROP 后,使用-F 一定要小心!!!
3、如果不寫鏈名,默認清空某表里所有鏈里的所有規則
-[vxn]L
-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
-i <匹配數據進入的網絡接口>
例如:
-i eth0
匹配是否從網絡接口eth0 進來
-i ppp0
匹配是否從網絡接口ppp0 進來
-o
-o 匹配數據流出的網絡接口
例如:
-o eth0
-o ppp0
-s
-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 192.168.0.0/16 匹配來自192.168.0.0/16 網絡的數據包
-d
-d <匹配目的地址>
可以是IP、NET、DOMAIN,也可以空
例如:
-d 202.106.0.20 匹配去往202.106.0.20 的數據包
-d 202.106.0.0/16 匹配去往202.106.0.0/16 網絡的數據包
-d www.abc.com 匹配去往域名www.abc.com 的數據包
-p
-p <匹配協議類型>
可以是TCP、UDP、ICMP 等,也可為空
例如:
-p tcp
-p udp
-p icmp --icmp-type 類型
ping: type 8 pong: type 0
--sport
--sport <匹配源端口>
可以是個別端口,可以是端口范圍
例如:
--sport 1000 匹配源端口是1000 的數據包
--sport 1000:3000 匹配源端口是1000-3000 的數據包(含1000、3000)
--sport :3000 匹配源端口是3000 以下的數據包(含3000)
--sport 1000: 匹配源端口是1000 以上的數據包(含1000)
注意:--dport 必須配合-p 參數使用
--dport
--dport <匹配目的端口>
可以是個別端口,可以是端口范圍
例如:
--dport 80 匹配目的端口是80 的數據包
--dport 6000:8000 匹配目的端口是6000-8000 的數據包(含6000、8000)
--dport :3000 匹配目的端口是3000 以下的數據包(含3000)
--dport 1000: 匹配目的端口是1000 以上的數據包(含1000)
注意:--dport 必須配合-p 參數使用
動作(處理方式)
ACCEPT
-j ACCEPT
通過,允許數據包通過本鏈而不攔截它,類似Cisco 中ACL 里面的permit
例如:
iptables -A INPUT -j ACCEPT
允許所有訪問本機IP 的數據包通過
DORP
-j DROP
丟棄,阻止數據包通過本鏈而丟棄它,類似Cisco 中ACL 里的deny
例如:
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止來源地址為192.168.80.39 的數據包通過本機
DNAT
-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
SNAT
-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
同上,只不過修改成一個地址池里的IP
MASQUERADE
-j MASQUERADE 動態源地址轉換(動態IP 的情況下使用)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
將源地址是192.168.0.0/24 的數據包進行地址偽裝
附加模塊
state
-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
mac
-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 模塊是沒有意義的
limit
-m limit --limit 匹配速率[--burst 緩沖數量]用一定速率去匹配數據包
例如:
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
注意:
limit 英語上看是限制的意思,但實際上只是按一定速率去匹配而已,要想限制的話后面要再跟一條DROP
multiport
-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]一次性匹配多個端口,可以區分源端口,目的端口或不指定端口
例如:
iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
注意:
必須與-p 參數一起使用