一、iptables/netfilter的簡介:
iptables:規則管理工具;該系統工具有利于在 Linux 系統上更好地控制 IP 信息包過濾和防火墻配置。防火墻在做信息包過濾決定時,有一套遵循和組成的規則,這些規則存儲在專用的信
息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。而netfilter/iptables IP 信息包過濾系統是一款功能強大的工具,可用于添加、編輯和移除規則。
netfilter:防火墻框架,承載并生效規則;netfilter的架構就是在整個網絡流程的若干位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些處理函數進行處理。
二、iptables命令組成:
iptables [-t table] COMMAND [chain]
[PARAMETERS] [-m matchname [per-match-options]] [-j targetname
[per-target-options]]
1、table:即功能表。主要分為filter、nat、mangle、raw,其優先級由高到低:raw
–> mangle –> nat –> filter,一般默認為filter功能。
2、COMMAND:命令
a)鏈管理:
-N, –new-chain chain:新建一個自定義的規則鏈;
-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
b)規則管理:
-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:根據規則本身刪除規則;
c)規則顯示:
-L, –list [chain]:列出規則;
-v, –verbose:詳細信息;
-vv
-n, –numeric:數字格式顯示主機地址和端口號;
-x, –exact:顯示計數器的精確值,而非圓整后的數據;
–line-numbers:列出規則時,顯示其在鏈上的相應的編號;
-S, –list-rules [chain]:顯示指定鏈的所有規則;
3、chain:鏈,主要分為prerouting,
input, forward, output, postrouting,也就是我們平時所說的路由前,輸入,轉發,輸出,路由后,在不同功能表上其所包含的鏈也是不一樣的。比如:
filter:input, forward,
output
nat:prerouting, input,
output, postrouting
mangle:prerouting, input,
forward, output, postrouting
raw:prerouting, output
4、PARAMETERS:匹配條件,一般分為通用匹配和擴展匹配。
通用匹配(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
5、-j targetname
[per-target-options] :處理動作(跳轉目標)
簡單target:ACCEPT, DROP
擴展target:REJECT,
LOG
–log-level
–log-prefix
三、iptables的簡單使用
1、開放本機22 端口給多有主機訪問
[root@localhost ~]#iptables -A INPUT -d
172.18.24.1 -p tcp –dport 22 -j ACCEPT
[root@localhost ~]#iptables -A OUTPUT -s
172.18.24.1 -p tcp –sport 22 -j ACCEPT
[root@localhost ~]#iptables -R INPUT 2 -d 172.18.24.1 -j REJECT
#禁止其他任何地址訪問
[root@localhost ~]#iptables -R OUTPUT
2 -s 172.18.24.1 -j REJECT
2、開放本機的Samba服務,以上述1標準為防火墻
[root@localhost ~]#systemctl start nmb smb
[root@chenxu html]#smbclient -L 172.18.24.1
-U centos #此時在客戶端登錄,訪問超時,登錄不上
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p udp –dport 137:138 -j ACCEPT
[root@localhost ~]#iptables -I OUTPUT 2 -s
172.18.24.1 -p udp –sport 137:138 -j ACCEPT
開放137,138,端口,此時客戶端也是連接不上的
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p tcp –dport 139 -j ACCEPT
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p tcp –dport 445 -j ACCEPT
[root@localhost ~]#iptables -I OUTPUT 2 -s
172.18.24.1 -p tcp –sport 139 -j ACCEPT
[root@localhost ~]#iptables -I OUTPUT 2 -s
172.18.24.1 -p tcp –sport 445 -j ACCEPT
開放 139和445 端口,此時客戶能連接上Samba服務
3、把Samba服務單獨創建一個鏈
[root@localhost ~]#iptables -N
samba_input_rules 創建自定義鏈
然后添加規則
[root@localhost ~]#iptables -A
samba_input_rules -d 172.18.24.1 -p udp –dport 137:138 -j ACCEPT
[root@localhost ~]#iptables -A
samba_input_rules -d 172.18.24.1 -p tcp –dport 139 -j ACCEPT
[root@localhost ~]#iptables -A
samba_input_rules -d 172.18.24.1 -p tcp –dport 445 -j ACCEPT
布置默認規則
[root@localhost ~]#iptables -A INPUT -d
172.18.24.1 -p tcp –dport 22 -j ACCEPT
[root@localhost ~]#iptables -A INPUT -d
172.18.24.1 -j REJECT
調用Samba規則
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -j samba_input_rules #這樣客戶端就能夠連接Samba服務了
4、如何刪除自定義鏈?
a)首先取消引用
[root@localhost ~]#iptables -D INPUT 2
b)再把自定義鏈內的規則刪除
[root@localhost ~]#iptables -F
samba_input_rules
c)最后刪除自定義鏈
[root@localhost ~]#iptables -X
samba_input_rules
5、設置iptables使本機可以ping出去,其它機器不能ping進來
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p icmp –icmp-type 0 -j ACCEPT
別的機器可以ping進來
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p icmp –icmp-type 8 -j ACCEPT
或者直接定義icmp的規則
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p icmp -j ACCEPT
這樣既可以ping出去,又能讓別的機器ping進來
6、一次性開放多個端口
[root@localhost ~]#iptables -R INPUT 1 -d
172.18.24.1 -p tcp -m multiport –dports 22,80,139,445 -j ACCEPT
7、開放多個IP端口
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p tcp –dport 23 -m iprange –src-range 172.18.0.100-172.18.0.120
-j ACCEPT 這個區間的IP都能夠訪問目標地址的23 端口
8、在某個時間段開放端口
[root@localhost ~]#iptables -I INPUT -d
172.18.24.1 -p tcp –dport 80 -m time –timestart 20:00:00 –timestop 23:00:00
–kerneltz -j REJECT
9、對指定報文字符串匹配禁止端口或者開放端口
[root@localhost ~]#iptables -I INPUT 1 -d 172.18.24.1 -p tcp -m multiport –dports
80,443 -m string –algo bm –string
“boy” -j REJECT #注– – algo是指定算法
[root@localhost ~]#iptables -I OUTPUT -s 172.18.24.1 -p tcp -m multiport –sports
80,443 -m string –algo bm –string
“boy” -j REJECT
10、在規定單客戶端并發連接數下開放端口,超過則限行
[root@localhost ~]#iptables -I INPUT 2 -d 172.18.24.1
-p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
11、平均時間內放行多少連接,超過則限行
~]# iptables –I INPUT -d 172.16.0.7 -p icmp
–icmp-type 8 – -limit 20/minute – -limit-burst 4 -j ACCEPT
12、設置連接跟蹤state
State連接跟蹤,首先要清除防火墻規則,然后如下
[root@localhost ~]#iptables -A INPUT -d 172.18.24.1
-m state –state ESTABLISHED -j ACCEPT
[root@localhost ~]#iptables -A OUTPUT -s
172.18.24.1 -m state –state ESTABLISHED -j ACCEPT
所有建立連接狀態的進棧出棧都保持放行(已經建立連接的)
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p tcp -m multiport –dports 21,22,80,443,3306,139,445
-m state –state NEW -j ACCEPT 放行這些端口的new請求(即第一次連接)
[root@localhost ~]#iptables -R INPUT 1 -d 172.18.24.1 -m state –state
ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]#modprobe
nf_conntrack_ftp
追蹤到的連接放置在文件/proc/net/nf_conntrack
調整可記錄的連接數量最大值的文件/proc/sys/net/nf_conntrack_max
設置超時時長的文件/proc/sys/net/netfilter/*timeout*
13、把連接到特定端口的記錄記錄到日志中
[root@localhost ~]#iptables -I INPUT 2 -d
172.18.24.1 -p tcp –dport 22 -j LOG –log-prefix “ssh daemon”
[root@localhost ~]#tail /var/log/messages查看日志
四、iptables規則的保存
保存: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
保存規則于/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:
service
iptables restore</etc/sysconfig/iptables
默認重載/etc/sysconfig/iptables文件中的規則
配置文件:/etc/sysconfig/iptables-config
在CentOS 7中:
(1) 自定義Unit File,進行iptables-restore;
(2) firewalld服務;
(3) 自定義腳本;
五、注意事項
1、添加規則時需要考量的因素:
(1) 實現的功能:用于判定將規則添加至哪個表;
(2) 報文的流經位置:用于判斷將規則添加至哪個鏈;
(3) 報文的流向:判定規則中何為”源“,何為”目標“;
(4) 匹配條件:用于編寫正確的匹配規則;
(a) 專用于某種應用的同類規則,匹配范圍小的放前面;
(b) 專用于某些應用的不同類規則,匹配到的可能性較多的放前面;同一類別的規則可使用自定義鏈單獨存放;
(c) 用于通用目的的規則放前面;
2、規則優化的思路:
使用自定義鏈管理特定應用的相關規則,模塊化管理規則;
(1) 優先放行雙方向狀態為ESTABLISHED的報文;
(2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務于同一類別的功能的規則,匹配條件較嚴格的放在前面;
(4) 設置默認策略:白名單機制
(a) iptables -P,不建議;
(b) 建議在規則的最后定義規則做為默認策略;
原創文章,作者:chenxu@magedu.com,如若轉載,請注明出處:http://www.www58058.com/74725