iptables詳解(三):iptables規則管理


我們把查看iptables規則的操作比作"增刪改查"當中的"查",那么在這篇文章中,我們就聊聊怎樣對iptables進行"增、刪、改"操作。

首先,我們來回顧一下什么是iptables的規則。

之前打過一個比方,每條"鏈"都是一個"關卡",每個通過這個"關卡"的報文都要匹配這個關卡上的規則,如果匹配,則對報文進行對應的處理,比如說,你我二人此刻就好像兩個"報文",你我二人此刻都要入關,可是城主有命,只有器宇軒昂之人才能入關,不符合此條件的人不能入關,於是守關將士按照城主制定的"規則",開始打量你我二人,最終,你順利入關了,而我已被拒之門外,因為你符合"器宇軒昂"的標准,所以把你"放行"了,而我不符合標准,所以沒有被放行,其實,"器宇軒昂"就是一種"匹配條件","放行"就是一種"動作","匹配條件"與"動作"組成了規則。

只不過,在iptables的世界中,最常用的匹配條件並不是"器宇軒昂",而是報文的"源地址"、"目標地址"、"源端口"、"目標端口"等,在iptables的世界中,最常用的動作有ACCEPT(接受)、DROP(丟棄)、REJECT(拒絕),其中ACCEPT就與我們舉例中的"放行"類似,但是,我們剛才提到的這些並不是全部的匹配條件與動作,只是最常用的一些罷了,具體的匹配條件與動作不是我們今天討論的重點,我們會在以后的文章中再做總結。

好了,我們已經回顧了規則的概念,並且已經明白了,規則大致由兩個邏輯單元組成,匹配條件與動作,那么多說無益,我們來動手定義一條規則,此處仍然以filter表中的INPUT鏈為例,因為filter表負責"過濾"功能,而所有發往本機的報文如果需要被過濾,首先會經過INPUT鏈(PREROUTING鏈沒有過濾功能),這與我們所比喻的"入關"場景非常相似,所以,使用filter表的INPUT鏈為例,有助於我們進行理解。

首先,查看一下filter表中的INPUT鏈中的規則,查看規則的相關命令在前文已經總結了,

使用如下命令查看filter表INPUT鏈的規則,

 iptables -t filter -L INPUT

便我們進行實驗,使用iptables -F INPUT命令清空filter表INPUT鏈中的規則,后面我們會單獨對清除規則的相關命令進行總結

 

清空INPUT鏈以后,filter表中的INPUT鏈已經不存在任何的規則,但是可以看出,INPUT鏈的默認策略是ACCEPT,也就是說,INPUT鏈默認"放行"所有發往本機的報文,當沒有任何規則時,會接受所有報文,當報文沒有被任何規則匹配到時,也會默認放行報文。

那么此刻,我們就在另外一台機器上,使用ping命令,向當前機器發送報文,如下圖所示,ping命令可以得到回應,證明ping命令發送的報文已經正常的發送到了防火牆所在的主機,ping命令所在機器IP地址為192.168.15.132,當前測試防火牆主機的IP地址為192.168.15.132,我們就用這樣的環境,對iptables進行操作演示。

 

 ping之后發現數據發生變化,說明接收到數據

增加規則

那么此處,我們就在132上配置一條規則,拒絕192.168.15.131上的所有報文訪問當前機器,之前一直在說,規則由匹配條件與動作組成,那么"拒絕192.168.15.131上的所有報文訪問當前機器"這條規則中,報文的"源地址為192.168.15.131"則屬於匹配條件,如果報文來自"192.168.15.131",則表示滿足匹配條件,而"拒絕"這個報文,就屬於對應的動作,好了,那么怎樣用命令去定義這條規則呢?使用如下命令即可

 

 

上圖中,使用 -t選項指定了要操作的表,此處指定了操作filter表,與之前的查看命令一樣,不使用-t選項指定表時,默認為操作filter表。

使用-I選項,指明將"規則"插入至哪個鏈中,-I表示insert,即插入的意思,所以-I INPUT表示將規則插入於INPUT鏈中,即添加規則之意。

使用-s選項,指明"匹配條件"中的"源地址",即如果報文的源地址屬於-s對應的地址,那么報文則滿足匹配條件,-s為source之意,表示源地址。

