iptables 是 Linux 核心 Netfilter 框架的用戶空間管理工具,掌握其表、鏈、規則、匹配、動作五大核心概念,即可構建企業級防火牆與 NAT 網關。本文提供從零開始的完整配置範例,含規則持久化、備份恢復、自定義鏈模組化設計。
filter(過濾)、nat(地址轉換)、mangle(修改封包標記)、raw(連接追蹤豁免)。INPUT(入站)、OUTPUT(出站)、FORWARD(轉發)、PREROUTING、POSTROUTING。DROP,白名單放行。# 1. 啟用 IP 轉發(網關必須)
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-ipforward.conf
sysctl --system
# 2. 清空現有規則
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 3. 設定預設策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 4. 允許本地回環
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 5. 允許已建立/相關連接(狀態檢測核心)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# 6. 允許 SSH 遠端管理(務必優先於 DROP)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# 7. 允許主動發起的外出連接(DNS、HTTP、YUM 等)
iptables -A OUTPUT -p tcp -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
# 8. ICMP 基礎放行(Ping、MTU 發現)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
假設:eth0 內網(192.168.10.0/24),eth1 外網(公網 IP)。
# 1. 載入 NAT 模組
modprobe iptable_nat
modprobe nf_nat
modprobe nf_conntrack
# 2. SNAT(固定公網 IP)
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.10.0/24 -j SNAT --to-source 203.0.113.10
# 3. 或 MASQUERADE(動態公網 IP,如 PPPoE、DHCP)
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.10.0/24 -j MASQUERADE
# 4. 轉發鏈放行內網流出
iptables -A FORWARD -i eth0 -o eth1 -s 192.168.10.0/24 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d 192.168.10.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
將重複邏輯封裝為自定義鏈,提升可讀性與維護性。
# 建立鏈
iptables -N TCP_SERVICES # 允許的 TCP 服務
iptables -N UDP_SERVICES # 允許的 UDP 服務
iptables -N INTERNAL_IN # 內網進入防火牆
iptables -N EXTERNAL_IN # 外網進入防火牆
# TCP_SERVICES 定義
iptables -A TCP_SERVICES -p tcp --dport 22 -j ACCEPT # SSH
iptables -A TCP_SERVICES -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A TCP_SERVICES -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A TCP_SERVICES -p tcp --dport 25 -j ACCEPT # SMTP
# ... 其他服務
# UDP_SERVICES 定義
iptables -A UDP_SERVICES -p udp --dport 53 -j ACCEPT # DNS
iptables -A UDP_SERVICES -p udp --dport 123 -j ACCEPT # NTP
# 綁定到主鏈
iptables -A INPUT -i eth0 -j INTERNAL_IN
iptables -A INPUT -i eth1 -j EXTERNAL_IN
iptables -A INTERNAL_IN -j TCP_SERVICES
iptables -A INTERNAL_IN -j UDP_SERVICES
iptables -A EXTERNAL_IN -m state --state ESTABLISHED,RELATED -j ACCEPT
# 外網僅允許回應封包,不主動開放服務(如需開放 Web 伺服器,另行添加)
# 儲存規則(RHEL/CentOS/Fedora) iptables-save > /etc/sysconfig/iptables systemctl enable --now iptables # Debian/Ubuntu (iptables-persistent) apt install iptables-persistent netfilter-persistent save # 手動備份/恢復 iptables-save > ~/iptables.backup.$(date +%F) iptables-restore < ~/iptables.backup.2024-01-15 # 查看帶計數器的詳細規則 iptables -L -n -v --line-numbers
iptables -A INPUT -p tcp --dport 22 -m recent --name sshbf --update --seconds 60 --hitcount 4 -j DROPiptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPTiptables -A INPUT -s 10.0.0.0/8 -j DROP(外網介面)、iptables -A INPUT -s 192.168.0.0/16 -j DROP(外網介面)。iptables -A INPUT -j LOG --log-prefix "IPT_DROP: " --log-level 4(放在 DROP 前)。RHEL 8+/Debian 10+ 預設採用 nftables,語法更統一、效能更好。iptables-translate 可輔助轉換現有規則。建議新專案直接學習 nftables。