1. 程式人生 > >iptables(三)iptables規則管理(增、刪、改)

iptables(三)iptables規則管理(增、刪、改)

學會 人的 pan 刪除 accept 查看命令 風格 啟動 字段

上一篇文章中,我們已經學會了怎樣使用iptables命令查看規則,那麽這篇文章我們就來總結一下,怎樣管理規則。

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

註意:在參照本文進行iptables實驗時,請務必在個人的測試機上進行,因為如果iptables規則設置不當,有可能使你無法連接到遠程主機中。

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

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

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

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

首先,查看一下filter表中的INPUT鏈中的規則,查看規則的相關命令在前文已經總結了,此處不再贅述,如果你忘了,請回顧前文。

使用如下命令查看filter表INPUT鏈的規則,下圖中的規則為centos6默認添加的規則。

技術分享圖片

註意:在參照本文進行iptables實驗時,請務必在個人的測試機上進行。

為了準備一個從零開始的環境,我們將centos6默認提供的規則清空,以便我們進行實驗,使用iptables -F INPUT命令清空filter表INPUT鏈中的規則,後面我們會單獨對清除規則的相關命令進行總結,此處不用糾結此命令。

技術分享圖片

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

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

技術分享圖片

增加規則

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

技術分享圖片

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

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

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

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

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

那麽此時,我們再通過192.168.1.146去ping主機156,看看能否ping通。

技術分享圖片

如上圖所示,ping 156主機時,PING命令一直沒有得到回應,看來我們的iptables規則已經生效了,ping發送的報文壓根沒有被156主機接受,而是被丟棄了,所以更不要說什麽回應了,好了,我們已經成功的配置了一條iptables規則,看來,我們已經入門了。

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

技術分享圖片

此刻,我們來做一個實驗。

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

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

技術分享圖片

上圖中的命令並沒有使用-t選項指定filter表,我們一直在說,不使用-t選項指定表時表示默認操作filter表。

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

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

執行完添加規則的命令後,再次查看INPUT鏈,發現規則已經成功"追加"至INPUT鏈的末尾,那麽現在,第一條規則指明了丟棄所有來自192.168.1.146的報文,第二條規則指明了接受所有來自192.168.1.146的報文,那麽結果到底是怎樣的呢?實踐出真知,在146主機上再次使用ping命令向156主機發送報文,發現仍然是ping不通的,看來第二條規則並沒有生效。

技術分享圖片

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

聰明如你一定在猜想,發生上述情況,會不會與規則的先後順序有關呢?測試一下不就知道了,我們再添加一條規則,新規則仍然規定接受所有來自192.168.1.146主機中的報文,只是這一次,我們將新規則添加至INPUT鏈的最前面試試。

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

技術分享圖片

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

技術分享圖片

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

技術分享圖片

看來,規則的順序很重要。

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

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

技術分享圖片

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

技術分享圖片

仍然使用-I選項進行插入規則操作,-I INPUT 2表示在INPUT鏈中新增規則,新增的規則的編號為2,好了,自己動手試試吧。

刪除規則

註意:在參照本文進行iptables實驗時,請務必在個人的測試機上進行。

此刻,如果我們想要刪除filter表中INPUT中的一條規則,該怎麽做呢?

有兩種辦法

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

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

那麽我們先看看方法一,先查看一下filter表中INPUT鏈中的規則

技術分享圖片

假如我們想要刪除上圖中的第3條規則,則可以使用如下命令。

技術分享圖片

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

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

技術分享圖片

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

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

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

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

iptables -t 表名 -F

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

修改規則

註意:在參照本文進行iptables實驗時,請務必在個人的測試機上進行。

那麽,我們怎樣修改某條規則中的動作呢?比如,我想把如下規則中的動作從DROP改為REJECT,改怎麽辦呢?

技術分享圖片

我們可以使用-R選項修改指定的鏈中的規則,在修改規則時指定規則對應的編號即可(有坑,慎行),示例命令如下

技術分享圖片

上例中,-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表達的意思好像更堅決一點,我們再次從146主機上向156主機上發起ping請求,看看與之前動作為DROP時有什麽不同。

技術分享圖片

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

其實,我們還可以修改指定鏈的"默認策略",沒錯,就是下圖中標註的默認策略。

技術分享圖片

每張表的每條鏈中,都有自己的默認策略,我們也可以理解為默認"動作"。

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

技術分享圖片

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

保存規則

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

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

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

技術分享圖片

如上圖所示,文件中保存了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

再次提醒:重載規則時,現有規則將會被覆蓋。

命令小結

上文已經詳細的舉例並描述了怎樣進行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.1.146 -j DROP

  

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

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

命令語法:iptables -t 表名 -F 鏈名
示例:iptables -t filter -F INPUT

  

刪除指定表中的所有規則,執行時需三思。

命令語法:iptables -t 表名 -F
示例:iptables -t filter -F

  

修改規則

註意點:如果使用-R選項修改規則中的動作,那麽必須指明原規則中的原匹配條件,例如源IP,目標IP等。

修改指定表中指定鏈的指定規則,-R選項表示修改對應鏈中的規則,使用-R選項時要同時指定對應的鏈以及規則對應的序號,並且規則中原本的匹配條件不可省略。

命令語法:iptables -t 表名 -R 鏈名 規則序號 規則原本的匹配條件 -j 動作
示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT

  

上述示例表示修改filter表中INPUT鏈的第3條規則,將這條規則的動作修改為ACCEPT, -s 192.168.1.146為這條規則中原本的匹配條件,如果省略此匹配條件,修改後的規則中的源地址可能會變為0.0.0.0/0。

其他修改規則的方法:先通過編號刪除規則,再在原編號位置添加一條規則。

修改指定表的指定鏈的默認策略(默認動作),並非修改規則,可以使用如下命令。

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

  

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

保存規則

保存規則命令如下,表示將iptables規則保存至/etc/sysconfig/iptables文件中,如果對應的操作沒有保存,那麽當重啟iptables服務以後

service iptables save

  

註意點:centos7中使用默認使用firewalld,如果想要使用上述命令保存規則,需要安裝iptables-services,具體配置過程請回顧上文。

或者使用如下方法保存規則

iptables-save > /etc/sysconfig/iptables

  

可以使用如下命令從指定的文件載入規則,註意:重載規則時,文件中的規則將會覆蓋現有規則。

iptables-restore < /etc/sysconfig/iptables

  

好了,這篇文章已經總結了怎樣添加、刪除、修改 iptables規則,與前文結合起來,我們已經掌握了對iptables規則的"增刪改查",同時,這篇文章也總結了如何設置鏈的默認策略,以及怎樣保存iptables規則。

iptables(三)iptables規則管理(增、刪、改)