iptables
是Linux作業系統常用的netfilter防火牆規則的管理指令。對於剛接觸iptables的使用者來說,經常會不知道該如何把用iptables設定好的防火牆規則進行「存檔」,讓它在下次開機時也可以保留上一次開機所設定的規則。事實上,不同的Linux發行版有不同的iptables的儲存方式,本篇文章將會介紹Ubuntu Server的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
指令,放在開機會自動執行的設定檔中執行,就可以達到永久保存iptables設定的效果了!如果您還有使用IPv6的ip6tables的話,對應的指令為ip6tables-save
和ip6tables-restore
。
更方便的作法──iptables-persistent
Ubuntu Server提供了iptables-persistent
套件,可以簡化剛才提到的「基本存檔與讀檔的方式」,支援iptables和ipv6tables,完全不需要手動使用iptables-save
等相關指令。
執行以下指令,即可安裝iptables-persistent
套件:
iptables-persistent
套件在安裝時,就會跳出是否要儲存目前iptables和ipv6tables的畫面。
選擇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
檔案。