iptables規則編寫的通用格式:
iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-target-options]
-t table:指定選擇執行哪個表的功能,可以選擇的表包括:raw,mangle,nat及filter,如果省略此選項,則表示使用默認表——filter表;
-m matchname:通常是配置顯式擴展的匹配條件時,必須書寫;如果省略則表示要配置基本匹配條件或隱式擴展匹配條件;
-j targetname:指定所有匹配條件的數據包的處理動作;
-t table:
COMMAND
鏈:-P, -N, -E, -X, -F
規則:-A, -I, -D, -Z, -R, -L
COMMAND:
鏈的操作命令;
-P, --policy chain target
用於定義指定鏈的默認策略;通常有兩種動作選擇,即:ACCEPT和DROP;
-N, --new-chain chain
創建一條新的自定義的規則鏈;新建的鏈上的規則必須要被內建鏈上的規則調用才能生效;
-X, --delete-chain [chain]
刪除被內建鏈調用次數爲0的自定義鏈;
-E, --rename-chain old-chain new-chain
重命名被內建鏈調用次數爲0的自定義鏈;
-F, --flush [chain]
清除指定鏈(表中所有鏈)上的規則;
規則的操作命令:
-A, --append chain rule-specification
在指定的鏈的末尾追加一條規則;
-D, --delete chain rule-specification
-D, --delete chain rulenum
從指定的鏈上刪除一條規則,可以指明具體規則,也可以指明規則在鏈上的編號;
-I, --insert chain [rulenum] rule-specification
在指定的鏈上插入一條規則,默認是將新規則插入至鏈的第一條規則,也可以指定規則編號,是的插入的規則稱爲指定鏈上的第rulenum條規則;
-R, --replace chain rulenum rule-specification
用命令行中的規則替換指令鏈上的第rulenum條規則;並不是修改規則中某個具體條件,而是完全替換整條規則;
-L, --list [chain]
列表顯示指定表指定鏈(所有鏈)上的所有規則;
可以使用的其他常用選項:
-v, --verbose:顯示更詳細格式的信息,還有-vv;
-n, --numeric:將規則中的所有信息都進行數字化顯示;包括主機名和端口號等信息;
-x, --exact:精確的顯示計數器的結果;
每個規則都有兩個計數器:
1.規則所匹配的報文的個數;
2.規則所匹配的報文的字節總數;
--line-numbers:顯示指定鏈上各個規則的編號;
其他的命令:
-Z, --zero [chain [rulenum]]
將指定鏈的規則計數器置0;
-m matchname:
-p {tcp|udp|ip|icmp}
multiport --dports --sports --ports
iprange
time
connlimit
limit
state
mac
string
顯示擴展(multiport擴展、iprange擴展、string擴展、time擴展、state擴展、mac擴展、connlimit擴展、limit擴展)
1.multiport擴展:
一次性的寫入多個離散端口或多組連續端口,最大的上限15組端口,每一個端口範圍佔用兩個端口;
可以支持的協議:tcp, udp, udplite, dccp, sctp.
相關選項:
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
--dports 22,80,3306 -j ACCEPT
示例:
~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
2.iprange擴展:
以連續的任意數量的IP地址訪問作爲匹配條件;
相關選項:
[!] --src-range from[-to]
[!] --dst-range from[-to]
-m iprange --src-range 192.168.100.1-192.168.100.100
示例:
~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
3.string擴展:
對數據報文中的應用層數據做字符串匹配檢測;
相關選項:
--algo {bm|kmp}
--string "STRING"
示例:
~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -j REJECT
4.time擴展:
根據報文到達防火牆本機的時間與指定的時間範圍進行匹配檢測;
相關選項:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
定義唯一一個絕對的時間範圍;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
定義一個週期性的時間範圍;
[!] --monthdays day[,day...]
定義每個月中各個天;取值1-31
[!] --weekdays day[,day...]
定義每個星期中的星期幾;
取值:Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7, or Mo, Tu, etc.
示例:
~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT
5.state擴展
連接狀態檢測;基於連接追蹤機制實現;
conntrack
相關選項:
[!] --state state
iptables對連接狀態的定義:
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED;
INVALID:無法識別的連接狀態,無效的通信狀態; SYN,FIN
ESTABLISHED:已經建立連接的狀態;連接態;
NEW:尚未建立連接的狀態;新連接態;
RELATED:與其他已經建立的連接有相互關聯的連接狀態;關聯態或衍生態;
UNTRACKED:未追蹤的狀態;
內核中用於保存連接追蹤狀態數據的位置:/proc/net/nf_conntrack
能夠被追蹤到的最大的連接數:/proc/sys/net/nf_conntrack_max
注意:此處記錄的最大連接數的數值,建議必要時可以調整其大小到足夠大;
爲了能夠儘可能的高效利用內存資源,緩存的連接追蹤的狀態不能無限期保存,因此設置了相應的超時時間;
/proc/sys/net/netfilter/nf_conntrack*timeout*
利用連接追蹤設置FTP服務器的訪問控制:
~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP
注意:需要裝載nf_conntrack_ftp內核模塊;
~]# modprobe nv_conntrack_ftp
設置nf_conntrack_ftp模塊的自動裝載:
設置/etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
利用連接追蹤可以設置OUTPUT鏈上的通用規則:
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP
6.mac擴展
實現mac地址匹配檢測;用於PREROUTING, FORWARD or INPUT鏈;
相關選項
[!] --mac-source address
匹配源mac地址;其形式必須是:XX:XX:XX:XX:XX:XX
7.connlimit擴展:
根據每個客戶端IP地址做併發連接數的匹配檢測;
相關選項:
--connlimit-upto n
當客戶端當前的併發連接數小於或等於n時,可以匹配此條件;此條件通常和ACCEPT動作配合使用;
--connlimit-above n
當客戶端當前的併發連接數大於n時,可以匹配此條件;此條件通常和DROP或REJECT動作配合使用;
8.limit擴展:
基於服務器端收發數據報文的速率來進行匹配檢測;
相關選項:
--limit rate[/second|/minute|/hour|/day]
服務器端最大單位時間內能夠接收的報文速率;
--limit-burst number
初始時所能接收的數據報文的最大數量;
隱式擴展
-p {tcp|udp|icmp}
tcp: --sport, --dport, --tcp-flags, --syn
--syn === --tcp-flags SYN,RST,ACK,FIN SYN
udp:--sport, --dport
icmp:--icmp-type {echo-request(8) | echo-reply(0)}
tcp協議(tcp模塊):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用於指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口範圍,而不能指定離散端口;
[!] --tcp-flags mask comp
用於指定在TCP協議首部中各標誌位的匹配條件;
URG, SYN, RST, PSH, ACK, FIN, ALL, NONE
mask:設定要檢測的標誌位的列表,各標誌位之間使用","進行分隔;
comp:必須被置"1"的標誌位列表,剩餘的在mask列表中的標誌位必須置"0";
[!] --syn
相當於:--tcp-flags SYN,RST,ACK,FIN SYN
udp協議(udp模塊):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用於指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口範圍,而不能指定離散端口;
icmp協議(icmp模塊):
[!] --icmp-type {type[/code]|typename}
常用的icmp-type:
echo-request,代碼爲8;
echo-reply,代碼爲0;
-j targetname:指定所有匹配條件的數據包的處理動作;
ACCEPT
DROP
REJECT
SNAT --to-source ipaddr[:port]
MASQUERADE
DNAT --to-destination ipaddr[:port]
REDIRECT --to-ports port
LOG --log-level --log-prefix
RETURN
常用的TARGETS:
LOG:對於匹配的數據報文的流動情況進行日誌記錄,並不會影響數據報文本身的傳輸;
MARK:對於匹配的數據報文進行防火牆標記的設置;
MASQUERADE:源地址僞裝,一種特殊的源IP地址轉換;
REDIRECT:目標IP地址和端口的重定向;
REJECT:阻止數據報文傳輸並向數據報文的源頭返回消息;
SNAT:源IP地址轉換;
DNAT:目標IP地址轉換;
ACCEPT:對於匹配的數據報文進行放行;
DROP:對於匹配的數據報文進行阻止;
RETURN:在規則鏈之間跳轉