iptables詳解(7):iptables擴展之udp擴展與icmp擴展
前文中總結了iptables的tcp擴展模塊,此處,我們來總結一下另外兩個跟協議有關的常用的擴展模塊,udp擴展與icmp擴展。
udp擴展
我們先來說說udp擴展模塊,這個擴展模塊中能用的匹配條件比較少,只有兩個,就是--sport與--dport,即匹配報文的源端口與目標端口。
沒錯,tcp模塊中也有這兩個選項,名稱都一模一樣。
只不過udp擴展模塊的--sport與--dport是用於匹配UDP協議報文的源端口與目標端口,比如,放行samba服務的137與138這兩個UDP端口,示例如下
前文說明過,當使用擴展匹配條件時,如果未指定擴展模塊,iptables會默認調用與"-p"對應的協議名稱相同的模塊,所以,當使用"-p udp"時,可以省略"-m udp",示例如下。
udp擴展中的--sport與--dport同樣支持指定一個連續的端口範圍,示例如下
上圖中的配置表示137到157之間的所有udp端口全部對外開放,其實與tcp擴展中的使用方法相同。
但是udp中的--sport與--dport也只能指定連續的端口範圍,並不能一次性指定多個離散的端口,沒錯,聰明如你一定想到,使用之前總結過的multiport擴展模塊,即可指定多個離散的UDP端口,如果你忘了multiport模塊怎樣使用,請回顧前文。
總之有了前文的基礎,再理解上述示例就容易多了,此處不再對udp模塊的--sport與--dport進行贅述。
icmp擴展
最常用的tcp擴展、udp擴展已經總結完畢,現在聊聊icmp擴展,沒錯,看到icmp,你肯定就想到了ping命令,因為ping命令使用的就是icmp協議。
ICMP協議的全稱為Internet Control Message Protocol,翻譯為互聯網控制報文協議,它主要用於探測網絡上的主機是否可用,目標是否可達,網絡是否通暢,路由是否可用等。
我們平常使用ping命令ping某主機時,如果主機可達,對應主機會對我們的ping請求做出回應(此處不考慮禁ping等情況),也就是說,我們發出ping請求,對方回應ping請求,雖然ping請求報文與ping回應報文都屬於ICMP類型的報文,但是如果在概念上細分的話,它們所屬的類型還是不同的,我們發出的ping請求屬於類型8的icmp報文,而對方主機的ping回應報文則屬於類型0的icmp報文,根據應用場景的不同,icmp報文被細分為如下各種類型。
從上圖可以看出,所有表示"目標不可達"的icmp報文的type碼為3,而"目標不可達"又可以細分為多種情況,是網絡不可達呢?還是主機不可達呢?再或者是端口不可達呢?所以,為了更加細化的區分它們,icmp對每種type又細分了對應的code,用不同的code對應具體的場景, 所以,我們可以使用type/code去匹配具體類型的ICMP報文,比如可以使用"3/1"表示主機不可達的icmp報文。
上圖中的第一行就表示ping回應報文,它的type為0,code也為0,從上圖可以看出,ping回應報文屬於查詢類(query)的ICMP報文,從大類上分,ICMP報文還能分為查詢類與錯誤類兩大類,目標不可達類的icmp報文則屬於錯誤類報文。
而我們發出的ping請求報文對應的type為8,code為0。
了解完上述概念,就好辦了,我們來看一些應用場景。
假設,我們現在想要禁止所有icmp類型的報文進入本機,那麽我們可以進行如下設置。
上例中,我們並沒有使用任何擴展匹配條件,我們只是使用"-p icmp"匹配了所有icmp協議類型的報文。
如果進行了上述設置,別的主機向我們發送的ping請求報文無法進入防火墻,我們想別人發送的ping請求對應的回應報文也無法進入防火墻。所以,我們既無法ping通別人,別人也無法ping通我們。
假設,此刻需求有變,我們只想要ping通別人,但是不想讓別人ping通我們,剛才的配置就不能滿足我們了,我們則可以進行如下設置(此處不考慮禁ping的情況)
上圖中,使用"-m icmp"表示使用icmp擴展,因為上例中使用了"-p icmp",所以"-m icmp"可以省略,使用"--icmp-type"選項表示根據具體的type與code去匹配對應的icmp報文,而上圖中的"--icmp-type 8/0"表示icmp報文的type為8,code為0才會被匹配到,也就是只有ping請求類型的報文才能被匹配到,所以,別人對我們發起的ping請求將會被拒絕通過防火墻,而我們之所以能夠ping通別人,是因為別人回應我們的報文的icmp type為0,code也為0,所以無法被上述規則匹配到,所以我們可以看到別人回應我們的信息。
因為type為8的類型下只有一個code為0的類型,所以我們可以省略對應的code,示例如下
除了能夠使用對應type/code匹配到具體類型的icmp報文以外,我們還能用icmp報文的描述名稱去匹配對應類型的報文,示例如下
沒錯,上例中使用的 --icmp-type "echo-request"與 --icmp-type 8/0的效果完全相同,參考本文最上方的表格即可獲取對應的icmp類型的描述名稱。
註意:名稱中的"空格"需要替換為"-"。
小結
udp擴展
常用的擴展匹配條件
--sport:匹配udp報文的源地址
--dport:匹配udp報文的目標地址
1 2 3 4 | #示例 iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT #可以結合multiport模塊指定多個離散的端口 |
icmp擴展
常用的擴展匹配條件
--icmp-type:匹配icmp報文的具體類型
1 2 3 4 5 6 | #示例 iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT |
iptables詳解(7):iptables擴展之udp擴展與icmp擴展