Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

CentOS 7 使用 iptables 實現端口映射與轉發 (DNAT/SNAT) 完整指南

編輯:關於伺服器

在雲服務器無公網 IP、內網穿透、多服務端口整合、隱藏真實後端等場景下,利用 iptables NAT 表實現端口映射 (DNAT) 和源地址偽裝 (SNAT) 是輕量級、高效能的方案。本文提供從內核轉發開啟、規則編寫、持久化保存、開機自啟、常見故障排查的完整操作手冊。

核心原理

  • DNAT (Destination NAT):在 PREROUTING 鏈修改目標 IP/端口,將流量導向內部服務器。
    客戶端 → 公網IP:公網端口 → DNAT → 內網IP:內網端口
  • SNAT (Source NAT):在 POSTROUTING 鏈修改源 IP,確保回包經由 NAT 网關返回。
    內網服務器回包 → SNAT(源IP改為网關IP) → 客戶端
  • MASQUERADE:SNAT 專用於動態公網 IP (如 PPPoE/DHCP),自動獲取出站接口 IP。

前置條件:開啟內核 IP 轉發

# 1. 臨時生效
echo 1 > /proc/sys/net/ipv4/ip_forward

# 2. 永久生效
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ipforward.conf
sysctl --system

場景一:單端口映射 (TCP/UDP)

將本機公網 IP 61.144.14.72 的 3389 端口 (RDP) 轉發至內網服務器 116.6.73.229:3389。

# 1. 清空 NAT 表現有規則 (謹慎操作)
iptables -t nat -F

# 2. DNAT: 目標地址轉換 (PREROUTING)
iptables -t nat -A PREROUTING -d 61.144.14.72 -p tcp --dport 3389 -j DNAT --to-destination 116.6.73.229:3389

# 3. SNAT: 源地址偽裝 (POSTROUTING) - 固定公網 IP
iptables -t nat -A POSTROUTING -d 116.6.73.229 -p tcp --dport 3389 -j SNAT --to-source 61.144.14.72

# 4. 關鍵: FORWARD 鏈必須允許轉發流量
iptables -A FORWARD -d 116.6.73.229 -p tcp --dport 3389 -j ACCEPT
iptables -A FORWARD -s 116.6.73.229 -p tcp --sport 3389 -j ACCEPT

# 5. 保存規則
service iptables save
# 或 iptables-save > /etc/sysconfig/iptables

場景二:TCP + UDP 同時映射 (如遊戲服務器)

# TCP 9304
iptables -t nat -A PREROUTING -d 61.144.14.87 -p tcp --dport 9304 -j DNAT --to-destination 10.94.143.204:9304
iptables -t nat -A POSTROUTING -d 10.94.143.204 -p tcp --dport 9304 -j SNAT --to-source 61.144.14.87

# UDP 9305
iptables -t nat -A PREROUTING -d 61.144.14.87 -p udp --dport 9305 -j DNAT --to-destination 10.94.143.204:9305
iptables -t nat -A POSTROUTING -d 10.94.143.204 -p udp --dport 9305 -j SNAT --to-source 61.144.14.87

# FORWARD 允許
iptables -A FORWARD -d 10.94.143.204 -p tcp --dport 9304 -j ACCEPT
iptables -A FORWARD -d 10.94.143.204 -p udp --dport 9305 -j ACCEPT
iptables -A FORWARD -s 10.94.143.204 -p tcp --sport 9304 -j ACCEPT
iptables -A FORWARD -s 10.94.143.204 -p udp --sport 9305 -j ACCEPT

場景三:動態公網 IP 使用 MASQUERADE

# 假設出站接口為 eth0, 公網 IP 動態獲取
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 針對特定內網網段上網
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

持久化與開機自啟 (CentOS 7)

  1. 安裝 iptables-service:
    yum install -y iptables-services
    systemctl disable firewalld # 避免衝突
    systemctl enable --now iptables
  2. 保存規則:
    service iptables save (寫入 /etc/sysconfig/iptables)
  3. 驗證開機載入:
    cat /etc/sysconfig/iptables 確認包含 NAT 表規則。

開機自動加載腳本備選方案 (不依賴 iptables-service)

# 1. 創建腳本 /root/iptables_nat.sh
cat > /root/iptables_nat.sh << 'EOF'
#!/bin/bash
iptables -t nat -F
iptables -t nat -A PREROUTING -d 61.144.14.72 -p tcp --dport 3389 -j DNAT --to-destination 116.6.73.229:3389
iptables -t nat -A POSTROUTING -d 116.6.73.229 -p tcp --dport 3389 -j SNAT --to-source 61.144.14.72
iptables -A FORWARD -d 116.6.73.229 -p tcp --dport 3389 -j ACCEPT
iptables -A FORWARD -s 116.6.73.229 -p tcp --sport 3389 -j ACCEPT
EOF
chmod +x /root/iptables_nat.sh

# 2. 加入 rc.local (需執行權限)
echo "/root/iptables_nat.sh" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local

常見故障排查清單

現象可能原因排查命令解決
連接超時 (SYN_SENT)FORWARD 鏈阻斷 / 目標服務器防火牆阻斷 / 路由不可達iptables -nvL FORWARD
tcpdump -i eth0 -nn port 3389
添加 FORWARD ACCEPT 規則、檢查目標機安全組/防火牆、ip route get 目標IP
連接建立但無數據傳輸SNAT 缺失 / 回包路由不經 NAT 网關iptables -t nat -nvL POSTROUTING添加 SNAT/MASQUERADE 規則、確保對端網關指向 NAT 機
DNAT 生效但源 IP 顯示為 NAT 機內網 IPSNAT --to-source 設置錯誤 / 目標機看到真實源 IP (無 SNAT)檢查 SNAT 規則匹配條件 (目標 IP/端口/協議需與 DNAT 對應)
規則重啟後丟失未保存 / firewalld 覆蓋 / iptables-service 未啟用systemctl status iptables systemctl status firewalld禁用 firewalld、啟用 iptables-service、service iptables save
高並發下連接失敗conntrack 表滿 / 內核參數過小cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_max調大 nf_conntrack_max、nf_conntrack_tcp_timeout_established

驗證測試

# 1. 本機測試 DNAT
telnet 61.144.14.72 3389

# 2. 外部客戶端測試
# Windows: mstsc /v:61.144.14.72:3389
# Linux: rdesktop 61.144.14.72:3389

# 3. 抓包確認雙向流經 NAT 機
tcpdump -i any -nn host 116.6.73.229 and port 3389

掌握 iptables DNAT/SNAT 端口映射,可構建靈活的網絡拓撲,滿足雲上混合部署、遷移過渡、安全隔離等多樣化需求。

Copyright © Windows教程網 All Rights Reserved