「iptables」是Linux作業系統常用的netfilter防火牆規則的管理指令。對於剛接觸iptables的使用者來說,經常會不知道該如何把用iptables設定好的防火牆規則進行「存檔」,讓它在下次開機時也可以保留上一次開機所設定的規則。事實上,不同的Linux發行版有不同的iptables的儲存方式,本篇文章將會介紹Ubuntu Server的iptables儲存方式。



iptables範例

我們先來做個iptables的範例。提醒一下,這個範例看看就好,不要照做哦!怕各位不小心把自己的防火牆規則改亂了。

首先,為了方便說明,先用以下指令將iptables已經設定的防火牆規則和所有表格的方針(policy)清空。

sudo iptables -P INPUT ACCEPT && sudo iptables -P FORWARD ACCEPT && sudo iptables -P OUTPUT ACCEPT && sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F

ubuntu-server-iptables-save-permanently

使用以下指令可以查看目前的iptables防火牆過濾規則(filter表)。

sudo iptables -L

ubuntu-server-iptables-save-permanently

假設我們的伺服器運行SSH(監聽TCP連接埠22)和HTTP/HTTPS(監聽TCP連接埠80和443)服務,可以執行以下的幾個指令,來使防火牆只允許TCP連接埠22、80和443的連入。

如果您是透過SSH連線,操作遠端Linux作業系統來執行這邊的指令,建議先將指令做成一個Bash檔案來執行。也要留意一下指令的執行順序,避免遠端主機從此連不上……

Bash檔案內容如下:

#!/bin/bash

sudo iptables -A INPUT -i lo -j ACCEPT                                           #允許所有來自本機的封包
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT            #允許已經建立連線或是有與其它連線相關連的封包。
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT   #允許TCP連接埠22的建立連線封包。
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT   #允許TCP連接埠80的建立連線封包。
sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT  #允許TCP連接埠80的建立連線封包。
sudo iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT                   #允許ICMP封包(允許「ping」指令)。
sudo iptables -P INPUT DROP                                                      #過濾所有不在規則中的連入封包。
sudo iptables -P FORWARD DROP                                                    #過濾所有不在規則中的轉遞封包。

執行以上的Bash檔案後,再執行以下指令來確認,

sudo iptables -L

ubuntu-server-iptables-save-permanently

iptables存檔

基本存檔與讀檔的方式

將iptables的設定給儲存下來的基本方式,是使用「iptables-save」這個指令。例如以下指令,可以直接在終端機上顯示iptables的目前的所有設定:

sudo iptables-save

ubuntu-server-iptables-save-permanently

利用終端機提供的「>」功能,可以將「iptables-save」指令的輸出結果直接導到某個檔案中儲存。例如以下指令,可以將iptables的設定存成「iptables.conf」檔案:

sudo iptables-save > iptables.conf

ubuntu-server-iptables-save-permanently

接著搭配「iptables-restore」指令和終端機提供的「<」功能,可以將先前的iptables存檔作為「iptables-restore」指令的標準輸入(stdin),來使iptables套用先前存下來的設定。例如以下指令,可以讓iptables套用先前「iptables.conf」檔案中的設定:

sudo iptables-restore < iptables.conf

ubuntu-server-iptables-save-permanently

也就是說,只要把以上的「iptables-restore」指令,放在開機會自動執行的設定檔中執行,就可以達到永久保存iptables設定的效果了!如果您還有使用IPv6的「ip6tables」的話,對應的指令為「ip6tables-save」和「ip6tables-restore」。

更方便的作法──iptables-persistent

Ubuntu Server提供了「iptables-persistent」套件,可以簡化剛才提到的「基本存檔與讀檔的方式」,支援iptables和ipv6tables,完全不需要手動使用「iptables-save」等相關指令。

執行以下指令,即可安裝「iptables-persistent」套件:

sudo apt install iptables-persistent

ubuntu-server-iptables-save-permanently

「iptables-persistent」套件在安裝時,就會跳出是否要儲存目前iptables和ipv6tables的畫面。

ubuntu-server-iptables-save-permanently

ubuntu-server-iptables-save-permanently

選擇「Yes」的話,就可以把iptables或ip6tables的設定,分別透過「iptables-save」和「ip6tables-save」指令,儲存到「/etc/iptables/rules.v4」和「/etc/iptables/rules.v6」檔案中。如此一來,Ubuntu Server在開機時,就會自動使用「iptables-restore」和「ip6tables-restore」指令來套用「/etc/iptables/rules.v4」和「/etc/iptables/rules.v6」中儲存的設定。

若您在安裝「iptables-persistent」套件之後,又去修改了iptables或是ipv6tables的設定,並且想永久保存下來的話,可以執行以下指令,來讓「iptables-persistent」套件重新詢問是否要以目前的iptables和ipv6tables設定來修改「/etc/iptables/rules.v4」和「/etc/iptables/rules.v6」檔案。

sudo dpkg-reconfigure iptables-persistent