iptables詳解(4):iptables匹配條件總結之一

所屬分類:IPtables  Linux基礎centos

在本博客中,從理論到實踐,系統的介紹了iptables,若是你想要從頭開始瞭解iptables,能夠查看iptables文章列表,直達連接以下ssh

iptables零基礎快速入門系列tcp

通過前文的總結,咱們已經可以熟練的管理規則了,可是咱們使用過的"匹配條件"少得可憐,以前的示例中,咱們只使用過一種匹配條件,就是將"源地址"做爲匹配條件。工具

那麼這篇文章中,咱們就來了解一下更多的匹配條件,以及匹配條件的更多用法。測試

注意:在參照本文進行iptables實驗時,請務必在我的的測試機上進行,由於若是iptables規則設置不當,有可能使你沒法鏈接到遠程主機中。centos7

匹配條件的更多用法

仍是從咱們最經常使用的"源地址"提及吧,咱們知道,使用-s選項做爲匹配條件,能夠匹配報文的源地址,可是以前的示例中,咱們每次指定源地址,都只是指定單個IP,示例以下。spa

 

其實,咱們也能夠在指定源地址時,一次指定多個,用"逗號"隔開便可,示例以下。3d

 

能夠看出,上例中,一次添加了兩條規則,兩條規則只是源地址對應的IP不一樣,注意,上例中的"逗號"兩側均不能包含空格,多個IP之間必須與逗號相連。blog

除了能指定具體的IP地址,還能指定某個網段,示例以下接口

  

上例表示,若是報文的源地址IP10.6.0.0/16網段內,當報文通過INPUT鏈時就會被DROP掉。

其實,咱們還能夠對匹配條件取反,先看示例,以下。

 

上圖中,使用"! -s 192.168.1.146"表示對 -s 192.168.1.146這個匹配條件取反, -s 192.168.1.146表示報文源IP地址爲192.168.1.146便可知足匹配條件,使用 "!" 取反後則表示,報文源地址IP只要不爲192.168.1.146即知足條件,那麼,上例中規則表達的意思就是,只要發往本機的報文的源地址不是192.168.1.146,就接受報文。

此刻,你猜猜,按照上例中的配置,若是此時從146主機上向防火牆所在的主機發送ping請求,146主機能獲得迴應嗎?(此處不考慮其餘鏈,只考慮filter表的INPUT鏈)

爲了給你思考的空間,我把答案寫的遠一點。

答案是:能,也就是說,按照上例的配置,146主機仍然可以ping通當前主機,爲何呢?咱們來分析一下。

上例中,filter表的INPUT鏈中只有一條規則,這條規則要表達的意思就是:

只要報文的源IP不是192.168.1.146,那麼就接受此報文,可是,某些小夥伴可能會誤會,把上例中的規則理解成以下含義,

只要報文的源IP192.168.1.146,那麼就不接受此報文,這種理解與上述理解看似差異不大,其實徹底不同,這樣理解是錯誤的,上述理解纔是正確的。

換句話說就是,報文的源IP不是192.168.1.146時,會被接收,並不能表明,報文的源IP192.168.1.146時,會被拒絕。

上例中,由於並無任何一條規則指明源IP192.168.1.146時,該執行怎樣的動做,因此,當來自192.168.1.146的報文通過INPUT鏈時,並不能匹配上例中的規則,因而,此報文就繼續匹配後面的規則,但是,上例中只有一條規則,這條規則後面沒有其餘能夠匹配的規則,因而,此報文就會去匹配當前鏈的默認動做(默認策略),而上例中,INPUT鏈的默認動做爲ACCEPT,因此,來自146ping報文就被接收了,若是,把上例中INPUT鏈的默認策略改成DROP,那麼,146的報文將會被丟棄,146上的ping命令將得不到任何迴應,可是若是將INPUT鏈的默認策略設置爲DROP,當INPUT鏈中沒有任何規則時,全部外來報文將會被丟棄,包括咱們ssh遠程鏈接。

