在雲服務器無公網 IP、內網穿透、多服務端口整合、隱藏真實後端等場景下,利用 iptables NAT 表實現端口映射 (DNAT) 和源地址偽裝 (SNAT) 是輕量級、高效能的方案。本文提供從內核轉發開啟、規則編寫、持久化保存、開機自啟、常見故障排查的完整操作手冊。
PREROUTING 鏈修改目標 IP/端口,將流量導向內部服務器。客戶端 → 公網IP:公網端口 → DNAT → 內網IP:內網端口POSTROUTING 鏈修改源 IP,確保回包經由 NAT 网關返回。內網服務器回包 → SNAT(源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
將本機公網 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 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
# 假設出站接口為 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
yum install -y iptables-servicessystemctl disable firewalld # 避免衝突systemctl enable --now iptablesservice iptables save (寫入 /etc/sysconfig/iptables)cat /etc/sysconfig/iptables 確認包含 NAT 表規則。# 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 FORWARDtcpdump -i eth0 -nn port 3389 | 添加 FORWARD ACCEPT 規則、檢查目標機安全組/防火牆、ip route get 目標IP |
| 連接建立但無數據傳輸 | SNAT 缺失 / 回包路由不經 NAT 网關 | iptables -t nat -nvL POSTROUTING | 添加 SNAT/MASQUERADE 規則、確保對端網關指向 NAT 機 |
| DNAT 生效但源 IP 顯示為 NAT 機內網 IP | SNAT --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 端口映射,可構建靈活的網絡拓撲,滿足雲上混合部署、遷移過渡、安全隔離等多樣化需求。