使用-j選項,指明當"匹配條件"被滿足時,所對應的動作,上例中指定的動作為DROP,在上例中,當報文的源地址為192.168.15.131時,報文則被DROP(丟棄)。

再次查看filter表中的INPUT鏈,發現規則已經被添加了,在iptables中,動作被稱之為"target",所以,上圖中taget字段對應的動作為DROP。

 那么此時,我們再通過192.168.15.131去ping主機132,看看能否ping通

 

如上圖所示無法ping 通

還記得我們在前文中說過的"計數器"嗎?此時,我們再次查看iptables中的規則,可以看到,已經有24個包被對應的規則匹配到,總計大小2016bytes。

 

 現在INPUT鏈中已經存在了一條規則,它拒絕了所有來自192.168.15.131主機中的報文,如果此時,我們在這條規則之后再配置一條規則,后面這條規則規定,接受所有來自192.168.15.131主機中的報文,那么,iptables是否會接受來自131主機的報文呢?

使用如下命令在filter表的INPUT鏈中追加一條規則,這條規則表示接受所有來自192.168.15.131的發往本機的報文。

 

 

上圖中,使用-A選項,表示在對應的鏈中"追加規則",-A為append之意,所以,-A INPUT則表示在INPUT鏈中追加規則,而之前示例中使用的-I選項則表示在鏈中"插入規則",它們的本意都是添加一條規則,只是-A表示在鏈的尾部追加規則,-I表示在鏈的首部插入規則而已。

使用-j選項,指定當前規則對應的動作為ACCEPT。

執行完添加規則的命令后,再次查看INPUT鏈,發現規則已經成功"追加"至INPUT鏈的末尾,第一條規則指明了丟棄所有來自192.168.15.131的報文,第二條規則指明了接受所有來自192.168.15.131的報文.實踐出真知,在131主機上再次使用ping命令向132主機發送報文,發現仍然是ping不通的,看來第二條規則並沒有生效。

 

 

 而且從上圖中第二條規則的計數器可以看到,根本沒有任何報文被第二條規則匹配到。

我們再添加一條規則,新規則仍然規定接受所有來自192.168.15.131主機中的報文,只是這一次,我們將新規則添加至INPUT鏈的最前面試試。

在添加這條規則之前,我們先把131上的ping命令強制停止了,然后使用如下命令,在filter表的INPUT鏈的前端添加新規則。

 

 

 好了,現在第一條規則就是接受所有來自192.168.15.131的報文,而且此時計數是0,此刻,我們再從131上向156發起ping請求。

 

 131上已經可以正常的收到響應報文了,那么回到132查看INPUT鏈的規則,第一條規則的計數器已經顯示出了匹配到的報文數量。

 

 

來,規則的順序很重要。

如果報文已經被前面的規則匹配到,iptables則會對報文執行對應的動作,即使后面的規則也能匹配到當前報文,很有可能也沒有機會再對報文執行相應的動作了,就以上圖為例,報文先被第一條規則匹配到了,於是當前報文被"放行"了,因為報文已經被放行了,所以,即使上圖中的第二條規則即使能夠匹配到剛才"放行"的報文,也沒有機會再對剛才的報文進行丟棄操作了。這就是iptables的工作機制。

之前在總結查看命令時提到過,使用--line-number選項可以列出規則的序號,如下圖所示

 

 我們也可以在添加規則時,指定新增規則的編號,這樣我們就能在任意位置插入規則了,我們只要把剛才的命令稍作修改即可,如下。

 

仍然使用-I選項進行插入規則操作,-I INPUT 2表示在INPUT鏈中新增規則,新增的規則的編號為2

刪除規則

有兩種辦法

方法一:根據規則的編號去刪除規則

方法二:根據具體的匹配條件與動作刪除規則

先查看一下filter表中INPUT鏈中的規則

 

 

 

 使用了-t選項指定了要操作的表(沒錯,省略-t默認表示操作filter表),使用-D選項表示刪除指定鏈中的某條規則,-D INPUT 3表示刪除INPUT鏈中的第3條規則。