好了,咱們經過上例,不只瞭解到了怎樣對匹配條件取反,還加深了咱們對默認策略的瞭解,一箭雙鵰,咱們繼續聊。

匹配條件:目標IP地址

除了能夠經過-s選項指定源地址做爲匹配條件,咱們還可使用-d選項指定"目標地址"做爲匹配條件。

源地址表示報文從哪裏來,目標地址表示報文要到哪裏去。

除了127.0.0.1迴環地址之外,當前機器有兩個IP地址,IP以下。

 

假設,咱們想要拒絕146主機發來的報文,可是咱們只想拒絕146156這個IP發送報文,並不想要防止146101這個IP發送報文,咱們就能夠指定目標地址做爲匹配條件,示例以下。

 

上例表示只丟棄從146發往156這個IP的報文,可是146發往101這個IP的報文並不會被丟棄,若是咱們不指定任何目標地址,則目標地址默認爲0.0.0.0/0,同理,若是咱們不指定源地址,源地址默認爲0.0.0.0/00.0.0.0/0表示全部IP,示例以下。

 

上例表示,全部IP發送往101的報文都將被丟棄。

-s選項同樣,-d選項也可使用"歎號"進行取反,也可以同時指定多個IP地址,使用"逗號"隔開便可。

可是請注意,不論是-s選項仍是-d選項,取反操做與同時指定多個IP的操做不能同時使用。

 

須要明確的一點就是:當一條規則中有多個匹配條件時,這多個匹配條件之間,默認存在""的關係。

說白了就是,當一條規則中存在多個匹配條件時,報文必須同時知足這些條件,纔算作被規則匹配。

就以下例所示,下圖中的規則包含有兩個匹配條件,源地址與目標地址,報文必須同時能被這兩個條件匹配,纔算做被當前規則匹配,也就是說,下例中,報文必須來自146,同時報文的目標地址必須爲101,纔會被以下規則匹配,兩個條件必須同時知足。

 

咱們除了可以使用-s選項和-d選項匹配源IP與目標IP之外,還可以匹配"源端口""目標端口",可是咱們一下子再聊怎樣匹配端口,咱們先聊聊其餘選項。

匹配條件:協議類型

咱們可使用-p選項,指定須要匹配的報文的協議類型。

假設,咱們只想要拒絕來自146tcp類型的請求,那麼能夠進行以下設置

 

上圖中,防火牆拒絕了來自146tcp報文發往156這個IP,那麼咱們來測試一下,咱們在146上使用ssh鏈接101這個IP試試(ssh協議的傳輸層協議屬於tcp協議類型)

 

如上圖所示,ssh鏈接被拒絕了,那麼咱們使用ping命令試試 (ping命令使用icmp協議),看看能不能ping156

 

能夠看到,PING命令能夠ping156,證實icmp協議並無被規則匹配到,只有tcp類型的報文被匹配到了。

那麼,-p選項都支持匹配哪些協議呢?咱們總結一下

centos6中,-p選項支持以下協議類型

tcp, udp, udplite, icmp, esp, ah, sctp

centos7中,-p選項支持以下協議類型

tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh

當不使用-p指定協議類型時,默認表示全部類型的協議都會被匹配到,與使用-p all的效果相同。

匹配條件:網卡接口

咱們再來認識一個新的匹配條件,當本機有多個網卡時,咱們可使用 -i 選項去匹配報文是經過哪塊網卡流入本機的。

咱們先動手作個小例子,對-i選項有一個初步的瞭解之後,再結合理論去看。

當前主機的網卡名稱爲eth4,以下圖

 

假設想要拒絕由網卡eth4流入的ping請求報文,則能夠進行以下設置。

 

上圖中,使用-i選項,指定網卡名稱,使用-p選項,指定了須要匹配的報文協議類型,上例表示丟棄由eth4網卡流入的icmp類型的報文。

