Iptables簡介與示例
iptables/netfilter介紹:
包過濾型防火牆:
Firewall:隔離工具,工作於主機或網絡的邊緣處,對經由的報文根據預先定義的規則(識別標準)進行檢測,
對於能夠被規則匹配到的報文實行某種預定義的處理機制的一套組件;
硬件防火牆:在硬件級別實現部分功能的;
軟件防火牆:應用軟件邏輯在通用硬件基礎上實現;
主機防火牆:
網絡防火牆:
版本:ipfw --> ipchians --> iptables(ip6tables)
iptables/netfilter:
iptables:規則管理工具;
netfilter:防火牆框架,承載並生效規則;
hook functions(netfilter):
prerouting
input
forward
output
postrouting
iptables:
PREROUTING 路由前規則
INPUT 輸入(內核到用戶空間)規則
FORWARD 轉發(中繼)規則
OUTPUT 輸出(用戶空間到內核)規則
POSTROUTING 路由後規則
允許用戶自定義規則鏈;它們需要手動關聯至指定的”鉤子“;
netfilter:功能
filter(“防火”):包過濾
NAT:Network Address Translation
mangle:拆解報文,做出修改,而後重新封裝
raw:關閉nat表上啓用的連接追蹤機制
功能(表)<-->鉤子(鏈)
filter:input, forward, output
nat:prerouting, input,output, postrouting
mangle:prerouting, input, forward, output, postrouting
raw:prerouting, output
優先級(由高而低):raw --> mangle --> nat --> filter
iptables規則的組成部分:
匹配條件:
網絡層首部:SourceIP, DestinationIP, ...
傳輸層首部:SourtPort, DestinationPort, TCP Flags(SYN,ACK,FIN,URG,RST,PSH), ...
擴展模塊引入的輔助檢查機制:
跳轉目標:-j target
內建的處理機制:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG, ...
用戶自定義鏈:
添加規則時需要考量的因素:
(1) 實現的功能:用於判定將規則添加至哪個表;
(2) 報文的流經位置:用於判斷將規則添加至哪個鏈;
(3) 報文的流向:判定規則中何爲”源“,何爲”目標“;
(4) 匹配條件:用於編寫正確的匹配規則;
(a) 專用於某種應用的同類規則,匹配範圍小的放前面;
(b) 專用於某些應用的不同類規則,匹配到的可能性較多的放前面;同一類別的規則可使用自定義鏈單獨存放;
(c) 用於通用目的的規則放前面;
注意:filter表包過濾,”防火牆“意義的核心所在;
INPUT,FORWARD,OUTPUT
Iptables 命令:
模塊/usr/lib64/xtables/
man iptables
man iptables-extensions
iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]] [-j targetname [per-target-options]]
COMMANDs:
鏈管理:命令中沒有-t指明表,默認爲Filter表
-N, --new-chain chain:新建一個自定義的規則鏈;
要使用-j 引用自定義鏈名生效,注意:兩條命令參數衝突
-X, --delete-chain [chain]:刪除用戶自定義的引用計數爲0的空鏈;
-F, --flush [chain]:清空指定的規則鏈上的規則;
-E, --rename-chain old-chain new-chain:重命名鏈;
-Z, --zero [chain [rulenum]]:置零計數器;
注意:每個規則都有兩個計數器
packets:被本規則所匹配到的所有報文的個數;
bytes:被本規則所匹配到的所有報文的大小之和;
-P, --policy chain target 設置默認策略
規則管理:
-A, --append chain rule-specification:追加新規則於指定鏈的尾部;
-I, --insert chain [rulenum] rule-specification:插入新規則於指定鏈的指定位置,默認爲首部;
-R, --replace chain rulenum rule-specification:替換指定的規則爲新的規則;
-D, --delete chain rulenum:根據規則編號刪除規則;
-D, --delete chain rule-specification:根據規則本身刪除規則;
規則顯示:
-L, --list [chain]:列出規則;
-v, --verbose:詳細信息;
-vv
-n, --numeric:數字格式顯示主機地址和端口號;
-x, --exact:顯示計數器的精確值,而非圓整後的數據;
--line-numbers:列出規則時,顯示其在鏈上的相應的編號;
-S, --list-rules [chain]:顯示指定鏈的所有規則;
匹配條件:
通用匹配(PARAMETERS):
[!] -s, --source address[/mask][,...]:檢查報文的源IP地址是否符合此處指定的範圍,或是否等於此處給定的地址;
[!] -d, --destination address[/mask][,...]:檢查報文的目標IP地址是否符合此處指定的範圍,或是否等於此處給定的地址;
[!] -p, --protocol protocol:匹配報文中的協議,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 "all", 亦可以數字格式指明
-m, --match match:調用指定的擴展匹配模塊來擴展匹配條件檢查機制;
[!] -i, --in-interface name:限定報文僅能夠從指定的接口流入;only for packets entering the INPUT, FORWARD and PREROUTING chains.
[!] -o, --out-interface name:限定報文僅能夠從指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.
擴展匹配(MATCH EXTENSIONS)
-m tcp
--sport, --dport
跳轉目標(執行策略):
-j targetname [per-target-options]
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
SNAT:源地址轉換
DNAT:目標地址轉換
MASQUERADE地址僞裝,用於ADSL
MARK:
LOG:記錄日誌
匹配條件:
基本匹配條件:PARAMETERS
擴展匹配條件:
隱式擴展:在使用-p選項指明瞭特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制;
顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;
隱式擴展:
-p tcp:可直接使用tcp擴展模塊的專用選項;
[!] --source-port,--sport port[:port] 匹配報文源端口;可以給出多個端口,但只能是連續的端口範圍 ;
[!] --destination-port,--dport port[:port] 匹配報文目標端口;可以給出多個端口,但只能是連續的端口範圍 ;
[!] --tcp-flags mask comp 匹配報文中的tcp協議的標誌位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
mask:要檢查的FLAGS list,以逗號分隔;
comp:在mask給定的諸多的FLAGS中,其值必須爲1的FLAGS列表,餘下的其值必須爲0;
--tcp-flags SYN,ACK,FIN,RST SYN
--tcp-flags ALL ALL
--tcp-flags ALL NONE
[!] --syn:= --tcp-flags SYN,ACK,FIN,RST SYN : 新請求標誌
-p udp:可直接使用udp協議擴展模塊的專用選項:
[!] --source-port, --sport port[:port]
[!] --destination-port, --dport port[:port]
-p icmp:
--icmp-type {type[/code]|typename},一般用於ping命令
0/0: echo reply 回答
8/0:echo request 請求
顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;
1、multiport
以離散或連續的 方式定義多端口匹配條件,最多15個;
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT
2、iprange
以連續地址塊的方式來指明多IP地址匹配條件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT
3、time
指明在某個時間段對某些參數及選項生效或拒絕
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day...]
[!] --monthdays day[,day...]
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
一般timestart,timestop,weekdays組合使用
--kerneltz:使用內核配置的時區而非默認的UTC;centos6不需要
4、string (明文編碼生效)
對數據內容與設定字符串匹配,進行默認操作
--algo {bm|kmp} 指明匹配模式,二者性能相似,均可。
[!] --string pattern
[!] --hex-string pattern
--from offset
--to offset
~]# iptables -I OUTPUT -m string --algo bm --string "abc" -j REJECT
5、connlimit
允許限制每個客戶端IP地址或客戶端地址塊到服務器的並行連接數。
--connlimit-upto n 小於等於n
--connlimit-above n 大於n
~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
6、limit
此模塊使用令牌bucket篩選器限制有限速率
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT
7、state
根據連接跟蹤狀態,進行過濾限制.
[!] --state state
NEW: 新連接請求;
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬於某個已存在的連接;
UNTRACKED:未追蹤的連接;
state擴展:
內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4
手動裝載:
nf_conntrack_ftp
追蹤到的連接:
/proc/net/nf_conntrack
調整可記錄的連接數量最大值:
/proc/sys/net/nf_conntrack_max
超時時長:
/proc/sys/net/netfilter/*timeout*
處理動作(跳轉目標):
-j targetname [per-target-options]
基本target:
ACCEPT:接受
DROP:丟棄
擴展target:
REJECT:拒絕
SNAT:源地址轉換
DNAT:目標地址轉換
MASQUERADE:地址僞裝,用於ADSL
MARK:
LOG:記錄日誌
--log-level
--log-prefix “插入日誌前部的信息”
日誌信息:/var/log/messages
自定義鏈做爲target:
-j 自定義鏈(執行策略)
保存和載入規則:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有規則
-t, --test:僅分析生成規則集,但不提交
CentOS 6:
保存規則:
service iptables save
保存規則於/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:
service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
配置文件:/etc/sysconfig/iptables-config
CentOS 7:
(1) 自定義Unit File,進行iptables-restore;
(2) firewalld服務;
(3) 自定義腳本;
規則優化的思路:
使用自定義鏈管理特定應用的相關規則,模塊化管理規則;
(1) 優先放行雙方向狀態爲ESTABLISHED的報文;
(2) 服務於不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務於同一類別的功能的規則,匹配條件較嚴格的放在前面;
(4) 設置默認策略:白名單機制
(a) iptables -P,不建議;
(b) 建議在規則的最後定義規則做爲默認策略;
iptables/netfilter網絡防火牆:
(1) 網關;
(2) filter表的FORWARD鏈;
要注意的問題:
(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性;
(2) 如果要啓用conntrack機制,建議將雙方向的狀態爲ESTABLISHED的報文直接轉發;
NAT: Network Address Translation
請求報文:由管理員定義;
響應報文:由NAT的conntrack機制自動實現;
請求報文:
改源地址:SNAT
改目標地址:DNAT
iptables/netfilter:
NAT定義在nat表;
PREROUTING,INPUT,OUTPUT,POSTROUTING
SNAT:POSTROUTING
DNAT:PREROUTING
target:
SNAT:源地址轉換
--to-source [ipaddr[-ipaddr]]原端口一般不改
~]#iptables -t nat -A POSTROUTING -s 172.16.253.190 -j SNAT --to-source 172.16.250.251
DNAT:目標地址轉換
--to-destination [ipaddr[-ipaddr]][:port[-port]]
~]#iptables -t nat -A PREROUTING -d 172.16.253.190 -j DNAT --to-destination 172.16.253.190
MASQUERADE 地址僞裝
SNAT場景中應用於POSTROUTING鏈上的規則實現源地址轉換,但外網地址不固定時,使用此target;
~]#iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE
REDIRECT:端口映射,沒有真實監測端口,而是收到指定端口請求,映射到新端口
--to-ports port[-port]
~]#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
示例:
1,新建自定義鏈
2,刪除自定義鏈
3, 172.16.0.0網段的訪問 都被172.16.253.190拒絕丟棄
4,172.16.0.0網段ping172.16.253.190 都被拒絕丟棄
5,拒絕172.16.0.0網段ftp登錄到172.16.253.190:ftp端口爲tcp:21
6,僅開放本機的ssh服務給172.16.0.0/16中的主機,而且不包含172.16.0.200
7,清空input鏈內所有規則
8,限制httpd服務提供內容帶有sos字符串的網頁資源
]# iptables -I INPUT -d 172.16.253.190 -p tcp --dport 80 -j ACCEPT
]# iptables -I OUTPUT -s 172.16.253.190 -p tcp --sport 80 -j ACCEPT
]# iptables -I OUTPUT -s 172.16.253.190 -p tcp --sport 80 -m string --algo bm --string 'sos' -j REJECT
]# echo 'test iptables' > /var/www/html/index.html
]# echo 'test sos ' > /var/www/html/index2.html
9,同一個客戶端不允許同時鏈接數據庫超過2次,
]# iptables -I INPUT -d 172.16.253.190 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
]# iptables -I OUTPUT -s 172.16.253.190 -p tcp --sport 3306 -j ACCEPT