上一篇文章中,咱們已經學會了怎樣使用iptables命令查看規則,那麼這篇文章咱們就來總結一下,怎樣管理規則。前端
以前,咱們把查看iptables規則的操做比做"增刪改查"當中的"查",那麼在這篇文章中,咱們就聊聊怎樣對iptables進行"增、刪、改"操做。python
注意:在參照本文進行iptables實驗時,請務必在我的的測試機上進行,由於若是iptables規則設置不當,有可能使你沒法鏈接到遠程主機中。面試
首先,咱們來回顧一下什麼是iptables的規則。centos
以前打過一個比方,每條"鏈"都是一個"關卡",每一個經過這個"關卡"的報文都要匹配這個關卡上的規則,若是匹配,則對報文進行對應的處理,好比說,你我二人此刻就好像兩個"報文",你我二人此刻都要入關,但是城主有命,只有器宇軒昂之人才能入關,不符合此條件的人不能入關,因而守關將士按照城主制定的"規則",開始打量你我二人,最終,你順利入關了,而我已被拒之門外,由於你符合"器宇軒昂"的標準,因此把你"放行"了,而我不符合標準,因此沒有被放行,其實,"器宇軒昂"就是一種"匹配條件","放行"就是一種"動做","匹配條件"與"動做"組成了規則。服務器
只不過,在iptables的世界中,最經常使用的匹配條件並非"器宇軒昂",而是報文的"源地址"、"目標地址"、"源端口"、"目標端口"等,在iptables的世界中,最經常使用的動做有ACCEPT(接受)、DROP(丟棄)、REJECT(拒絕),其中ACCEPT就與咱們舉例中的"放行"相似,可是,咱們剛纔提到的這些並非所有的匹配條件與動做,只是最經常使用的一些罷了,具體的匹配條件與動做不是咱們今天討論的重點,咱們會在之後的文章中再作總結。app
好了,咱們已經回顧了規則的概念,而且已經明白了,規則大體由兩個邏輯單元組成,匹配條件與動做,那麼多說無益,咱們來動手定義一條規則,此處仍然以filter表中的INPUT鏈爲例,由於filter表負責"過濾"功能,而全部發往本機的報文若是須要被過濾,首先會通過INPUT鏈(PREROUTING鏈沒有過濾功能),這與咱們所比喻的"入關"場景很是類似,因此,使用filter表的INPUT鏈爲例,有助於咱們進行理解。ssh
首先,查看一下filter表中的INPUT鏈中的規則,查看規則的相關命令在前文已經總結了,此處再也不贅述,若是你忘了,請回顧前文。測試
使用以下命令查看filter表INPUT鏈的規則,下圖中的規則爲centos6默認添加的規則。centos7
注意:在參照本文進行iptables實驗時,請務必在我的的測試機上進行。spa
爲了準備一個從零開始的環境,咱們將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規則。