是否是很容易理解,可是,咱們須要考慮一個問題,-i選項是用於匹配報文流入的網卡的,也就是說,從本機發出的報文是不可能會使用到-i選項的,由於這些由本機發出的報文壓根不是從網卡流入的,而是要經過網卡發出的,從這個角度考慮,-i選項的使用是有限制的。

爲了更好的解釋-i選項,咱們回顧一下在理論總結中的一張iptables全局報文流向圖,以下。

 

既然-i選項是用於判斷報文是從哪一個網卡流入的,那麼,-i選項只能用於上圖中的PREROUTING鏈、INPUT鏈、FORWARD鏈,這是-i選項的特殊性,由於它只是用於判斷報文是從哪一個網卡流入的,因此只能在上圖中"數據流入流向"的鏈中與FORWARD鏈中存在,而上圖中的"數據發出流向"通過的鏈中,是不可能使用-i選項的,好比上圖中的OUTPUT鏈與POSTROUTING鏈,他們都不能使用-i選項。

 

理解完-i選項,再來理解-o選項就好辦了。

當主機有多塊網卡時,可使用-o選項,匹配報文將由哪塊網卡流出,沒錯,-o選項與-i選項是相對的,-i選項用於匹配報文從哪一個網卡流入,-o選項用於匹配報文將從哪一個網卡流出。

聰明如你,必定想到了,-i選項只能用於PREROUTING鏈、INPUT鏈、FORWARD鏈,那麼-o選項只能用於FORWARD鏈、OUTPUT鏈、POSTROUTING鏈。

由於-o選項是用於匹配報文將由哪一個網卡"流出"的,因此與上圖中的"數據進入流向"中的鏈沒有任何緣分,因此,-o選項只能用於FORWARD鏈、OUTPUT鏈、POSTROUTING鏈中。

看來,FORWARD鏈屬於"中立國",它能同時使用-i選項與-o選項。

擴展匹配條件

好了,如今,咱們就要聊聊,怎樣匹配報文的"源端口""目標端口"

在上文中,咱們總結了"源地址""目標地址"之後,就順便提到了"源端口""目標端口",可是,爲何剛纔不介紹"源端口""目標端口",非要如今介紹呢?這是由於"源端口""目標端口"屬於擴展匹配條件,"源地址""目標地址"屬於基本匹配條件,上文中介紹到的匹配條件,都屬於基本匹配條件,因此,咱們單獨把"源端口""目標端口",放在後面總結,是爲了引出擴展匹配條件的概念。

那麼,先來了解一下,什麼是擴展匹配條件。

不是基本匹配條件的就是擴展匹配條件,這樣說好像是句廢話,咱們能夠這樣理解,基本匹配條件咱們能夠直接使用,而若是想要使用擴展匹配條件,則須要依賴一些擴展模塊,或者說,在使用擴展匹配條件以前,須要指定相應的擴展模塊才行,這樣說不容易明白,咱們作個例子,就可以明白。

咱們知道,sshd服務的默認端口爲22,當咱們使用ssh工具遠程鏈接主機時,默認會鏈接服務端的22號端口,假設,咱們如今想要使用iptables設置一條規則,拒絕來自192.168.1.146ssh請求,咱們就能夠拒絕146上的報文可以發往本機的22號端口,這個時候,就須要用到"目標端口"選項。

使用選項--dport能夠匹配報文的目標端口,--dport意爲destination-port,即表示目標端口。

注意,與以前的選項不一樣,--dport前有兩條"橫槓",並且,使用--dport選項時,必須事先指定了使用哪一種協議,即必須先使用-p選項,示例以下

 

上圖中,咱們就使用了擴展匹配條件--dport,指定了匹配報文的目標端口,若是外來報文的目標端口爲本機的22號端口(ssh默認端口),則拒絕之,而在使用--dport以前,咱們使用-m選項,指定了對應的擴展模塊爲tcp,也就是說,若是想要使用--dport這個擴展匹配條件,則必須依靠某個擴折模塊完成,上例中,這個擴展模塊就是tcp擴展模塊,最終,咱們使用的是tcp擴展模塊中的dport擴展匹配條件。

