Linux Iptables 語法大全
Linux Iptables 語法還是比較重要的,讓我們來看看有些值得我們關注。
1. 對鏈的操作
建立一個新鏈 (-N)。
刪除一個空鏈 (-X)。
改變一個內建鏈的原則 (-P)。
列出一個鏈中的規則 (-L)。
清除一個鏈中的所有規則 (-F)。
歸零(zero) 一個鏈中所有規則的封包字節(byte) 記數器 (-Z)。
2. 對規則的操作
加入(append) 一個新規則到一個鏈 (-A)的最后。
在鏈內某個位置插入(insert) 一個新規則(-I),通常是插在最前面。
在鏈內某個位置替換(replace) 一條規則 (-R)。
在鏈內某個位置刪除(delete) 一條規則 (-D)。
刪除(delete) 鏈內第一條規則 (-D)。
3. 指定源地址和目的地址
通過--source/--src/-s來指定源地址(這里的/表示或者的意思,下同),通過--destination/--dst/-s來指定目的地址。可以使用以下四中方法來指定ip地址:
a. 使用完整的域名,如“www.linuxaid.com.cn”;
b. 使用ip地址,如“192.168.1.1”;
c. 用x.x.x.x/x.x.x.x指定一個網絡地址,如“192.168.1.0/255.255.255.0”;
d.
用x.x.x.x/x指定一個網絡地址,如“192.168.1.0/24”這里的24表明了子網掩碼的有效位數,這是
UNIX環境中通常使用的表示方法。
缺省的子網掩碼數是32,也就是說指定192.168.1.1等效于192.168.1.1/32。
4. 指定協議
可以通過--protocol/-p選項來指定協議,比如-p tcp。
5. 指定網絡接口將
可以使用--in-interface/-i或--out-interface/-o來指定網絡接口。需要注意的是,對于INPUT鏈來說,只可能有-i,也即只會有進入的包;通理,對于OUTPUT鏈來說,只可能有-o,也即只會有出去的包。只有FORWARD鏈既可以有-i的網絡接口,也可以有-o的網絡接口。我們也可以指定一個當前并不存在的網絡接口,比如ppp0,這時只有撥號成功后該規則才有效。
6. 指定ip碎片
在TCP/IP通訊過程中,每一個網絡接口都有一個最大傳輸單元(MTU),這個參數定義了可以通過的數據包的最大尺寸。如果一個數據包大于這個參數值時,系統會將其劃分成更小的數個數據包(稱之為ip碎片)來傳輸,而接收方則對這些ip碎片再進行重組以還原整個包。
但是再進行包過濾的時候,ip碎片會導致這樣一個問題:當系統將大數據包劃分成ip碎片傳送時,第一個碎片含有完整的包頭信息,但是后續的碎片只有包頭的部分信息,比如源地址,目的地址。因此假如我們有這樣一條規則:
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --dport 80 -j
ACCEPT
并且這時的FORWARD的策略(policy)為DROP時,系統只會讓第一個ip碎片通過,而丟掉其余的ip碎片,因為第一個碎片含有完整的包頭信息,可以滿足該規則的條件,而余下的碎片因為包頭信息不完整而無法滿足規則定義的條件,因而無法通過。
我們可以通過--fragment/-f選項來指定第二個及其以后的ip碎片,比如以上面的例子為例,我們可以再加上這樣一條規則來解決這個問題:
iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
但是需要注意的是,現在已經有好多進行ip碎片攻擊的實例(比如向Win98 NT4/SP5,6
Win2K發送大量的ip碎片進行DoS攻擊),因此允許ip碎片通過是有安全隱患的,對于這一點我們可以采用iptables的匹配擴展來進行限制,但是這又會影響服務質量,我們將在下面討論這個問題。
7. 指定非
可以在某些選項前加上!來表示非指定值,比如“-s -!
192.168.1.1/32”表示除了192.168.1.1以外的ip地址,“-p -!
tcp”表示除了tcp以外的協議。
#p#
8. TCP匹配擴展
通過使用--tcp-flags選項可以根據tcp包的標志位進行過濾,該選項后接兩個參數:第一個參數為要檢查的標志位,可以是SYN,ACK,FIN,RST,URG,PSH的組合,可以用ALL指定所有標志位;第二個參數是標志位值為1的標志。比如你要過濾掉所有SYN標志位為1的tcp包,可以使用以下規則:
iptables -A FORWARD -p tcp --tcp-flags ALL SYN -j DROP
選項--syn是以上的一種特殊情況,相當于“--tcp-flags SYN,RST,ACK SYN”的簡寫。
9. mac匹配擴展
可以使用-m選項來擴展匹配內容。使用--match mac/-m
mac匹配擴展可以用來檢查ip數據包的源mac地址。只要在--mac-source后面跟上mac地址就可以了。比如:
iptables -A FORWARD -m mac --mac-source 00:00:BA:A5:7D:12 -j DROP
需要注意的是一個ip包在經過路由器轉發后,其源mac地址已經變成了路由器的mac地址。
10. limit匹配擴展
limit擴展是一個非常有用的匹配擴展。使用-m nat 來指定,其后可以有兩個選項:
--limit avg:
指定單位時間內允許通過的數據包的個數。單位時間可以是/second、/minute、/hour、/day或使用第一個字母,比如5/second和5/s是一樣的,都是表示每秒可以通過5個數據包,缺省值是3/hour。
--limit-burst number:指定觸發事件的閥值,缺省值是5。
看起來好像有點復雜,就讓我們來看一個例子:
假設又如下的規則:
iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP
然后從另一部主機上ping這部主機,就會發生如下的現象:
首先我們可以看到前四個包的回應都很正常,然后從第五個包開始,我們每10秒可以收到一個正常的回應。這是因為我們設定了單位時間(在這里是每分鐘)內允許通過的數據包的個數是每分鐘6個,也即每10秒鐘一個;其次我們又設定了事件觸發閥值為5,所以我們的前四個包都是正常的,只是從第五個包開始,限制規則開始生效,故只能每10秒收到一個正常回應。
假設我們停止ping,30秒后又開始ping,這時的現象是:
前兩個包是正常的,從第三個包開始丟包,這是因為在這里我的允許一個包通過的周期是10秒,如果在一個周期內系統沒有收到符合條件的包,系統的觸發值就會恢復1,所以假如我們30秒內沒有符合條件的包通過,系統的觸發值就會恢復到3,假如5個周期內都沒有符合條件的包通過,系統都觸發值就會完全恢復。不知道你明白了沒有,歡迎你來信討論。
11. LOG目標擴展
netfilter缺省的目標(也就是一旦滿足規則所定義以后系統對數據包的處理方法)有:
ACEEPT:接收并轉發數據包
DORP:丟掉數據包
目標擴展模塊提供了擴展的目標。LOG目標提供了記錄數據包的功能。該目標擴展有以下幾個參數:
--log-level:指定記錄信息的級別,級別有debug、info、notice、warning、err、crit、alert、emerg分別對應7到0的數字。其含義請參看syslog.conf的man手冊。
--log-prefix:后接一個最長為30個字符的字符串,該字符串將出現在每一條日志的前面。
12. REJECT目標擴展
該目標擴展完全和DORP標準目標一樣,除了向發送方返回一個“port
unreachable”的icmp信息外。
還有其他一些擴展是常用的,如果你想了解可以參考Packet-Filtering-HOWTO。當然,最直接獲得幫助的辦法是查看iptables的在線幫助,比如想得到關于mac匹配擴展的幫助可以執行“iptables
-m mac -help”命令,想得到LOG目標擴展的幫助可以執行“iptables -j LOG
-help”命令。
通過文章,我們知道了十二條有用的Linux Iptables 語法,希望對大家有所幫助!
【編輯推薦】
- 用iptables做IP的靜態映射
- 如何把iptables外網端口全部映射到內網一臺主機上
- 配置Linux 內核并利用iptables 做端口映射
- iptables映射端口具體操作
- 用iptables做地址映射
- linux下清空所有iptables規則
- 如何清空其中一條iptables規則