我們也可以根據具體的匹配條件與動作去刪除規則,比如,刪除下圖中源地址為192.168.15.131,動作為ACCEPT的規則,於是,刪除規則的命令如下。

 

 上圖中,刪除對應規則時,仍然使用-D選項,-D INPUT表示刪除INPUT鏈中的規則,剩下的選項與我們添加規則時一毛一樣,-s表示以對應的源地址作為匹配條件,-j ACCEPT表示對應的動作為接受,所以,上述命令表示刪除INPUT鏈中源地址為192.168.15.131,動作為ACCEPT的規則。

注意:如果有相同的兩條規則時,默認刪除第一條

而刪除指定表中某條鏈中的所有規則的命令,我們在一開始就使用到了,就是"iptables -t 表名 -F 鏈名"

-F選項為flush之意,即沖刷指定的鏈,即刪除指定鏈中的所有規則,但是注意,此操作相當於刪除操作,在沒有保存iptables規則的情況下,請慎用。

其實,-F選項不僅僅能清空指定鏈上的規則,其實它還能清空整個表中所有鏈上的規則,不指定鏈名,只指定表名即可刪除表中的所有規則,命令如下

iptables -t 表名 -F

不過再次強調,在沒有保存iptables規則時,請勿隨便清空鏈或者表中的規則,除非你明白你在干什么。

修改規則

比如,我想把如下規則中的動作從DROP改為REJECT,改怎么辦呢?

 

上例中,-R選項表示修改指定的鏈,使用-R INPUT 1表示修改INPUT鏈的第1條規則,使用-j REJECT表示將INPUT鏈中的第一條規則的動作修改為REJECT,注意:上例中, -s選項以及對應的源地址不可省略,即使我們已經指定了規則對應的編號,但是在使用-R選項修改某個規則時,必須指定規則對應的原本的匹配條件(如果有多個匹配條件,都需要指定)。

如果上例中的命令沒有使用-s指定對應規則中原本的源地址,那么在修改完成后,你修改的規則中的源地址會自動變為0.0.0.0/0(此IP表示匹配所有網段的IP地址),而此時,-j對應的動作又為REJECT,所以在執行上述命令時如果沒有指明規則原本的源地址,那么所有IP的請求都被拒絕了(因為沒有指定原本的源地址,當前規則的源地址自動變為0.0.0.0/0),如果你正在使用ssh遠程到服務器上進行iptables設置,那么你的ssh請求也將會被阻斷。

既然使用-R選項修改規則時,必須指明規則原本的匹配條件,那么我們則可以理解為,只能通過-R選項修改規則對應的動作了,所以我覺得,如果你想要修改某條規則,還不如先將這條規則刪除,然后在同樣位置再插入一條新規則,這樣更好,當然,如果你只是為了修改某條規則的動作,那么使用-R選項時,不要忘了指明規則原本對應的匹配條件。

我們已經將規則中的動作從DROP改為了REJECT,那么DROP與REJECT有什么不同呢?從字面上理解,DROP表示丟棄,REJECT表示拒絕,REJECT表達的意思好像更堅決一點,我們再次從131主機上向132主機上發起ping請求,看看與之前動作為DROP時有什么不同。

 

 上圖所示,當132主機中的iptables規則對應的動作為REJECT時,從131上進行ping操作時,直接就提示"目標不可達",並沒有像之前那樣卡在那里,看來,REJECT比DROP更加"干脆"。

同時131的主機的規則中有數據產生

 

 我們還可以修改指定鏈的"默認策略"

 

 如上圖,我們查看默認的規則有DROP 也有ACCEPT,每張表的每條鏈中,都有自己的默認策略,我們也可以理解為默認"動作"。

當報文沒有被鏈中的任何規則匹配到時,或者,當鏈中沒有任何規則時,防火牆會按照默認動作處理報文,我們可以修改指定鏈的默認策略

 

此時我們發現已經修改filter表中的FORWARD鏈的默認策略

使用-t指定要操作的表,使用-P選項指定要修改的鏈,上例中,-P FORWARD DROP表示將表中FORWRD鏈的默認策略改為ACCEPT。

保存規則