如今,咱們再回過頭來看看擴展匹配條件的概念,就更加明白了。

擴展匹配條件被使用時,則須要依賴一些擴展模塊,或者說,在使用擴展匹配條件以前,須要指定相應的擴展模塊才行。

如今你明白了嗎? -m tcp表示使用tcp擴展模塊,--dport表示tcp擴展模塊中的一個擴展匹配條件,可用於匹配報文的目標端口。

注意,-p tcp-m tcp並不衝突,-p用於匹配報文的協議,-m 用於指定擴展模塊的名稱,正好,這個擴展模塊也叫tcp

其實,上例中,咱們能夠省略-m選項,示例以下。

 

當使用-p選項指定了報文的協議時,若是在沒有使用-m指定對應的擴展模塊名稱的狀況下,使用了擴展匹配條件,  iptables默認會調用與-p選項對應的協議名稱相同的模塊。

上例中,咱們使用-p選項指定了協議名稱,使用擴展匹配條件--dport指定了目標端口,在使用擴展匹配條件的時候,若是沒有使用-m指定使用哪一個擴展模塊,iptables會默認使用"-m 協議名",而協議名就是-p選項對應的協議名,上例中,-p 對應的值爲tcp,因此默認調用的擴展模塊就爲-m tcp,若是-p對應的值爲udp,那麼默認調用的擴展模塊就爲-m udp

因此,上例中,其實"隱式"的指定了擴展模塊,只是沒有表現出來罷了。

因此,在使用擴展匹配條件時,必定要注意,若是這個擴展匹配條件所依賴的擴展模塊名正好與-p對應的協議名稱相同,那麼則可省略-m選項,不然則不能省略-m選項,必須使用-m選項指定對應的擴展模塊名稱,這樣說可能仍是不是特別明瞭,在後續的舉例中,咱們會更加明瞭的理解這些概念。

"目標端口",就有"源端口",表明"源端口"的擴展匹配條件爲--sport

使用--sport能夠判斷報文是否從指定的端口發出,即匹配報文的源端口是否與指定的端口一致,--sport表示source-port,即表示源端口之意。

由於咱們已經搞明白了dport,那麼sport我就再也不贅述了,示例以下

 

上例中,隱含了"-m tcp"之意,表示使用了tcp擴展模塊的--sport擴展匹配條件。

擴展匹配條件是能夠取反的,一樣是使用"!"進行取反,好比 "! --dport 22",表示目標端口不是22的報文將會被匹配到。

不論是--sport仍是--dsport,都可以指定一個端口範圍,好比,--dport 22:25表示目標端口爲2225之間的全部端口,即22端口、23端口、24端口、25端口,示例以下

也能夠寫成以下圖中的模樣,下圖中第一條規則表示匹配0號到22號之間的全部端口,下圖中的第二條規則表示匹配80號端口以及其之後的全部端口(直到65535)。

 

剛纔聊到的兩個擴展匹配條件都是tcp擴展模塊的,其實,tcp擴展模塊還有一個比較有用的擴展匹配條件叫作"--tcp-flags",可是因爲篇幅緣由,之後再對這個擴展匹配條件進行總結。

藉助tcp擴展模塊的--sport或者--dport均可以指定一個連續的端口範圍,可是沒法同時指定多個離散的、不連續的端口,若是想要同時指定多個離散的端口,須要藉助另外一個擴展模塊,"multiport"模塊。

咱們可使用multiport模塊的--sports擴展條件同時指定多個離散的源端口。

咱們可使用multiport模塊的--dports擴展條件同時指定多個離散的目標端口。

示例以下

 

上圖示例表示,禁止來自146的主機上的tcp報文訪問本機的22號端口、36號端口以及80號端口。

上圖中,"-m multiport --dports 22,36,80"表示使用了multiport擴展模塊的--dports擴展條件,以同時指定了多個離散的端口,每一個端口之間用逗號隔開。

上圖中的-m multiport是不能省略的,若是你省略了-m multiport,就至關於在沒有指定擴展模塊的狀況下,使用了擴展條件("--dports"),那麼上例中,iptables會默認調用"-m tcp",可是,"--dports擴展條件"並不屬於"tcp擴展模塊",而是屬於"multiport擴展模塊",因此,這時就會報錯。

綜上所述,當使用--dports或者--sports這種擴展匹配條件時,必須使用-m指定模塊的名稱。

其實,使用multiport模塊的--sports--dpors時,也能夠指定連續的端口範圍,而且可以在指定連續的端口範圍的同時,指定離散的端口號,示例以下。

 

上例中的命令表示拒絕來自192.168.1.146tcp報文訪問當前主機的22號端口以及8088之間的全部端口號,是否是很方便?有沒有很靈活?

不過須要注意,multiport擴展只能用於tcp協議與udp協議,即配合-p tcp或者-p udp使用。

再回過頭看以前的概念,我想,你應該就更加明白了。

今天,咱們只是初步的認識了擴展模塊,以及擴展匹配條件,還有一些模塊咱們並無總結,好飯不怕晚,後續會有對它們的總結。

小結

這篇文章中,咱們主要總結了一些經常使用的"基礎匹配條件",而且初步的認識了兩個"擴展模塊"以及這兩個擴展模塊中一些經常使用的擴展條件,爲了方便之後回顧,咱們將它們總結以下。

 

首先咱們要明確一點,當規則中同時存在多個匹配條件時,多個條件之間默認存在""的關係,即報文必須同時知足全部條件,才能被規則匹配。

基本匹配條件總結

-s用於匹配報文的源地址,能夠同時指定多個源地址,每一個IP之間用逗號隔開,也能夠指定爲一個網段。

Shell

 

1

2

3

4

#示例以下

iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP

iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT

iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT

 

-d用於匹配報文的目標地址,能夠同時指定多個目標地址,每一個IP之間用逗號隔開,也能夠指定爲一個網段。

Shell

 

1

2

3

4

#示例以下

iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP

iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT

iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT

 

-p用於匹配報文的協議類型,能夠匹配的協議類型tcpudpudpliteicmpespahsctp等(centos7中還支持icmpv6mh)。

Shell

 

1

2

3

#示例以下

iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT

iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT

 

-i用於匹配報文是從哪一個網卡接口流入本機的,因爲匹配條件只是用於匹配報文流入的網卡,因此在OUTPUT鏈與POSTROUTING鏈中不能使用此選項。

Shell

 

1

2

3

#示例以下

iptables -t filter -I INPUT -p icmp -i eth4 -j DROP

iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP

 

-o用於匹配報文將要從哪一個網卡接口流出本機,於匹配條件只是用於匹配報文流出的網卡,因此在INPUT鏈與PREROUTING鏈中不能使用此選項。

Shell

 

1

2

3

#示例以下

iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP

iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP

 

擴展匹配條件總結

咱們來總結一下今天認識的兩個擴展模塊,以及其中的擴展條件(並不是所有,只是這篇文章中介紹過的)

 

tcp擴展模塊

經常使用的擴展匹配條件以下:

-p tcp -m tcp --sport 用於匹配tcp協議報文的源端口,可使用冒號指定一個連續的端口範圍

-p tcp -m tcp --dport 用於匹配tcp協議報文的目標端口,可使用冒號指定一個連續的端口範圍

Shell

 

1

2

3

4

5

6

#示例以下

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

multiport擴展模塊

經常使用的擴展匹配條件以下:

-p tcp -m multiport --sports 用於匹配報文的源端口,能夠指定離散的多個端口號,端口之間用"逗號"隔開

-p udp -m multiport --dports 用於匹配報文的目標端口,能夠指定離散的多個端口號,端口之間用"逗號"隔開

Shell

 

1

2

3

4

5

6

#示例以下

iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

相關文章
相關標籤/搜索