如何通过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
相关产品推荐
相关产品推荐

