iptables是Linux作業系統常用的netfilter防火牆規則的管理指令。對於剛接觸iptables的使用者來說,經常會不知道該如何把用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

iptables-save-permanently

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

sudo iptables -L

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連接埠443的建立連線封包。
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

iptables-save-permanently

iptables存檔

基本存檔與讀檔的方式

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

sudo iptables-save

iptables-save-permanently

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

sudo iptables-save > iptables.conf

iptables-save-permanently

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

sudo iptables-restore < iptables.conf

iptables-save-permanently

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

在crontab中載入iptables設定

如果要透過crontab設定iptables,執行以下指令來編輯root的crontab:

sudo crontab -e

然後加入如下面這兩行設定。請自行更改為正確的iptables設定檔的路徑。

@reboot iptables-restore < "/path/to/iptables.conf"
@reboot ip6tables-restore < "/path/to/ip6tables.conf"

改完後保存即可。此後只要執行iptables-restore指令和ip6tables-save指令將iptables設定存到crontab中指定的路徑,就可以永久保存iptables的設定。