iptables詳解(10):iptables自定義鏈

前文中,咱們一直在定義規則,準確的說,咱們一直在iptables的默認鏈中定義規則,那麼此處,咱們就來了解一下自定義鏈web

 

你可能會問,iptables的默認鏈就已經可以知足咱們了,爲何還須要自定義鏈呢?ssh

緣由以下:tcp

當默認鏈中的規則很是多時,不方便咱們管理。spa

想象一下,若是INPUT鏈中存放了200條規則,這200條規則有針對httpd服務的,有針對sshd服務的,有針對私網IP的,有針對公網IP的,假如,咱們忽然想要修改針對httpd服務的相關規則,難道咱們還要從頭看一遍這200條規則,找出哪些規則是針對httpd的嗎?這顯然不合理。.net

 

因此,iptables中,能夠自定義鏈,經過自定義鏈便可解決上述問題。3d

假設,咱們自定義一條鏈,鏈名叫IN_WEB,咱們能夠將全部針對80端口的入站規則都寫入到這條自定義鏈中,當之後想要修改針對web服務的入站規則時,就直接修改IN_WEB鏈中的規則就行了,即便默認鏈中有再多的規則,咱們也不會懼怕了,由於咱們知道,全部針對80端口的入站規則都存放在IN_WEB鏈中,同理,咱們能夠將針對sshd的出站規則放入到OUT_SSH自定義鏈中,將針對Nginx的入站規則放入到IN_NGINX自定義鏈中,這樣,咱們就能想改哪裏改哪裏,不再同擔憂找不到規則在哪裏了。code

 

可是須要注意的是,自定義鏈並不能直接使用,而是須要被默認鏈引用纔可以使用,空口白話說不明白,等到示例時咱們天然會明白。orm

 

說了這麼多,咱們來動手建立一條自定義鏈,使用-N選項能夠建立自定義鏈,示例以下blog

iptables詳解(10):iptables自定義鏈

 

如上圖所示,"-t filter"表示操做的表爲filter表,與以前的示例相同,省略-t選項時,缺省操做的就是filter表。seo

"-N IN_WEB"表示建立一個自定義鏈,自定義鏈的名稱爲"IN_WEB"

自定義鏈建立完成後,查看filter表中的鏈,如上圖所示,自定義鏈已經被建立,並且能夠看到,這條自定義鏈的引用計數爲0 (0 references),也就是說,這條自定義鏈尚未被任何默認鏈所引用,因此,即便IN_WEB中配置了規則,也不會生效,咱們如今不用在乎它,繼續聊咱們的自定義鏈。

 

好了,自定義鏈已經建立完畢,如今咱們就能夠直接在自定義鏈中配置規則了,以下圖所示,咱們配置一些規則用於舉例。

iptables詳解(10):iptables自定義鏈

 

如上圖所示,對自定義鏈的操做與對默認鏈的操做並無什麼不一樣,一切按照操做默認鏈的方法操做自定義鏈便可。

 

如今,自定義鏈中已經有了一些規則,可是目前,這些規則沒法匹配到任何報文,由於咱們並無在任何默認鏈中引用它。

既然IN_WEB鏈是爲了針對web服務的入站規則而建立的,那麼這些規則應該去匹配入站的報文,因此,咱們應該用INPUT鏈去引用它。

固然,自定義鏈在哪裏建立,應該被哪條默認鏈引用,取決於實際的工做場景,由於此處示例的規則是匹配入站報文,因此在INPUT鏈中引用自定義鏈。

示例以下。

iptables詳解(10):iptables自定義鏈

 

上圖中,咱們在INPUT鏈中添加了一條規則,訪問本機80端口的tcp報文將會被這條規則匹配到

而上述規則中的"-j IN_WEB"表示:訪問80端口的tcp報文將由自定義鏈"IN_WEB"中的規則進行處理,沒錯,在以前的示例中,咱們使用"-j"選項指定動做,而此處,咱們將"動做"替換爲了"自定義鏈",當"-j"對應的值爲一個自定義鏈時,就表示被當前規則匹配到的報文將交由對應的自定義鏈處理,具體怎樣處理,取決於自定義鏈中的規則,當IN_WEB自定義鏈被INPUT鏈引用之後,能夠發現,IN_WEB鏈的引用計數已經變爲1,表示這條自定義鏈已經被引用了1次,自定義鏈還能夠引用其餘的自定義鏈,感興趣的話,動手試試吧。

 

在以前的文章中,咱們說過,"動做"在iptables中被稱爲"target",這樣描述並不許確,由於target爲目標之意,報文被規則匹配到之後,target能是一個"動做",target也能是一個"自定義鏈",當target爲一個動做時,表示報文按照指定的動做處理,當target爲自定義鏈時,表示報文由自定義鏈中的規則處理,如今回過頭再理解以前的術語,彷佛更加明瞭了。

 

那麼此刻,咱們在192.168.1.139上嘗試訪問本機的80端口,已經被拒絕訪問,證實剛纔自定義鏈中的規則已經生效了。

iptables詳解(10):iptables自定義鏈

 

 

過了一段時間,咱們發現IN_WEB這個名字不太合適,咱們想要將這條自定義鏈重命名,把名字改爲WEB,能夠嗎?必須能啊,示例以下

 

如上圖所示,使用"-E"選項能夠修改自定義鏈名,如上圖所示,引用自定義鏈處的名稱會自動發生改變。

 

好了,咱們已經可以建立自定義了,那麼怎樣刪除自定義鏈呢?

使用"-X"選項能夠刪除自定義鏈,可是刪除自定義鏈時,須要知足兩個條件:

一、自定義鏈沒有被任何默認鏈引用,即自定義鏈的引用計數爲0。

二、自定義鏈中沒有任何規則,即自定義鏈爲空。

 

那麼,咱們來刪除自定義鏈WEB試試。

iptables詳解(10):iptables自定義鏈

 

如上圖所示,使用"-X"選項刪除對應的自定義鏈,可是上例中,並無成功刪除自定義鏈WEB,提示:Too many links,是由於WEB鏈已經被默認鏈所引用,不知足上述條件1,因此,咱們須要刪除對應的引用規則,示例以下。

iptables詳解(10):iptables自定義鏈

 

如上圖所示,刪除引用自定義鏈的規則後,再次嘗試刪除自定義鏈,提示:Directory not empty,是由於WEB鏈中存在規則,不知足上述條件2,因此,咱們須要清空對應的自定義鏈,示例以下

iptables詳解(10):iptables自定義鏈

 

如上圖所示,使用"-X"選項能夠刪除一個引用計數爲0的、空的自定義鏈。

   

小結

爲了方便之後回顧,咱們將上述命令進行總結。

 

建立自定義鏈

 

 

引用自定義鏈

 

 

 

重命名自定義鏈

 

 

刪除自定義鏈

刪除自定義鏈須要知足兩個條件

一、自定義鏈沒有被引用

二、自定義鏈中沒有任何規則

 

 

好了,自定義鏈就總結到這裏,但願這篇文章可以對你有所幫助~~~各位客官,再見啦,麼麼噠~~~~

相關文章
相關標籤/搜索