萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux iptables 防火牆實戰配置:從基礎規則到 NAT 網關與自定義鏈強化

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

階段二:NAT 網關(內網共享上網)

假設: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

進階防禦技巧

  • 限制 SSH 暴力破解:iptables -A INPUT -p tcp --dport 22 -m recent --name sshbf --update --seconds 60 --hitcount 4 -j DROP
  • 防 SYN Flood:iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
  • 防止 IP 欺騙:iptables -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 前)。

遷移至 nftables(現代替代者)

RHEL 8+/Debian 10+ 預設採用 nftables,語法更統一、效能更好。iptables-translate 可輔助轉換現有規則。建議新專案直接學習 nftables。

copyright © 萬盛學電腦網 all rights reserved