iptables
是Linux作業系統常用的netfilter防火牆規則的管理指令。對於剛接觸iptables的使用者來說,經常會不知道該如何把用iptables設定好的防火牆規則進行「存檔」,讓它在下次開機時也可以保留上一次開機所設定的規則。
iptables範例
我們先來做個iptables的範例。提醒一下,這個範例看看就好,不要照做哦!怕各位不小心把自己的防火牆規則改亂了。
首先,為了方便說明,先用以下指令將iptables已經設定的防火牆規則和所有表格的方針(policy)清空。
使用以下指令可以查看目前的iptables防火牆過濾規則(filter表)。
假設我們的伺服器運行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檔案後,再執行以下指令來確認,
iptables存檔
基本存檔與讀檔的方式
將iptables的設定給儲存下來的基本方式,是使用iptables-save
這個指令。例如以下指令,可以直接在終端機上顯示iptables的目前的所有設定:
利用終端機提供的>
功能,可以將iptables-save
指令的輸出結果直接導到某個檔案中儲存。例如以下指令,可以將iptables的設定存成iptables.conf
檔案:
接著搭配iptables-restore
指令和終端機提供的<
功能,可以將先前的iptables存檔作為iptables-restore
指令的標準輸入(stdin),來使iptables套用先前存下來的設定。例如以下指令,可以讓iptables套用先前iptables.conf
檔案中的設定:
也就是說,只要把以上的iptables-restore
指令,放在開機會自動執行的設定檔或是crontab中執行,就可以達到永久保存iptables設定的效果了!如果您還有使用IPv6的ip6tables的話,對應的指令為ip6tables-save
和ip6tables-restore
。
在crontab中載入iptables設定
如果要透過crontab設定iptables,執行以下指令來編輯root的crontab:
然後加入如下面這兩行設定。請自行更改為正確的iptables設定檔的路徑。
@reboot iptables-restore < "/path/to/iptables.conf" @reboot ip6tables-restore < "/path/to/ip6tables.conf"
改完後保存即可。此後只要執行iptables-restore
指令和ip6tables-save
指令將iptables設定存到crontab中指定的路徑,就可以永久保存iptables的設定。