規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工做就是添加、修改和刪除這些規則。node
到本機某進程的報文:PREROUTING --> INPUTshell
由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTINGcentos
由本機的某進程發出報文(一般爲響應報文):OUTPUT --> POSTROUTING網絡
防火牆的做用就在於對通過的報文匹配"規則",而後執行對應的"動做",因此,當報文通過這些關卡的時候,則必須匹配這個關卡上的規則,可是,這個關卡上可能不止有一條規則,而是有不少條規則,當咱們把這些規則串到一個鏈條上的時候,就造成了"鏈",因此,咱們把每個"關卡"想象成以下圖中的模樣 ,這樣來講,把他們稱爲"鏈"更爲合適,每一個通過這個"關卡"的報文,都要將這條"鏈"上的全部規則匹配一遍,若是有符合條件的規則,則執行規則對應的動做。app
A類規則都是對IP或者端口的過濾,B類規則是修改報文,tcp
把具備相同功能的規則的集合叫作"表",因此說,不一樣功能的規則,咱們能夠放置在不一樣的表中進行管理,而iptables已經爲咱們定義了4種表,每種表對應了不一樣的功能centos7
iptables爲咱們提供了以下規則的分類,或者說,iptables爲咱們提供了以下"表"rest
filter表:負責過濾功能,防火牆;內核模塊:iptables_filter nat表:network address translation,網絡地址轉換功能;內核模塊:iptable_nat mangle表:拆解報文,作出修改,並從新封裝 的功能;iptable_mangle raw表:關閉nat表上啓用的鏈接追蹤機制;iptable_raw
PREROUTING 的規則能夠存在於:raw表,mangle表,nat表。日誌
INPUT 的規則能夠存在於:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。code
FORWARD 的規則能夠存在於:mangle表,filter表。
OUTPUT 的規則能夠存在於:raw表mangle表,nat表,filter表。
POSTROUTING 的規則能夠存在於:mangle表,nat表。
表(功能)<--> 鏈(鉤子):
raw 表中的規則能夠被哪些鏈使用:PREROUTING,OUTPUT
mangle 表中的規則能夠被哪些鏈使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的規則能夠被哪些鏈使用:PREROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter 表中的規則能夠被哪些鏈使用:INPUT,FORWARD,OUTPUT
優先級次序(由高而低):
raw --> mangle --> nat --> filter
匹配條件分爲基本匹配條件與擴展匹配條件
基本匹配條件:
源地址Source IP,目標地址 Destination IP
上述內容均可以做爲基本匹配條件。
擴展匹配條件:
除了上述的條件能夠用於匹配,還有不少其餘的條件能夠用於匹配,這些條件泛稱爲擴展條件,這些擴展條件其實也是netfilter中的一部分,只是以模塊的形式存在,若是想要使用這些條件,則須要依賴對應的擴展模塊。
源端口Source Port, 目標端口Destination Port
上述內容均可以做爲擴展匹配條件
處理動做在iptables中被稱爲target(這樣說並不許確,咱們暫且這樣稱呼),動做也能夠分爲基本動做和擴展動做。
此處列出一些經常使用的動做,以後的文章會對它們進行詳細的示例與總結:
ACCEPT:容許數據包經過。
DROP:直接丟棄數據包,不給任何迴應信息,這時候客戶端會感受本身的請求泥牛入海了,過了超時時間纔會有反應。
REJECT:拒絕數據包經過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。
SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上。
DNAT:目標地址轉換。
REDIRECT:在本機作端口映射。
LOG:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則,也就是說除了記錄之外不對數據包作任何其餘操做,仍然讓下一條規則去匹配。
[root@node3 ~]# iptables -t filter -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@node3 ~]#
-t:指定要操做的表,
-L:使用-L選項,查看-t選項對應的表的規則,-L選項的意思是,列出規則
iptables -t raw -L iptables -t nat -L iptables -t mangle -L
規則對應的屬性
pkts:對應規則匹配到的報文的個數。
bytes:對應匹配到的報文包的大小總和。
target:規則對應的target,每每表示規則對應的"動做",即規則匹配成功後須要採起的措施。
prot:表示規則對應的協議,是否只針對某些協議應用此規則。
opt:表示規則對應的選項。
in:表示數據包由哪一個接口(網卡)流入,咱們能夠設置經過哪塊網卡流入的報文須要匹配當前規則。
out:表示數據包由哪一個接口(網卡)流出,咱們能夠設置經過哪塊網卡流出的報文須要匹配當前規則。
source:表示規則對應的源頭地址,能夠是一個IP,也能夠是一個網段。
destination:表示規則對應的目標地址。能夠是一個IP,也能夠是一個網段。
iptables -nvxL -- line-number -v 顯示更詳細 -n 不讓IP進行反解 -- line-number便可顯示規則的編號 -x 選項表示顯示計數器的精確值 iptables -t 表名 -L 鏈名 查看指定表的指定鏈中的規則。
[root@node3 ~]# iptables -t filter -I INPUT -s 192.168.246.132 -j DROP [root@node3 ~]# iptables -t filter -nvL Chain INPUT (policy ACCEPT 84 packets, 6144 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- * * 192.168.246.132 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 47 packets, 5260 bytes) pkts bytes target prot opt in out source destination [root@node3 ~]#
-I選項,指明將"規則"插入至哪一個鏈中,-I表示insert,即插入的意思,因此-I INPUT表示將規則插入於INPUT鏈中,即添加規則之意。
-s選項,指明"匹配條件"中的"源地址",即若是報文的源地址屬於-s對應的地址,那麼報文則知足匹配條件,-s爲source之意,表示源地址。
使用-j選項,指明當"匹配條件"被知足時,所對應的動做,上例中指定的動做爲DROP,在上例中,當報文的源地址爲192.168.1.146時,報文則被DROP(丟棄)
[root@node3 ~]# iptables -A INPUT -s 192.168.246.132 -j ACCEPT [root@node3 ~]# iptables -t filter -nvL Chain INPUT (policy ACCEPT 12 packets, 880 bytes) pkts bytes target prot opt in out source destination 91 7644 DROP all -- * * 192.168.246.132 0.0.0.0/0 0 0 ACCEPT all -- * * 192.168.246.132 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 6 packets, 760 bytes) pkts bytes target prot opt in out source destination [root@node3 ~]#
使用-A選項,表示在對應的鏈中"追加規則",-A爲append之意
-I選項進行插入規則操做,-I INPUT 2表示在INPUT鏈中新增規則,新增的規則的編號爲2
方法一:根據規則的編號去刪除規則
[root@node3 ~]# iptables --line -vnL INPUT Chain INPUT (policy ACCEPT 910 packets, 83584 bytes) num pkts bytes target prot opt in out source destination 1 363 30492 ACCEPT all -- * * 192.168.246.132 0.0.0.0/0 2 227 19068 DROP all -- * * 192.168.246.132 0.0.0.0/0 3 0 0 ACCEPT all -- * * 192.168.246.132 0.0.0.0/0 [root@node3 ~]# iptables -t filter -D INPUT 3 [root@node3 ~]# iptables --line -vnL INPUT Chain INPUT (policy ACCEPT 6 packets, 428 bytes) num pkts bytes target prot opt in out source destination 1 363 30492 ACCEPT all -- * * 192.168.246.132 0.0.0.0/0 2 227 19068 DROP all -- * * 192.168.246.132 0.0.0.0/0 [root@node3 ~]#
方法二:根據具體的匹配條件與動做刪除規則
[root@node3 ~]# iptables -D INPUT -s 192.168.246.132 -j DROP [root@node3 ~]# iptables -t filter -nvL Chain INPUT (policy ACCEPT 13 packets, 948 bytes) pkts bytes target prot opt in out source destination 363 30492 ACCEPT all -- * * 192.168.246.132 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 8 packets, 1040 bytes) pkts bytes target prot opt in out source destination [root@node3 ~]#
[root@node3 ~]# iptables -t filter -R INPUT 1 -s 192.168.246.132 -j DROP [root@node3 ~]# iptables -t filter -nvL Chain INPUT (policy ACCEPT 6 packets, 428 bytes) pkts bytes target prot opt in out source destination 0 0 DROP all -- * * 192.168.246.132 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 512 bytes) pkts bytes target prot opt in out source destination [root@node3 ~]#
-R選項表示修改指定的鏈
使用iptables-save並不能保存當前的iptables規則,可是能夠將當前的iptables規則以"保存後的格式"輸出到屏幕上。
因此,咱們可使用iptables-save命令,再配合重定向,將規則重定向到/etc/sysconfig/iptables文件中便可。
iptables-save > /etc/sysconfig/iptables
咱們也能夠將/etc/sysconfig/iptables中的規則從新載入爲當前的iptables規則,可是注意,未保存入/etc/sysconfig/iptables文件中的修改將會丟失或者被覆蓋。
使用iptables-restore命令能夠從指定文件中重載規則,示例以下
iptables-restore < /etc/sysconfig/iptables
再次提醒:重載規則時,現有規則將會被覆蓋。
基本匹配條件總結
-s用於匹配報文的源地址,能夠同時指定多個源地址,每一個IP之間用逗號隔開,也能夠指定爲一個網段。 -d用於匹配報文的目標地址,能夠同時指定多個目標地址,每一個IP之間用逗號隔開,也能夠指定爲一個網段。 -p用於匹配報文的協議類型,能夠匹配的協議類型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中還支持icmpv六、mh)。 -i用於匹配報文是從哪一個網卡接口流入本機的,因爲匹配條件只是用於匹配報文流入的網卡,因此在OUTPUT鏈與POSTROUTING鏈中不能使用此選項。 -o用於匹配報文將要從哪一個網卡接口流出本機,於匹配條件只是用於匹配報文流出的網卡,因此在INPUT鏈與PREROUTING鏈中不能使用此選項。
擴展匹配條件總結
tcp擴展模塊
經常使用的擴展匹配條件以下:
-p tcp -m tcp --sport 用於匹配tcp協議報文的源端口,可使用冒號指定一個連續的端口範圍 -p tcp -m tcp --dport 用於匹配tcp協議報文的目標端口,可使用冒號指定一個連續的端口範圍
multiport擴展模塊
經常使用的擴展匹配條件以下:
-p tcp -m multiport --sports 用於匹配報文的源端口,能夠指定離散的多個端口號,端口之間用"逗號"隔開 -p udp -m multiport --dports 用於匹配報文的目標端口,能夠指定離散的多個端口號,端口之間用"逗號"隔開