使用nftables将对指定远程地址的请求重定向到localhost失败,请求排查原因
nftables将对指定远程地址的请求重定向到localhost失败,请求排查原因
我来帮你排查这个问题的根源!其实核心原因是你忽略了本地发起流量和外部流入流量的NAT处理路径差异。
你当前的nftables规则只在prerouting链里配置了DNAT,但prerouting链负责处理的是从外部网络进入本机的流量。而你是在同一台机器上发起对10.0.2.99的请求,这类本地生成的流量根本不会经过prerouting链,自然你的DNAT规则不会生效——系统找不到10.0.2.99的路由,就抛出了"[Errno 113] No route to host"错误。
解决方法:添加output链的DNAT规则
本地发起的流量,NAT规则需要配置在output链中,你可以通过以下两种方式修复:
- 用命令临时添加规则(重启后失效):
nft add rule ip nat output ip daddr 10.0.2.99 dnat to 127.0.0.1
- 修改nftables配置文件永久保存:
table ip nat { chain prerouting { type nat hook prerouting priority dstnat; policy accept; ip daddr 10.0.2.99 dnat to 127.0.0.1 } chain postrouting { type nat hook postrouting priority srcnat; policy accept; } chain output { type nat hook output priority -100; policy accept; ip daddr 10.0.2.99 dnat to 127.0.0.1 } }
补充说明
Linux的NAT流量处理路径分两种场景:
- 外部流入流量:
prerouting(执行DNAT)→ 路由查找 →input链 - 本地发起流量:应用层 →
output链(执行DNAT)→ 路由查找 →postrouting链
你已经正确开启了ip_forward和route_localnet,这两个配置没有问题,只需要补上output链的规则,就能让本地请求被正确重定向到localhost了。
备注:内容来源于stack exchange,提问作者andrew cooke
相关产品推荐
相关产品推荐

