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