You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu IPTables端口转发与NAT配置问题求助

Ubuntu IPTables端口转发与NAT配置问题求助

看起来你已经折腾好几天了,卡在了IPTABLES的NAT转换环节,我来帮你梳理下现有配置的问题,以及调整方向。

首先先明确你的核心需求:

  • 让Source-VM(10.0.12.4)发往Router-VM eth1(10.0.25.20)9080端口的流量,通过Router-VM转发到Remote-Target(128.20.20.5)
  • 转发时必须将数据包的源IP替换为Router-VM eth0(10.0.9.4)的地址,因为这是Remote-Target唯一白名单的源网段
  • 返回流量要正确路由回Source-VM

现有配置的潜在问题

看了你贴的iptables规则,核心问题可能出在POSTROUTING的SNAT规则匹配条件太严格:
你原本的SNAT规则只匹配了--dport 9080,但实际上,当数据包从Router-VM eth0发往Remote-Target时,确实是目标端口9080,但Remote-Target返回的数据包,源端口是9080、目标端口是Source-VM发起请求时的随机端口,这时候你的规则就无法匹配返回流量的反向转换(不过conntrack理论上会自动处理,但如果请求包的SNAT没生效,那后续都白搭)。另外,也有可能是规则的匹配逻辑没有覆盖所有发往目标IP的流量。

修正后的IPTABLES配置

你可以先清空现有规则(避免冲突),然后执行以下配置:

# 确保IP转发已启用
echo "1" > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1  # 永久生效可以写入/etc/sysctl.conf

# 定义变量
EXTIF="eth1"
EXTIP="10.0.25.20"
VPNIF="eth0"
VPNIFIP="10.0.9.4"
CBTARGETIP="128.20.20.5"
TARGET_PORT="9080"

# 清空现有规则(可选,确保干净的配置环境)
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

# 设置默认策略(根据实际安全需求调整,这里先保持宽松)
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# 允许已建立/相关的连接双向转发
iptables -A FORWARD -i $EXTIF -o $VPNIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $VPNIF -o $EXTIF -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许来自Source-VM网段的新9080端口请求转发到VPN接口
iptables -A FORWARD -i $EXTIF -o $VPNIF -p tcp --dport $TARGET_PORT -m conntrack --ctstate NEW -j ACCEPT

# DNAT:将发往eth1的9080端口流量转发到Remote-Target
iptables -t nat -A PREROUTING -i $EXTIF -p tcp --dport $TARGET_PORT -j DNAT --to-destination $CBTARGETIP:$TARGET_PORT

# SNAT:将所有从eth0发往Remote-Target的流量,源IP替换为eth0的IP
# 这里去掉了端口限制,确保所有发往目标的流量都能被正确SNAT
iptables -t nat -A POSTROUTING -o $VPNIF -d $CBTARGETIP -j SNAT --to-source $VPNIFIP

调试验证步骤

配置完后,你可以通过以下步骤验证流量是否正确转换:

  1. 检查连接跟踪表:查看是否有Source-VM到Remote-Target的连接记录,以及SNAT是否生效

    conntrack -L | grep $CBTARGETIP
    

    正常情况下应该能看到src=10.0.12.4 dst=128.20.20.5的连接,并且关联了src=10.0.9.4的SNAT记录。

  2. 抓包验证:在Router-VM的eth0接口抓包,看发往Remote-Target的数据包源IP是否为10.0.9.4

    tcpdump -i eth0 host $CBTARGETIP and port $TARGET_PORT -nn
    

    如果输出里的源IP是10.0.9.4,说明SNAT生效了。

  3. 检查路由表:确保Router-VM有到128.20.20.5的路由是通过eth0(VPN隧道)出去的

    ip route get $CBTARGETIP
    

    输出应该显示via ... dev eth0相关的路由条目。

  4. 验证返回路由:可以在Remote-Target上抓包,看是否收到来自10.0.9.4的请求,并且返回数据包的目标IP是10.0.9.4。

额外注意事项

  • 如果Router-VM启用了ufw或者其他防火墙管理工具,要确保它们没有覆盖或干扰你手动配置的iptables规则
  • 确保Remote-Target的防火墙不仅允许来自10.0.9.0/24的9080端口流量,还能正确将返回流量路由回10.0.9.4(也就是VPN隧道的另一端能正确路由到Router-VM)

如果调整后还是有问题,可以把tcpdump的抓包结果或者conntrack的输出贴出来,方便进一步排查。

备注:内容来源于stack exchange,提问作者Justus Fowl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:09:32