iptables 防火牆規則:從入門到進階
在 Linux 系統安全管理中,防火牆是第一道防線。雖然現代發行版如 Ubuntu 22.04 和 Debian 12 預設使用 ufw 或 firewalld 來簡化配置,但 iptables 依然是底層的核心技術。理解 iptables 不僅能幫助你解決複雜的網路封包過濾問題,更能讓你深入掌握 Linux 網路堆疊的運作原理。本文將帶領你從基礎語法出發,逐步掌握進階的 NAT 與狀態檢測技巧。
基礎架構與核心概念
iptables 並非單一指令,而是透過表(Table)與鏈(Chain)來組織規則的架構。最常見的表包括 filter(預設表,處理封包過濾)、nat(處理網路位址轉換)和 mangle(處理封包修改)。每個表內包含多個鏈,例如 INPUT(進入本機的封包)、FORWARD(轉發封包)和 OUTPUT(本機發出的封包)。
在開始配置前,請確保你擁有 root 權限或已使用 sudo。建議在測試時先建立備份,以防規則錯誤導致無法連線:
sudo iptables-save > ~/iptables_backup.txt
入門:基本封包過濾規則
讓我們從最常見的應用場景開始:開放 SSH 服務並阻擋其他不必要的連接。iptables 使用 -A 參數將規則追加到鏈的末尾,-p 指定協定,--dport 指定目標端口。
以下範例演示如何允許 SSH 連接,並拒絕其他所有進入本機的流量:
# 1. 允許已建立的連接和相關連接(狀態檢測基礎)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 2. 允許本地回環接口(localhost)通信
sudo iptables -A INPUT -i lo -j ACCEPT
# 3. 允許 SSH (port 22) 連接
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 4. 允許 HTTP (port 80) 和 HTTPS (port 443) 連接
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 5. 預設策略:拒絕所有其他進入本機的封包
# 注意:這必須是最後一條規則,或者設置為預設策略
sudo iptables -P INPUT DROP
執行上述指令後,你可以使用 sudo iptables -L -n -v 查看規則清單。-n 表示不解析主機名(加快顯示速度),-v 顯示詳細計數器。你會發現規則上方有封包計數,這有助於驗證規則是否生效。
進階:狀態檢測與 NAT 配置
僅依靠端口開放是不夠的,惡意攻擊者可能發送畸形封包。iptables 的 state 模組(在較新版本中建議使用 conntrack)能追蹤連接狀態,只允許回應封包通過,大幅提升安全性。
此外,許多伺服器需要作為網關進行 IP 轉發。以下範例演示如何啟用 IP 轉發並配置源 NAT(SNAT),讓內部網路可以透過此伺服器上網:
# 1. 啟用核心級 IP 轉發功能
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
# 2. 配置 SNAT:將來自內部網路 (192.168.1.0/24) 的流量轉換為外部介面 IP
# 假設外部介面為 eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
MASQUERADE 與 SNAT 類似,但適用於動態 IP 環境(如 DHCP 連線),它會自動獲取出口介面的 IP 進行轉換。
常見問題與排解
1. 規則生效但無法連線?
這通常是因為規則順序錯誤。iptables 由上而下匹配,一旦匹配成功便停止後續檢查。如果你先設置了 DROP 規則,後面的 ACCEPT 將永遠不會被執行。請務必將允許規則置於拒絕規則之前,或使用 -I (Insert) 將規則插入到鏈的首部。
2. 如何永久保存規則?
在 Ubuntu 22.04 和 Debian 12 中,iptables 規則在重啟後會失效。雖然你可以透過 netfilter-persistent 套件來保存,但更推薦的方式是將其加入啟動腳本或使用 ufw 作為前端管理工具。若堅持使用原始 iptables,可安裝 iptables-persistent:
sudo apt install iptables-persistent
sudo netfilter-persistent save
小結
iptables 雖然命令列參數繁雜,但其靈活性與效能無可取代。對於初學者,建議先熟悉 filter 表的基礎過濾規則,並養成查看計數器的習慣以驗證規則邏輯。隨著經驗累積,再逐步探索 nat 表與複雜的狀態檢測。記住,在生產環境修改防火牆規則時,務必保留一個備用的 SSH 會話,以免因配置錯誤而被鎖在系統之外。