如果對iptables相關(guān)概念不甚了解,請查看前一篇博文。
一、命令部分
#命令格式:
iptables [-t table] {-A|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options…]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
注
-t :對那一個表進行操作,如果不指定將以filter為默認操作表。(相關(guān)表那些、功能、內(nèi)核模塊,請參照前一篇博文說明)
1、命令注解
命令 -A (append:追加)
樣例 #iptables -A INPUT -p tcp –dport 80 -j DROP
注解 這個選項表示在鏈尾追加一條規(guī)則,這條規(guī)則將最后才能被檢查到。
命令 -D (delete:刪除)
樣例 #iptables -D INPUT -p tcp –dport 80 -j DROP,#iptables -D INPUT 1
注解
這條命令刪除鏈里面的一條規(guī)則,我們有兩種方式輸出一條規(guī)則,第一是輸入一條完整的規(guī)則,另外就是通過序號刪除。假如你用第一種方法刪除,那么你輸入的規(guī)則必須和你想刪除的規(guī)則完全一致。如果你想用第二種方法來刪除規(guī)則,你必須制定刪除的序號,鏈的序號從頂部開始從1編號,如果此鏈當前編號為1,刪除后第二條的編號將變?yōu)?。
命令 -I (insert:插入)
樣例 #iptabels -I OUTPUT 1 -p tcp –dprot 443 -j ACCEPT
注解 在鏈里面插入一條規(guī)則,這條規(guī)則會在指定的地方插入,如果不指定默認為第一個編號上插入。
命令 -R (replace:替換 )
樣例 #iptables -R INPUT 1 -s 192.168.0.1 -j DROP
注解
這條命令替換指定位置的舊規(guī)則,它和 delete 工作方式一樣的,但是不同在于它不完全刪除這條規(guī)則,而是替換上一條新的規(guī)則。
命令 -S(顯示)
樣例 #iptables -S
注解 顯示filter表中所有鏈上的規(guī)則
命令 -L(list:列出)
樣例 #iptables -L
注解 這條命令列出指定鏈的所有規(guī)則
命令 -F (flush:清空)
樣例 #iptables -F INPUT
注解
這個命令情況鏈上的所有規(guī)則,它等同于逐條刪除所有規(guī)則,只是它更快。沒有指定參數(shù)的話,他會把指定表上面所有鏈的規(guī)則刪除干凈。
命令 -Z (zero:清零)
樣例 #iptables -Z OUTPUT
注解 將默認表中的 OUTPUT鏈的計數(shù)器清空
命令 -N (new:新建) chain
樣例 #iptables -N chain_out
注解
這個命令讓在指定的表上面創(chuàng)建一條新的用戶自定義鏈,請注意,名字不能和系統(tǒng)內(nèi)建的重合
命令 -P –policy (策略)
樣例 #iptables -P INPUT DROP
注解
為鏈設(shè)置默認的 target(可用的是 DROP 和 ACCEPT),這個target 稱作策略。所有不符合規(guī)則的包都被強制使用這個策略。只有內(nèi)建的鏈才可以使用規(guī)則。但內(nèi)建的鏈和用戶自定義鏈都不能被作為策略使用,也就是說不能象這樣使用:iptables -P INPUT allowed(或者是內(nèi)建的鏈).
命令 -E (rEname-chain)
樣例 #iptables -E allowed disallowed
注解 這條命令會把這個鏈的第一個名字改成第二個,只是改變名稱,內(nèi)容不會變。
命令 -X (delete-chain)
樣例 #iptables -X chain_out
注解
這條命令會從表上刪除指定的鏈,要想刪除這個鏈,這兒必須沒
有任何規(guī)則關(guān)聯(lián)到這個鏈。
2、選項注解
選項
-x, (–exact:更精確)
樣例 #iptables -L -n -x
注解
使–list 輸出中的計數(shù)器顯示準確的數(shù)值,而不用 K、M、G 等
估值。注意此選項只能和–list 連用。
選項 -n, (–numeric:數(shù)值)
樣例 #iptables -L -n -x -v
注解
使輸出中的 IP 地址和端口以數(shù)值的形式顯示,而不是默認的名字,比如主機名、網(wǎng)絡(luò)名、程序名等。注意此選項也只能和–list連用
選項 -v,(–verbose:以詳細格式顯示)
樣例 #iptables -L -n -x -v或 #iptables -L -n -x -vv
注解
iptables 會輸出詳細的信息告訴你規(guī)則是如何被解釋的、是否正確地插入等
等(-vv比-v要詳細)
選項 –line-numbers
樣例 #iptables -L -n –line-number
注解
每一條規(guī)則都帶有序號,很方便的知道每條規(guī)則的位置.
3、匹配規(guī)則
⑴、通用匹配
匹配符
-p, –protocol(協(xié)議)
樣例 #iptables -t INPUT -p tcp –dport 80 -j ACCEPT
注解
這個匹配器(match)主要用來檢查特定的協(xié)議;
它主要有以下幾種使用方式:
1. 制定協(xié)議的名稱,它必須在/etc/protocols 里面定
義,不然就會報錯。
2.你可以指定一個整數(shù)值,例如ICMP 就是 1,TCP
就是 6 而 UDP 是 17.(-p 6 -p 17)
3. 另外你可以指定為 ALL,ALL 表示僅僅匹配
ICMP/TCP/UDP 協(xié)議,這個是默認配置,數(shù)值為 0.
4. 可以是協(xié)議列表,以英文逗號為分隔符,如:
udp,tcp
5. 最后我們還可以對協(xié)議取反,例如!TCP 表示匹配
UDP/ICMP,當然從這兒我們也可以看到取反只能針
對 TCP/UDP/ICMP 協(xié)議。
匹配符 -s, –src, –source (源地址)
樣例 #iptables -A INTPUT -s 192.168.1.34 -p tcp -j ACCEPT
注解
它不僅可以匹配單臺主機,還以匹配一個網(wǎng)絡(luò)(ip/mask)
匹配符 -d, –dst, –destination (目標地址)
樣例 #iptables -A OUTPUT -d 192.168.1.1 -p tcp j DROP
注解 匹配報文的目的地址,用法和源地址匹配一致。
匹配符 -i, –in-interface
樣例 #iptables -A INPUT -i eth0 -p tcp -j ACCEPT
注解
包進入本地所使用的網(wǎng)絡(luò)接口來匹配包。要注意這個匹配操作
只能用于 INPUT,F(xiàn)ORWARD 和 PREROUTING 這三個鏈.(注:接口前加英文感嘆號表示取反,如 -i ! eth0,注意有空格)
匹配符 -o, –out-interface
樣例 #iptables -A FORWARD -o eth0 -p tcp -j ACCEPT
注解
以包離開本地所使用的網(wǎng)絡(luò)接口來匹配包。使用的范圍和指定接
口的方法與–in-interface 完全一樣。
⑵、隱含匹配(適用于tcp/udp)
匹配符 –sport, –source-port (源端口)
樣例 #iptables -A INPUT -p tcp –sport 22 -j ACCEPT
注解
1、不指定此項,則暗示所有端口。
2、使用服務名或端口號,但名字必須是在/etc/services中定義
的
3、可以使用連續(xù)的端口,如果兩個號的順序反了也沒關(guān)系,如:–source-port 80:22 這和 –source-port 22:80 的效果一樣。
4、可以省略第一個號,默認第一個是 0,如:–source-port :80 表示從0到80的所有端口。
5、也可以省略第二個號,默認是 65535,如:–source-port 22:表示從 22 到 65535 的所有端口.
6、在端口號前加英文感嘆號表示取反,注意空格,如:–source-port ! 22 表示除 22 號之外的所有端口;–source-port ! 22:80 表示從 22 到 80(包括 22 和 80)之外的所有端口。
注:此處不能匹配不連續(xù)的端口
匹配符 –dport, –destination-port (目的端口)
樣例 #iptables -A INPUT -p tcp –dport 22 (此處沒有指定target表示以鏈的默認的策略為準)
注解 目的端口用來匹配報文的目的端口,用法和源端口一樣
匹配符 –syn(tcp三次握手的第一次)
樣例 #iptables -A INPUT -d 172.16.32.45 -t tcp –tcp-flags –syn -j ACCEPT
注解 這里用到的是TCP封包中的控制標志來限定數(shù)據(jù)。(常用的有syn,ack,fin)
匹配符 all(此處代表–tcp-flags的六個標志為1,none則表示全為0)
樣例
#iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP
或
#iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP
注解 拒絕tcp標志位全部為1或為0的非法tcp的報文
(3)、icmp
匹配符 –icmp-type (icmp報文的類型)
樣例 #iptables -A INPUT -p icmp –icmp-type 8
注解
根據(jù)ICMP類型匹配包,類型的指定可以使用十進制數(shù)值或相應的
名字。(常用的有兩個8表示請求,0表示響應)
(4)、顯示匹配(-m)
匹配符 multiport –dports (多目的端口)(此處可以是多個不相連的多個端口(<15))
樣例 #iptables -I INPUT -d 172.16.32.7 -p tcp -m multiport –dports 22,80 -j ACCEPT
注解 到達172.16.3.27協(xié)議是tcp的使用是22和80的端口程序放行
匹配符 multiport –sports (多源端口)
樣例 #iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport –sports 22,80 -j ACCEPT
注解 從172.16.100.7使用22,80端口出去的程序放行
匹配符 iprange –src-range (基于范圍的源地址)
樣例
#iptables -A INPUT -p tcp -m iprange –src-range
192.168.1.13-192.168.2.19
注解 –src-range 用來匹配一整段的源地址也可以對地址取反,例 iprange ! –src-range
匹配符 iprange –dst-range (基于范圍的目的地址)
樣例
#iptables -A INPUT -p tcp -m iprange –dst-range
192.168.1.13-192.168.2.19
注解 匹配一整段的目的地址,用法和源一致
匹配符 [!] –connlimit-above(限定并發(fā)連接數(shù))
樣例 #iptables -I INPUT -d 192.168.2.34 -p tcp -dport 80 -m connlimit –connlimit-above 5 -j DROP
注解 限定并發(fā)連接數(shù)
匹配符 limit –limit(報文速率控制)
樣例 #iptables -A INPUT -m limit –limit 3/(hour|second|minute|day)
注解 單位時間內(nèi)通過的報文數(shù)(通常與limit-burst同用)
匹配符 limit-burst
樣例 #iptables -A INPUT -m iprange –src-range 172.16.32.1-172.16.32.100 -p tcp -m limit –limit 2/minute –limit-burst 2
注解
這里定義的是limit的峰值,就是在單位時間內(nèi)最多可匹配幾個報文
匹配符 time(指定時間范圍)
類別
-datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
–weekdays day[,day…]
樣例
#iptables -A INPUT -d 172.16.32.7 -p tcp –dport 901 -m time –weekdays Mon,Tus,Wed,Thu,F(xiàn)ri –timestart 08:00:00 –time-stop 18:00:00 -j ACCEPT
注解 時間范圍的限定(天、小時、周),此項是可以取反的。
匹配符 string –algo {kmp|bm}{–string "STRING"|–hex-string “HEX-STRING”}
樣例 #iptables -A INPUT -p tcp –dport 80 -m string –algo kmp ! –string "admin" -m state –state ESTABLISHED -j ACCEPT
注解
過濾指定的字符–string "STRING":要查找的字符串或–hex-string "HEX-STRING"先將查找的字符,編碼成16進制格式再比較
匹配符 state –state
樣例 iptables -A INPUT -m state –state NEW,RELATED,ESTABLISHED
注解
指定要匹配包的的狀態(tài),當前有4 種狀態(tài)可用:INVALID,ESTABLISHED,NEW和RELATED。
INVALID意味著這個包沒有已知的流或連接與之關(guān)聯(lián),也可能是它包含的數(shù)據(jù)或包頭有問題。
ESTABLISHED意思是包是完全有效的,而且屬于一個已建立的連接,這個連接的兩端都已經(jīng)有數(shù)據(jù)發(fā)送。
NEW表示包將要或已經(jīng)開始建立一個新的連接,或者是這個包和一個還沒有在兩端都有數(shù)據(jù)發(fā)送的連接有關(guān)。RELATED說明包正在建立一個新的連接,這個
連接是和一個已建立的連接相關(guān)的.
四、注意事項
1、規(guī)則相關(guān)
(1)、對于進入的狀態(tài)為ESTABLISHED都應該放行;
(2)、對于出去的狀態(tài)為ESTABLISHED都應該放行;
(3)、嚴格檢查進入的狀態(tài)為NEW的連接;
(4)、所有狀態(tài)為INVALIED都應該拒絕;
2、連接相關(guān)
(1)、調(diào)整連接追蹤功能所能容納的追蹤的最大連接數(shù):
# cat /proc/sys/net/nf_conntrack_max
(2)、定義了連接追蹤的最大值,因此,建議按需調(diào)大此值;
# cat /proc/net/nf_conntrack
(3)、記錄了當前追蹤的所有連接
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
3、如何放行工作于被動模式下的FTP服務?
注:ftp的工作模式完全取決于客戶端,具體原因請查看FTP主被模式
(1)、確保iptables加載ftp協(xié)議支持的模塊:ip_nat_ftp, nf_conntrack_ftp
編輯/etc/sysconfig/iptables-config文件,定義如下參數(shù):
IPTABLES_MODULES="ip_nat_ftp nf_conntrack_ftp"
(2)、放行請求報文的RELATED和ESTABLISHED狀態(tài),放行響應報文的ESTABLISHED狀態(tài);
#modprobe ip_nat_ftp
#modprobe nf_conntrack_ftp
#iptables -P INPUT DROP
#iptabls -P OUTPUT DROP
#iptables -I INPUT -d 172.16.32.45 -p tcp –dport 21 -j ACCEPT
#iptables -I OUTPUT -s 172.16.32.45 -p tcp –sport 21 -j ACCEPT
#iptables -I INPUT -d 172.16.32.45 -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT
#iptables -I OUTPUT -s 172.16.32.45 -p tcp -m state –state ESTABLISHED -j ACCEPT
4、保存規(guī)則
service iptables save保存防火墻規(guī)則,保存的位置為/etc/sysconfig/iptables文件中。
iptables-save > /path/to/some_rulefile把規(guī)則寫入到某個文件中。
iptables-restore</path/from/some_rulefile輸入重定向。