在默認的情況下,我們對"防火牆"所做出的修改都是"臨時的",換句話說就是,當重啟iptables服務或者重啟服務器以后,我們平常添加的規則或者對規則所做出的修改都將消失,為了防止這種情況的發生,我們需要將規則"保存"。

centos7與centos6中的情況稍微有些不同,我們先說centos6中怎樣保存iptables規則。

centos6中,使用"service iptables save"命令即可保存規則,規則默認保存在/etc/sysconfig/iptables文件中,如果你剛剛安裝完centos6,在剛開始使用iptables時,會發現filter表中會有一些默認的規則,這些默認提供的規則其實就保存在/etc/sysconfig/iptables中,  保存規則的示例如下。

ubuntu中使用iptables-save > /etc/iptabels.up.rules

如上圖所示,文件中保存了filter表中每條鏈的默認策略,以及每條鏈中的規則,由於其他表中並沒有設置規則,也沒有使用過其他表,所以文件中只保存了filter表中的規則。

 

當我們對規則進行了修改以后,如果想要修改永久生效,必須使用service iptables save保存規則,當然,如果你誤操作了規則,但是並沒有保存,那么使用service iptables restart命令重啟iptables以后,規則會再次回到上次保存/etc/sysconfig/iptables文件時的模樣。

 

從現在開始,最好養成及時保存規則的好習慣。

 

centos7中,已經不再使用init風格的腳本啟動服務,而是使用unit文件,所以,在centos7中已經不能再使用類似service iptables start這樣的命令了,所以service iptables save也無法執行,同時,在centos7中,使用firewall替代了原來的iptables service,不過不用擔心,我們只要通過yum源安裝iptables與iptables-services即可(iptables一般會被默認安裝,但是iptables-services在centos7中一般不會被默認安裝),在centos7中安裝完iptables-services后,即可像centos6中一樣,通過service iptables save命令保存規則了,規則同樣保存在/etc/sysconfig/iptables文件中。

此處給出centos7中配置iptables-service的步驟

#配置好yum源以后安裝iptables-service
# yum install -y iptables-services
#停止firewalld
# systemctl stop firewalld
#禁止firewalld自動啟動
# systemctl disable firewalld
#啟動iptables
# systemctl start iptables
#將iptables設置為開機自動啟動,以后即可通過iptables-service控制iptables服務
# systemctl enable iptables

上述配置過程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables規則了。

 

其他通用方法

還可以使用另一種方法保存iptables規則,就是使用iptables-save命令

使用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

命令小結

添加規則

注意點:添加規則時,規則的順序非常重要

 

在指定表的指定鏈的尾部添加一條規則,-A選項表示在對應鏈的末尾添加規則,省略-t選項時,表示默認操作filter表中的規則

命令語法:iptables -t 表名 -A 鏈名 匹配條件 -j 動作
示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP

在指定表的指定鏈的首部添加一條規則,-I選型表示在對應鏈的開頭添加規則

命令語法:iptables -t 表名 -I 鏈名 匹配條件 -j 動作
示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT

在指定表的指定鏈的指定位置添加一條規則

命令語法:iptables -t 表名 -I 鏈名 規則序號 匹配條件 -j 動作
示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT

設置指定表的指定鏈的默認策略(默認動作),並非添加規則。

命令語法:iptables -t 表名 -P 鏈名 動作
示例:iptables -t filter -P FORWARD ACCEPT

上例表示將filter表中FORWARD鏈的默認策略設置為ACCEPT

刪除規則

按照規則序號刪除規則,刪除指定表的指定鏈的指定規則,-D選項表示刪除對應鏈中的規則。

命令語法:iptables -t 表名 -D 鏈名 規則序號
示例:iptables -t filter -D INPUT 3

上述示例表示刪除filter表中INPUT鏈中序號為3的規則。

 按照具體的匹配條件與動作刪除規則,刪除指定表的指定鏈的指定規則。

命令語法:iptables -t 表名 -D 鏈名 匹配條件 -j 動作
示例:iptables -t filter -D INPUT -s 192.168.15.131 -j DROP

上述示例表示刪除filter表中INPUT鏈中源地址為192.168.15.131並且動作為DROP的規則。

 

刪除指定表的指定鏈中的所有規則,-F選項表示清空對應鏈中的規則,執行時需三思。

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM