Ubuntu Server 防火牆(iptables)設置分享

時不時就會租一台新的 VPS,又或是重灌電腦,紀錄一下 iptables 的設置規則

*所有 iptables 規則僅供參考,為了能淺顯易讀,用詞可能會不精確*

規則設置

INPUT(進來的)

神之牆

那一天,封包回想起了在 iptables 支配下的恐懼

想進到 Server 嗎?請先通過名為 iptables 之檢查,符合條件的封包才進得來,其他通通拒之牆外

以下規則僅供參考,請依據實際情況做調整

必要

允許 Loopback

iptables -A INPUT -i lo -j ACCEPT

是 RELATED 或 ESTABLISHED 狀態的封包嗎?過

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

總該允許 SSH 連線吧

iptables -A INPUT -s xxx.xxx.xxx.xxx/32 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

有錢就是任性,允許特定 IP 區間的 SSH 連線

iptables -A INPUT -p tcp -m iprange --src-range xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

讀大學中嗎?另一種 IP 區間的設置方法

iptables -A INPUT -s 140.xxx.0.0/16 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

可選

允許 ICMP 之封包(如 ping)

iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT

這是一台提供 Web 服務的 Server

iptables -A INPUT -p tcp -m tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT

最後(請設置完所有 INPUT 規則後再到這裡來)

規則外的封包,再見了

iptables -P INPUT DROP

OUTPUT(出去的)

凍住!不許走!

想偷溜?請先通過檢查 🙂

OUTPUT 是針對對外封包作限制,符合條件才放行,其他通通給我坐下來

和 INPUT 一樣,這邊列出規則供參考,實際仍須根據狀況做調整

必要(缺少的話 Server 會哭喔)

允許 Loopback

iptables -A OUTPUT -o lo -j ACCEPT

看你狀態是 RELATED 或 ESTABLISHED 就讓你過吧

iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

狀態是 INVALID 的封包通通給我丟掉

iptables -A OUTPUT -m conntrack --ctstate INVALID -j DROP

DNS 給查嗎

iptables -A OUTPUT -p udp -m udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT

校時也很重要的說

iptables -A OUTPUT -p udp -m udp --dport 123 -m conntrack --ctstate NEW -j ACCEPT

套件常更新,確保 Server 安全

iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW -j ACCEPT

太開放了?限定套件更新伺服器 IP

iptables -A OUTPUT -d xxx.xxx.xxx.xxx/32 -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT

可選

允許 ICMP 對外之封包(如 ping)

iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT

透過 DHCP 取得 IP 的嗎?

iptables -A OUTPUT -d xxx.xxx.xxx.xxx/32 -p udp -m udp --dport 67 -m conntrack --ctstate NEW -j ACCEPT

想 ssh 到外面的世界?

iptables -A OUTPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

想 ssh 到自己的世界?

iptables -A OUTPUT -d xxx.xxx.xxx.xxx/32 -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

丟棄 multicast 類型的封包(Linode VPS 不知為什麼會一直送這類型的封包)

iptables -A OUTPUT -m pkttype --pkt-type multicast -j DROP

最後(請設置完所有 OUTPUT 規則後再到這裡來)

現形吧

iptables -A OUTPUT -j LOG --log-prefix "[iptables] OUTPUT:DROP " --log-level 5 --log-ip-options --log-uid

哎呀呀,好像怪怪的喔,通通不許走

iptables -P OUTPUT DROP

Log 儲存設置

在 OUTPUT 規則的最後,紀錄的未經允許的 OUTPUT 封包,預設情況下會存在

/var/log/kern.log

顯然存在這裡對於未來要查看時,這不是一個很好的地方,因此稍微調整一下吧

創建一個 iptables 目錄來存放相關 log,並設置好正確權限

mkdir /var/log/iptables
chown syslog:adm /var/log/iptables
chmod 750 /var/log/iptables

創建設定檔以重新導向 log(檔名前的數字務必小於 50)

touch /etc/rsyslog.d/20-iptables.conf

寫入相關設定至 /etc/rsyslog.d/20-iptables.conf

# Log kernel generated iptables log messages to file
:msg,contains,"[iptables]" /var/log/iptables/iptables.log

# Stop logging anything that matches the last rule.
& stop

重啟相關服務

service rsyslog restart

創建設定檔以定期整理 iptables 的 log

touch /etc/logrotate.d/iptables

寫入相關設定至 /etc/logrotate.d/iptables

/var/log/iptables/iptables.log
{
	weekly
	missingok
	rotate 4
	compress
	delaycompress
	notifempty
	sharedscripts
	postrotate
		invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true
	endscript
}

這樣就完成囉,需要查看 iptables 的 log 時,可以到 /var/log/iptables 查看

永久保存 iptables 的規則

沒錯!iptables 的規則預設不會永久保存,Server 重啟後原先設定的規則就回歸大自然啦,只要簡單一步驟,就可以解決這問題了

apt install iptables-persistent

完成了,很簡單吧,但是,每次修改完規則後,請記得執行

netfilter-persistent save

這樣更新後的規則才會保存喔

以上就是整個 iptables 的設置,很簡單吧~