iptables 指令
語(yǔ)法:
iptables?[-t?table]?command?[match]?[-j?target/jump]
-t?參數(shù)用來(lái)指定規(guī)則表,內(nèi)建的規(guī)則表有三個(gè),分別是:nat、mangle?和?filter,
當(dāng)未指定規(guī)則表時(shí),則一律視為是?filter。
各個(gè)規(guī)則表的功能如下:
nat?此規(guī)則表?yè)碛?Prerouting?和?postrouting?兩個(gè)規(guī)則鏈,主要功能為進(jìn)行一對(duì)一、一對(duì)多、多對(duì)多等網(wǎng)址轉(zhuǎn)譯工作(SNATDNAT),由于轉(zhuǎn)譯工作的特性,需進(jìn)行目的地網(wǎng)址轉(zhuǎn)譯的封包,就不需要進(jìn)行來(lái)源網(wǎng)址轉(zhuǎn)譯,反之亦然,因此為了提升改寫(xiě)封包的率,在防火墻運(yùn)作時(shí),每個(gè)封包只會(huì)經(jīng)過(guò)這個(gè)規(guī)則表一次。如果我們把封包過(guò)濾的規(guī)則定義在這個(gè)數(shù)據(jù)表里,將會(huì)造成無(wú)法對(duì)同一包進(jìn)行多次比對(duì),因此這個(gè)規(guī)則表除了作網(wǎng)址轉(zhuǎn)譯外,請(qǐng)不要做其它用途。
mangle?此規(guī)則表?yè)碛?Prerouting、FORWARD?和?postrouting?三個(gè)規(guī)則鏈。除了進(jìn)行網(wǎng)址轉(zhuǎn)譯工作會(huì)改寫(xiě)封包外,在某些特殊應(yīng)用可能也必須去改寫(xiě)封包(TTL、TOS)或者是設(shè)定?MARK(將封包作記號(hào),以進(jìn)行后續(xù)的過(guò)濾),這時(shí)就必須將這些工作定義在?mangle?規(guī)則表中,由于使用率不高,我們不打算在這里討論?mangle?的用法。
filter?這個(gè)規(guī)則表是預(yù)設(shè)規(guī)則表,擁有INPUT、FORWARD?和?OUTPUT三個(gè)規(guī)則鏈,這個(gè)規(guī)則表顧名思義是用來(lái)進(jìn)行封包過(guò)濾的理動(dòng)作(例如:DROP、?LOG、?ACCEPT?或?REJECT),我們會(huì)將基本規(guī)則都建立在此規(guī)則表中。
主要包含::命令表用來(lái)增加(-A、-I)刪除(-D)修改(-R)查看(-L)規(guī)則等;
常用參數(shù)用來(lái)指定協(xié)議(-p)、源地址(-s)、源端口(--sport)、目的地址(-d)、目的端口(--dport)、
進(jìn)入網(wǎng)卡(-i)、出去網(wǎng)卡(-o)等設(shè)定包信息(即什么樣的包);
用來(lái)描述要處理包的信息。
常用處理動(dòng)作用?? -j???來(lái)指定對(duì)包的處理(ACCEPT、DROP、REJECT、REDIRECT等)。
1、常用命令列表:??常用命令(-A追加規(guī)則、-D刪除規(guī)則、-R修改規(guī)則、-I插入規(guī)則、-L查看規(guī)則)
命令-A,--append
范例?iptables?-A?INPUT?...
說(shuō)明新增規(guī)則(追加方式)到某個(gè)規(guī)則鏈(這里是INPUT規(guī)則鏈)中,該規(guī)則將會(huì)成為規(guī)則鏈中的最后一條規(guī)則。
命令-D,--delete
范例?iptables?-D?INPUT?--dport?80?-j?DROP
iptables?-D?INPUT?1
說(shuō)明?從某個(gè)規(guī)則鏈中刪除一條規(guī)則,可以輸入完整規(guī)則,或直接指定規(guī)則編號(hào)加以刪除。
命令-R,?--replace
范例?iptables?-R?INPUT1-s?192.168.0.1?-j?DROP
說(shuō)明取代現(xiàn)行規(guī)則,規(guī)則被取代后并不會(huì)改變順序。(1是位置)
命令-I,--insert
范例?iptables?-I?INPUT1--dport?80?-j?ACCEPT
說(shuō)明插入一條規(guī)則,原本該位置(這里是位置1)上的規(guī)則將會(huì)往后移動(dòng)一個(gè)順位。
命令-L,?--list
范例?iptables?-L?INPUT
說(shuō)明?列出某規(guī)則鏈中的所有規(guī)則。
命令-F,?--flush
范例?iptables?-F?INPUT
說(shuō)明?刪除某規(guī)則鏈(這里是INPUT規(guī)則鏈)中的所有規(guī)則。
命令-Z,--zero
范例?iptables?-Z?INPUT
說(shuō)明?將封包計(jì)數(shù)器歸零。封包計(jì)數(shù)器是用來(lái)計(jì)算同一封包出現(xiàn)次數(shù),是過(guò)濾阻斷式攻擊不可或缺的工具。
命令-N,?--new-chain
范例?iptables?-N?allowed
說(shuō)明?定義新的規(guī)則鏈。
命令-X,?--delete-chain
范例?iptables?-X?allowed
說(shuō)明?刪除某個(gè)規(guī)則鏈。
命令-P,?--policy
范例?iptables?-P?INPUT?DROP
說(shuō)明?定義過(guò)濾政策。?也就是未符合過(guò)濾條件之封包,預(yù)設(shè)的處理方式。
命令-E,--rename-chain
范例?iptables?-E?allowed?disallowed
說(shuō)明?修改某自訂規(guī)則鏈的名稱(chēng)。
2、常用封包比對(duì)參數(shù):(-p協(xié)議、-s源地址、-d目的地址、--sport源端口、--dport目的端口、-i進(jìn)入網(wǎng)卡、-o?出去網(wǎng)卡)
參數(shù)-p,?--protocol(指定協(xié)議)
范例?iptables?-A?INPUT?-p?tcp(指定協(xié)議)????? -p all?? 所有協(xié)議,? -p !tcp 去除tcp外的所有協(xié)議。
說(shuō)明?比對(duì)通訊協(xié)議類(lèi)型是否相符,可以使用?!?運(yùn)算子進(jìn)行反向比對(duì),例如:-p?!?tcp?,
意思是指除?tcp?以外的其它類(lèi)型,包含udp、icmp?...等。如果要比對(duì)所有類(lèi)型,則可以使用?all?關(guān)鍵詞,例如:-p?all。
參數(shù)-s,?--src,?--source(指定源地址,指定源端口--sport)
例如:?iptables?-A?INPUT?-s?192.168.1.1
說(shuō)明?用來(lái)比對(duì)封包的來(lái)源?IP,可以比對(duì)單機(jī)或網(wǎng)絡(luò),比對(duì)網(wǎng)絡(luò)時(shí)請(qǐng)用數(shù)字來(lái)表示屏蔽,
例如:-s?192.168.0.0/24,比對(duì)?IP?時(shí)可以使用?!?運(yùn)算子進(jìn)行反向比對(duì),
例如:-s?!?192.168.0.0/24。
參數(shù)-d,?--dst,?--destination(指定目的地址,指定目的端口--dport)
例如:?iptables?-A?INPUT?-d?192.168.1.1
說(shuō)明?用來(lái)比對(duì)封包的目的地?IP,設(shè)定方式同上。
參數(shù)-i,?--in-interface(指定入口網(wǎng)卡)????? -i? eth+?? 所有網(wǎng)卡
例如:?iptables?-A?INPUT?-i?eth0
說(shuō)明?用來(lái)比對(duì)封包是從哪片網(wǎng)卡進(jìn)入,可以使用通配字符?+?來(lái)做大范圍比對(duì),
例如:-i?eth+?表示所有的?ethernet?網(wǎng)卡,也以使用?!?運(yùn)算子進(jìn)行反向比對(duì),
例如:-i?!?eth0。
參數(shù)-o,?--out-interface(指定出口網(wǎng)卡)
例如:?iptables?-A?FORWARD?-o?eth0
說(shuō)明?用來(lái)比對(duì)封包要從哪片網(wǎng)卡送出,設(shè)定方式同上。
參數(shù)--sport,?--source-port(源端口)
例如:?iptables?-A?INPUT?-p?tcp?--sport?22
說(shuō)明?用來(lái)比對(duì)封包的來(lái)源端口號(hào),可以比對(duì)單一埠,或是一個(gè)范圍,
例如:--sport?22:80,表示從?22?到?80?端口之間都算是符合件,
如果要比對(duì)不連續(xù)的多個(gè)埠,則必須使用--multiport?參數(shù),詳見(jiàn)后文。比對(duì)埠號(hào)時(shí),可以使用?!?運(yùn)算子進(jìn)行反向比對(duì)。
參數(shù)--dport,?--destination-port(目的端口)
例如:?iptables?-A?INPUT?-p?tcp?--dport?22
說(shuō)明?用來(lái)比對(duì)封包的目的端口號(hào),設(shè)定方式同上。
參數(shù)--tcp-flags(只過(guò)濾TCP中的一些包,比如SYN包,ACK包,F(xiàn)IN包,RST包等等)
例如:?iptables?-p?tcp?--tcp-flags?SYN,FIN,ACK?SYN
說(shuō)明? 比對(duì)?TCP?封包的狀態(tài)旗號(hào),參數(shù)分為兩個(gè)部分,第一個(gè)部分列舉出想比對(duì)的旗號(hào),
第二部分則列舉前述旗號(hào)中哪些有被設(shè),未被列舉的旗號(hào)必須是空的。TCP?狀態(tài)旗號(hào)包括:SYN(同步)、ACK(應(yīng)答)、
FIN(結(jié)束)、RST(重設(shè))、URG(緊急)PSH(強(qiáng)迫推送)?等均可使用于參數(shù)中,除此之外還可以使用關(guān)鍵詞?ALL?和
NONE?進(jìn)行比對(duì)。比對(duì)旗號(hào)時(shí),可以使用?!?運(yùn)算子行反向比對(duì)。
參數(shù)--syn
例如:?iptables?-p?tcp?--syn
說(shuō)明?用來(lái)比對(duì)是否為要求聯(lián)機(jī)之?TCP?封包,與?iptables?-p?tcp?--tcp-flags?SYN,
FIN,ACK?SYN?的作用完全相同,如果使用?!運(yùn)算子,可用來(lái)比對(duì)非要求聯(lián)機(jī)封包。
參數(shù)-m?multiport?--source-port
例如:?iptables?-A?INPUT?-p?tcp?-m?multiport?--source-port?22,53,80,110
說(shuō)明?用來(lái)比對(duì)不連續(xù)的多個(gè)來(lái)源埠號(hào),一次最多可以比對(duì)?15?個(gè)埠,可以使用?!
運(yùn)算子進(jìn)行反向比對(duì)。
參數(shù)-m?multiport?--destination-port
例如:?iptables?-A?INPUT?-p?tcp?-m?multiport?--destination-port?22,53,80,110
說(shuō)明?用來(lái)比對(duì)不連續(xù)的多個(gè)目的地埠號(hào),設(shè)定方式同上。
參數(shù)-m?multiport?--port
例如:?iptables?-A?INPUT?-p?tcp?-m?multiport?--port?22,53,80,110
說(shuō)明?這個(gè)參數(shù)比較特殊,用來(lái)比對(duì)來(lái)源埠號(hào)和目的埠號(hào)相同的封包,設(shè)定方式同上。
注意:在本范例中,如果來(lái)源端口號(hào)為?80目的地埠號(hào)為?110,這種封包并不算符合條件。
參數(shù)--icmp-type
例如:?iptables?-A?INPUT?-p?icmp?--icmp-type?8
說(shuō)明?用來(lái)比對(duì)?ICMP?的類(lèi)型編號(hào),可以使用代碼或數(shù)字編號(hào)來(lái)進(jìn)行比對(duì)。
請(qǐng)打?iptables?-p?icmp?--help?來(lái)查看有哪些代碼可用。
參數(shù)-m?limit?--limit
例如:?iptables?-A?INPUT?-m?limit?--limit?3/hour
說(shuō)明?用來(lái)比對(duì)某段時(shí)間內(nèi)封包的平均流量,上面的例子是用來(lái)比對(duì):每小時(shí)平均流量是
否超過(guò)一次?3?個(gè)封包。?除了每小時(shí)平均次外,也可以每秒鐘、每分鐘或每天平均一次,
默認(rèn)值為每小時(shí)平均一次,參數(shù)如后:?/second、?/minute、/day。?除了進(jìn)行封數(shù)量的
比對(duì)外,設(shè)定這個(gè)參數(shù)也會(huì)在條件達(dá)成時(shí),暫停封包的比對(duì)動(dòng)作,以避免因駭客使用洪水
攻擊法,導(dǎo)致服務(wù)被阻斷。
參數(shù)--limit-burst
范例?iptables?-A?INPUT?-m?limit?--limit-burst?5
說(shuō)明?用來(lái)比對(duì)瞬間大量封包的數(shù)量,上面的例子是用來(lái)比對(duì)一次同時(shí)涌入的封包是否超
過(guò)?5?個(gè)(這是默認(rèn)值),超過(guò)此上限的封將被直接丟棄。使用效果同上。
參數(shù)-m?mac?--mac-source
范例?iptables?-A?INPUT?-m?mac?--mac-source?00:00:00:00:00:01
說(shuō)明?用來(lái)比對(duì)封包來(lái)源網(wǎng)絡(luò)接口的硬件地址,這個(gè)參數(shù)不能用在?OUTPUT?和?Postrouting規(guī)則煉上,這是因?yàn)榉獍统龅骄W(wǎng)后,才能由網(wǎng)卡驅(qū)動(dòng)程序透過(guò)?ARP?通訊協(xié)議查出目的地的?MAC?地址,所以?iptables?在進(jìn)行封包比對(duì)時(shí),并不知道封包會(huì)送到個(gè)網(wǎng)絡(luò)接口去。
參數(shù)--mark
范例?iptables?-t?mangle?-A?INPUT?-m?mark?--mark?1
說(shuō)明?用來(lái)比對(duì)封包是否被表示某個(gè)號(hào)碼,當(dāng)封包被比對(duì)成功時(shí),我們可以透過(guò)?MARK?處理動(dòng)作,將該封包標(biāo)示一個(gè)號(hào)碼,號(hào)碼最不可以超過(guò)?4294967296。
參數(shù)-m?owner?--uid-owner
范例?iptables?-A?OUTPUT?-m?owner?--uid-owner?500
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定使用者所產(chǎn)生的,這樣可以避免服務(wù)器使用
root?或其它身分將敏感數(shù)據(jù)傳送出,可以降低系統(tǒng)被駭?shù)膿p失??上н@個(gè)功能無(wú)法比對(duì)出
來(lái)自其它主機(jī)的封包。
參數(shù)-m?owner?--gid-owner
范例?iptables?-A?OUTPUT?-m?owner?--gid-owner?0
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定使用者群組所產(chǎn)生的,使用時(shí)機(jī)同上。
參數(shù)-m?owner?--pid-owner
范例?iptables?-A?OUTPUT?-m?owner?--pid-owner?78
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定行程所產(chǎn)生的,使用時(shí)機(jī)同上。
參數(shù)-m?owner?--sid-owner
范例?iptables?-A?OUTPUT?-m?owner?--sid-owner?100
說(shuō)明?用來(lái)比對(duì)來(lái)自本機(jī)的封包,是否為某特定聯(lián)機(jī)(Session?ID)的響應(yīng)封包,使用時(shí)
機(jī)同上。
參數(shù)-m?state?--state
范例?iptables?-A?INPUT?-m?state?--state?RELATED,ESTABLISHED
說(shuō)明?用來(lái)比對(duì)聯(lián)機(jī)狀態(tài),聯(lián)機(jī)狀態(tài)共有四種:INVALID、ESTABLISHED、NEW?和?RELATED。
INVALID?表示該封包的聯(lián)機(jī)編號(hào)(Session?ID)無(wú)法辨識(shí)或編號(hào)不正確。
ESTABLISHED?表示該封包屬于某個(gè)已經(jīng)建立的聯(lián)機(jī)。
NEW?表示該封包想要起始一個(gè)聯(lián)機(jī)(重設(shè)聯(lián)機(jī)或?qū)⒙?lián)機(jī)重導(dǎo)向)。
RELATED?表示該封包是屬于某個(gè)已經(jīng)建立的聯(lián)機(jī),所建立的新聯(lián)機(jī)。例如:FTP-DATA?聯(lián)機(jī)必定是源自某個(gè)?FTP?聯(lián)機(jī)。
3、常用的處理動(dòng)作:?(-j??指定對(duì)滿(mǎn)足條件包的處理,常用動(dòng)作有ACCEPT接受報(bào)、DROP丟棄報(bào)、REJECT丟棄報(bào)并通知對(duì)方、REDIRECT重定向包等)
-j?? 參數(shù)用來(lái)指定要進(jìn)行的處理動(dòng)作,常用的處理動(dòng)作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分別說(shuō)明如下:
ACCEPT將封包放行,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接跳往下一個(gè)規(guī)則鏈(natostrouting)。
REJECT攔阻該封包,并傳送封包通知對(duì)方,可以傳送的封包有幾個(gè)選擇:ICMP?port-unreachable、ICMP?echo-reply?或是?tcp-reset(這個(gè)封包會(huì)要求對(duì)方關(guān)閉聯(lián)機(jī)),進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。
例如:iptables?-A?FORWARD?-p?TCP?--dport?22?-j?REJECT--reject-with?tcp-reset
DROP丟棄封包不予處理,進(jìn)行完此處理動(dòng)作后,將不再比對(duì)其它規(guī)則,直接中斷過(guò)濾程序。
REDIRECT將封包重新導(dǎo)向到另一個(gè)端口(PNAT),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。
這個(gè)功能可以用來(lái)實(shí)作通透式porxy?或用來(lái)保護(hù)?web?服務(wù)器。
例如:iptables?-tnat-A?PREROUTING?-p?tcp?--dport?80?-j?REDIRECT--to-ports?8080
MASQUERADE改寫(xiě)封包來(lái)源?IP?為防火墻?NIC?IP,可以指定?port?對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,直接跳往下一個(gè)規(guī)則(mangleostrouting)。這個(gè)功能與?SNAT?略有不同,當(dāng)進(jìn)行?IP?偽裝時(shí),不需指定要偽裝成哪個(gè)?IP,IP?會(huì)從網(wǎng)卡直接讀,當(dāng)使用撥接連線時(shí),IP?通常是由?ISP?公司的?DHCP?服務(wù)器指派的,這個(gè)時(shí)候?MASQUERADE?特別有用。
例如:iptables?-tnat-A?POSTROUTING?-p?TCP?-j?MASQUERADE?--to-ports?1024-31000
LOG將封包相關(guān)訊息紀(jì)錄在?/var/log?中,詳細(xì)位置請(qǐng)查閱?/etc/syslog.conf?組態(tài)檔,進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其規(guī)則。
例如:iptables?-A?INPUT?-p?tcp?-j?LOG?--log-prefix?"INPUT?packets"
SNAT改寫(xiě)封包來(lái)源IP?為某特定?IP?或?IP?范圍,可以指定?port?對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將直接跳往下一個(gè)規(guī)則(mangleostrouting)。
例如:iptables?-tnat-A?POSTROUTING?-p?tcp-o?eth0?-j?SNAT--to-source194.236.50.155-194.236.50.160:1024-32000
DNAT改寫(xiě)封包目的地IP?為某特定?IP?或?IP?范圍,可以指定?port?對(duì)應(yīng)的范圍,進(jìn)行完此處理動(dòng)作后,將會(huì)直接跳往下一個(gè)規(guī)煉(filter:input?或?filter:forward)。
例如:iptables?-tnat-A?PREROUTING?-p?tcp?-d?15.45.23.67?--dport?80?-j?DNAT--to-destination?192.168.1.1-192.168.1.10:80-100
MIRROR鏡射封包,也就是將來(lái)源?IP?與目的地?IP?對(duì)調(diào)后,將封包送回,進(jìn)行完此處理動(dòng)作后,將會(huì)中斷過(guò)濾程序。
QUEUE中斷過(guò)濾程序,將封包放入隊(duì)列,交給其它程序處理。透過(guò)自行開(kāi)發(fā)的處理程序,可以進(jìn)行其它應(yīng)用,
例如:計(jì)算聯(lián)機(jī)費(fèi)......等。
RETURN結(jié)束在目前規(guī)則煉中的過(guò)濾程序,返回主規(guī)則煉繼續(xù)過(guò)濾,如果把自訂規(guī)則煉看成是一個(gè)子程序,那么這個(gè)動(dòng)作,就相當(dāng)提早結(jié)束子程序并返回到主程序中。
MARK將封包標(biāo)上某個(gè)代號(hào),以便提供作為后續(xù)過(guò)濾的條件判斷依據(jù),進(jìn)行完此處理動(dòng)作后,將會(huì)繼續(xù)比對(duì)其它規(guī)則。
例如:iptables?-t?mangle?-A?PREROUTING?-p?tcp?--dport?22?-j?MARK?--set-mark?2
四.拓展模塊
1.按來(lái)源MAC地址匹配
# iptables -t filter -A FORWARD-m --mac-source 00:02:b2:03:a5:f6-j DROP
拒絕轉(zhuǎn)發(fā)來(lái)自該MAC地址的數(shù)據(jù)包
2.按多端口或連續(xù)端口匹配
20:表示20以后的所有端口
20:100表示20到100的端口
:20表示20之前的所有端口
-m multiport [--prots, --sports,--dports]
例子:
# iptables -A INPUT -p tcp -m multiport --dports 21,20,25,53,80 -j ACCEPT 【多端口匹配】
#?iptables -A INPUT -p tcp --dport 20: -j ACCEPT
# iptables -A INPUT -p tcp --sport 20:80 -j ACCEPT
# iptables -A INPUT -p tcp --sport :80 -j ACCEPT
3.還可以按數(shù)據(jù)包速率和狀態(tài)匹配
-m limit --limit匹配速率 如: -m limit --limit 50/s -j ACCEPT
-m state --state 狀態(tài) 如: -m state --state INVALID,RELATED -j ACCEPT
4.還可以限制鏈接數(shù)
-m connlimit?--connlimit-above n 限制為多少個(gè)
例如:
iptables -I FORWARD -p tcp -m connlimit --connlimit-above 9 -j DROP ? ? ? ?//表示限制鏈接數(shù)最大為9個(gè)
5、模擬隨機(jī)丟包率
iptables -A FORWARD -p icmp -m statistic --mode random --probability 0.31 ?-j REJECT ? //表示31%的丟包率
或者
-m random --average 5 -j DROP 表示模擬丟掉5%比例的包
相關(guān)知識(shí):
Linux 中延時(shí)模擬
設(shè)置延時(shí) 3s :
tc qdisc add dev eth0 root netem delay 3000ms
可以在 3000ms 后面在加上一個(gè)延時(shí),比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延時(shí)范圍 2800 – 3200 之間.
結(jié)果顯示如下
Linux 中丟包模擬
設(shè)置丟包 50% ,iptables 也可以模擬這個(gè),但一下不記的命令了,下次放上來(lái):
tc qdisc change dev eth0 root netem loss50%
上面的設(shè)丟包,如果給后面的 50% 的丟包比率修改成 ’50% 80%’ 時(shí),這時(shí)和上面的延時(shí)不一樣,這是指丟包比率為 50-80% 之間。