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:指定全部匹配條件的數據包的處理動做;app
-t table:tcp
COMMAND
鏈:-P, -N, -E, -X, -F
規則:-A, -I, -D, -Z, -R, -Lide
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;
code
-m matchname:ip
-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:在規則鏈之間跳轉