iptables規則基本語法前端
iptables [-t table] option argulinux
table: 可選4表其中之一,raw,mangle,nat,filter,不指定默認爲filter表算法
option:根據對規則的不一樣操做,可分爲-N,-X,-E,-P,-F,-L,-Z,-A等服務器
argu:根據選擇的option的不一樣,所對應的參數也不一樣,下面會具體講解網絡
iptables規則詳細解析併發
建立一條自定義的空規則鏈tcp
iptables [-t table] -N chain_nameide
刪除一條自定義的空規則鏈編碼
iptables [-t table] -X [chain_name]spa
注:5大內置的主鏈不可刪除;不指定鏈名,則會刪除指定表中非內置的全部空鏈
修改自定義鏈名
iptables [-t table] -E old-chain-name new-chain-name
爲鏈指定默認策略
iptables [-t table] -P chain_name target
注:target是ACCEPT或DROP
對鏈中的規則進行清空操做
iptables [-t table] -F [chain_name]
注:清空指定鏈中的全部規則;無chain_name參數時,則清空指定表中全部鏈的規則
對鏈中的規則進行顯示操做
iptables [-t table] -L [chain_name [rulenum]] [options...]
注:顯示指定鏈中的規則;通常都不指定chain_name參數,則會顯示指定表中全部鏈的規則
配合options使用,能夠得到更加詳細的信息,如
-n:數字格式顯示IP和PORT
-v:以詳細格式顯示
-vv,-vvv:以更加詳細的格式顯示
-x:顯示精確值(如bytes的值),不執行單位換算
--line-numbers:顯示各規則的編號,鏈中的規則依據編號順序執行,編號爲正整數並從1開始計數
詳細顯示格式圖解
注:通常顯示格式可簡寫爲iptables -L -nv或iptables -nvL
對鏈中的規則進行計數器(如上圖中的pkts或bytes參數)清零操做
iptables [-t table] -Z [chain_name [rulenum]]
注:可指定對鏈中的某一條規則計數器清零;也可不指定鏈名,則直接清零表中全部鏈的規則計數器
刪除指定規則
iptables [-t table] -D chain_name rulenum
iptables [-t table] -D chain_name rule-specification
注:指定規則編號或規則的詳細信息,通常都使用第一種,指定規則編號rulenum便可
顯示指定鏈上的規則添加命令
iptables [-t table] -S [chain_name [rulenum]]
注:顯示的是當初添加規則時使用的iptables命令,而非-L的顯示格式;不指定鏈名,則顯示指定表下全部鏈下規則的添加命令
插入規則
iptables [-t table] -I chain_name [rulenum] rule-specification
注:可指定規則編號,已將新的規則插入指定位置;若不指定規則編號,則新規則的編號將默認爲1
修改規則
iptables [-t table] -R chain_name rulenum rule-specification
注:指定需修改規則的編號便可,rule-specification指定修改後的規則內容
附加規則
iptables [-t table] -A chain_name rule-specification
注:本命令是在指定鏈下規則隊列的最後附加規則;若要指定規則添加的位置,則需使用插入命令-I
而規則的具體信息在於rule-specification的格式,詳解以下
rule-specification規則說明
rule-specification=匹配條件 -j 處理機制
匹配條件:
通用匹配
-s:匹配源地址(單IP地址或者網絡地址),等同於--src,--source
-d:匹配目標地址(單IP地址或者網絡地址),等同於--dst,--destination
-p:匹配協議,一般使用{tcp | udp | icmp}其中之一
-i:匹配數據報文流入接口,如eth0
-o:匹配數據報文流出接口,如eth1
擴展匹配
隱含擴展匹配:使用-p {tcp | udp | icmp}後,自動可以對協議進行的擴展
-p tcp:
--dport m[-n]:匹配目標端口,m表示單個端口,如80,m-n表示連續多個端口,如20-25
--sport m[-n]:匹配源端口
--tcp-flags rst,syn,ack,fin syn:匹配TCP Header中6個符號位(URG,ACK,PSH,RST,SYN,FIN)的值,第一組顯示需匹配的符號位(此例中爲rst,syn,ack,fin),第二組顯示值爲1的符號位(此例中爲syn),其它都爲0
-p udp:
--dport m[-n]:匹配目標端口
--sport m[-n]:匹配源端口
注:UDP是無狀態的協議,故無符號位flags的匹配
-p icmp:
--icmp-type:匹配icmp報文的類型,通常使用8表明PING請求,使用0表明PING應答
顯示擴展匹配:必需要明確指定擴展的模塊,格式爲:-m 擴展模塊名稱 --選項1 --選項2 ...
multiport模塊:多端口匹配,一次指定多個離散端口
--dports:目的端口匹配,等同於--destination-ports,如 --dports 53,80
--sports:源端口匹配,等同於--source-ports
注:離散端口和端口範圍可混用,如 --sports 23,80-100 ,但端口個數最好不要超過15個,端口範圍計數爲2個端口
iprange模塊:IP地址範圍匹配
--dst-range from[-to]:目標地址匹配,如 --dst-range 192.168.100.10-192.168.100.20
--src-range from[-to]:源地址匹配
time模塊:時間範圍匹配
--datestart,--datestop:日期時間匹配,日期時間格式爲YYYY[-MM[-D[Thh[:mm[:ss]]]]],如--datestart 2014-03-29T12:05:00 --datestop 2014-03-30T08:00:00
--timestart,--timestop:僅時間匹配,時間格式爲hh:mm[:ss],如 --timestart 14:05:00 --timestop 18:00:00
--weekdays day[,day...]:星期匹配,可以使用Mon,Tue,Web,Thu,Fri,Sat,Sun表示星期,或用1-7表示,如--weekdays 1,2,3,4,5
string模塊:字符串匹配(需linux kernel >= 2.6.14)
--algo {bm|kmp} --string pattern:先制定匹配算法bm或kmp,而後制定匹配模式,如 --algo bm --string hello,表示匹配帶有hello字符串的報文
--algo {bm|kmp} --hex-string pattern:先將匹配模式編碼成十六進制格式,再跟報文中的數據進行匹配,可提升匹配速度
connlimit模塊:鏈接數限制匹配
--connlimit-above:單IP對指定服務的最大併發鏈接數,如 --connlimit-above 5
limit模塊:報文傳輸速率限制(利用令牌桶token bucket原理)
--limit #[/second | /minute | /hour | /day]:如 --limit 5/s,默認是3/hour
--limit-burst:初始峯值
state模塊:鏈接狀態匹配
鏈接狀態追蹤原理:
在內存中維護一張會話表,記錄進入的鏈接,並賦予每一個鏈接條目一個計數器(即超時時間),當計數器爲0時,清除出此會話表;
當有新鏈接到來,對比此會話表,會話中無記錄時,則此鏈接狀態爲NEW,不然爲ESTABLISHED狀態;
若進來的新鏈接與已創建的鏈接有關聯,如FTP中的數據鏈接對於命令鏈接來講,則此鏈接狀態爲RELATED
鏈接追蹤功能涉及的內核模塊:ip_conntrack和nf_conntrack
鏈接狀態主要類型:NEW,ESTABLISHED,RELATED,INVALID
state模塊用法:--state {NEW|ESTABLISHED|RELATED|INVALID}
鏈接狀態過濾法則:
對於進入的狀態爲ESTABLISHED和RELATED的鏈接都應該放行
對於出去的狀態爲ESTABLISHED的鏈接都應該放行
嚴格檢查進入的狀態爲NEW的鏈接
全部狀態爲INVALID的鏈接都應該拒絕
注:因iptables的state模塊對於進出的報文都進行嚴格的狀態匹配,很是消耗系統資源,故在繁忙的前端服務器(如反向代理服務器)上,勿開啓此功能!
取反匹配:
以上介紹的匹配條件,大部分均可以在匹配條件前加 ! 號,以表示匹配條件取反,格式是:! 匹配條件,注意感嘆號後的空格
處理機制:
ACCEPT:報文接受
DROP:報文丟棄
自定義鏈名:調用自定義鏈,如 -j clean_in
RETURN:返回調用鏈,通常用於自定義鏈的末尾規則