iptables 是 Linux 核心內建的封包過濾框架,透過定義規則鏈來控制網路流量的進出與轉發。掌握其核心概念與常用指令,是系統管理員與網路工程師的必備技能。本文將從表、鏈、規則匹配器、目標動作等基礎架構切入,並搭配實際 NAT 案例,示範如何解決內網主機無法透過公網 IP 存取內部服務的經典問題。
| 參數 | 說明 |
|---|---|
| -A | 在鏈尾新增規則 |
| -D | 刪除指定規則 |
| -R | 替換規則 |
| -I | 插入規則至指定位置 |
| -L | 列出所有規則 |
| -F | 清空規則 |
| -N | 建立使用者自訂鏈 |
| -X | 刪除使用者自訂鏈 |
| -P | 設定預設政策 |
| -Z | 歸零計數器 |
filter 表:INPUT(進站)、OUTPUT(出站)、FORWARD(轉發)。
nat 表:PREROUTING(路由前)、POSTROUTING(路由後)、OUTPUT(本機產生)。
常用匹配:-s 來源 IP、-d 目的 IP、-p 協定、--dport 目的埠、-i/-o 介面。
目標動作:ACCEPT(通過)、DROP(丟棄)、REJECT(拒絕並回應)、LOG(記錄)、SNAT/DNAT(位址轉換)。
iptables [-t table] command [chain] [rule-matcher] -j target
基礎防火牆腳本範例(/etc/rc.d/filter-firewall):
#!/bin/bash
IPT=/sbin/iptables
WWWSERVER=192.168.168.119
FTPSERVER=192.168.168.119
IPRANGE=192.168.168.0/24
$IPT -F
$IPT -P FORWARD DROP
$IPT -A FORWARD -p tcp -d $WWWSERVER --dport 80 -i eth0 -j ACCEPT
$IPT -A FORWARD -p tcp -d $FTPSERVER --dport 21 -i eth0 -j ACCEPT
$IPT -A INPUT -s 192.168.168.81 -i eth0 -j DROP
222.111.33.88192.168.1.250:80外網存取 222.111.33.88:80 正常,但內網主機(如 192.168.1.123)同樣用此公網 IP 存取卻失敗。
根因:回程封包未經 SNAT,來源 IP 仍為內網 IP,導致 Client 拒絕接收。
# 針對內網網段存取內部 Web 伺服器的流量,強制來源轉換為閘道內網 IP
iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -p tcp -d 192.168.1.250 --dport 80 -j SNAT --to-source 192.168.1.1
此規則讓回程封包來源變成閘道內網 IP (192.168.1.1),Client 便能正確匹配連線。
iptables -A FORWARD -p tcp -d 192.168.1.250 --dport 80 -j ACCEPT
FTP 主動/被動模式需載入核心模組追蹤連線:
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables 雖指令繁多,掌握「表→鏈→匹配→動作」四步驟即能靈活應對。針對 NAT 環境下的 Hairpin NAT 問題,關鍵在於讓回程封包也經過 SNAT,使來源 IP 符合 Client 預期。實務上建議將規則寫入啟動腳本,並搭配 iptables-save/restore 持久化。