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

如何通过nftables实现目标IP的双向NAT转换(替换出站目标IP并还原回复报文IP)

如何通过nftables实现目标IP的双向NAT转换(替换出站目标IP并还原回复报文IP)

这个需求我刚好帮同事处理过类似的场景,完全能用nftables的NAT规则配合连接追踪解决,核心就是两条规则分别处理出站请求和响应报文,让我一步步给你说清楚:

核心思路

我们需要在nat表中配置两条关键规则:

  • 对本地发出的、目标IP为172.19.28.152的出站报文,修改其目标IP为10.187.19.132
  • 对返回的、源IP为10.187.19.132的响应报文,把源IP改回172.19.28.152,让本地应用以为是原目标IP回复的

同时依赖nftables自带的连接追踪功能,自动关联请求和响应的会话,确保转换的一致性。

具体配置步骤

1. 先创建nat表(如果系统中还未创建)

打开终端,执行以下命令:

add table ip nat

2. 配置出站报文的目标IP替换规则

这条规则作用于本地进程发出的报文(output链),把指定目标IP替换成实际要访问的IP:

# 先创建output链(如果不存在)
add chain ip nat output { type nat hook output priority -100; policy accept; }
# 添加目标IP替换规则
add rule ip nat output ip daddr 172.19.28.152 dnat to 10.187.19.132

这里的priority -100是为了让这条规则在其他output链规则之前执行,确保转换生效;dnat to就是nftables中修改目标IP的动作,同时连接追踪会自动记录这个转换的会话关系。

3. 配置响应报文的源IP还原规则

这条规则作用于进入主机的报文(prerouting链),把响应报文的源IP改回原目标IP,让本地应用能正确识别:

# 先创建prerouting链(如果不存在)
add chain ip nat prerouting { type nat hook prerouting priority -100; policy accept; }
# 添加源IP还原规则
add rule ip nat prerouting ip saddr 10.187.19.132 ct status dnat snat to 172.19.28.152

其中ct status dnat是关键,它会匹配所有属于之前被DNAT转换过的会话的响应报文,确保我们只处理和出站请求对应的回复,不会干扰其他正常流量;snat to则负责修改源IP。

验证规则是否生效

你可以用ping 172.19.28.152测试,同时用tcpdump抓包查看:

  • 本地发出的ping包,目标IP应该是10.187.19.132
  • 收到的响应包,源IP会被还原成172.19.28.152

永久保存规则

如果需要重启后规则依然生效,不同发行版的保存方式略有不同:

  • 大部分发行版可以执行nft list ruleset > /etc/nftables.conf,然后确保nftables服务开机自启
  • 部分RHEL/CentOS系发行版可以把规则写入/etc/sysconfig/nftables.conf,再重启nftables服务

备注:内容来源于stack exchange,提问作者Andreas Buschka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:23:10