我們把查看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的步驟
上述配置過程只需一次,以后即可在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選項表示清空對應鏈中的規則,執行時需三思。
命令語法:iptables -t 表名 -F 鏈名
示例:iptables -t filter -F INPUT
刪除指定表中的所有規則,執行時需三思。
修改規則
注意點:如果使用-R選項修改規則中的動作,那么必須指明原規則中的原匹配條件,例如源IP,目標IP等。
修改指定表中指定鏈的指定規則,-R選項表示修改對應鏈中的規則,使用-R選項時要同時指定對應的鏈以及規則對應的序號,並且規則中原本的匹配條件不可省略。
命令語法:iptables -t 表名 -R 鏈名 規則序號 規則原本的匹配條件 -j 動作
示例:iptables -t filter -R INPUT 3 -s 192.168.15.131 -j ACCEPT
上述示例表示修改filter表中INPUT鏈的第3條規則,將這條規則的動作修改為ACCEPT, -s 192.168.15.131為這條規則中原本的匹配條件,如果省略此匹配條件,修改后的規則中的源地址可能會變為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