iptables規則基本文法
iptables [-t table] option argu
table: 可選4表其中之一,raw,mangle,nat,filter,不指定預設為filter表
option:根據對規則的不同操作,可分為-N,-X,-E,-P,-F,-L,-Z,-A等
argu:根據選擇的option的不同,所對應的參數也不同,下面會具體講解
iptables規則詳細解析
建立一條自定義的空規則鍊
iptables [-t table] -N chain_name
删除一條自定義的空規則鍊
iptables [-t table] -X [chain_name]
注: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開始計數
詳細顯示格式圖解
<a href="http://s3.51cto.com/wyfs02/M00/23/73/wKioL1M2hZyQRbeoAARvFi6dnYQ949.jpg" target="_blank"></a>
注:一般顯示格式可簡寫為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]:比對目标端口
注: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:傳回調用鍊,一般用于自定義鍊的末尾規則
本文轉自 xxrenzhe11 51CTO部落格,原文連結:http://blog.51cto.com/xxrenzhe/1386614,如需轉載請自行聯系原作者