iptables UDP 规则的 SNAT 仅适用于部分流量

iptables UDP 规则的 SNAT 仅适用于部分流量

我想使用源 NAT 更改 UDP 流量的本地 IP 地址。但是,只有本地生成的流量才会应用 NAT 规则,对远程源生成的流量的回复不会应用 NAT。

本地生成的流量与 UDP 服务器中远程流量的回复是否不同?

我找到了一个来自 Redhat 的问题,但我无法访问它......链接是https://access.redhat.com/solutions/4427871

环境:

  • 操作系统:Debian 11 x64
  • iptables 配置
    iptables -t nat -A POSTROUTING -s 192.168.169.130 -p udp --sport 80 -j SNAT --to-source 192.168.169.129:10080
    
  • tcpdump 结果其中,前七项应用了SNAT规则,但是后面的项没有应用SNAT规则。

答案1

Linux iptables NAT应用于conntrack 状态而不是单独的数据包。

如果 conntrack 已在跟踪某个流(例如,在收到一些入站 UDP 数据包之后),则进一步匹配该流的数据包nat根本不会碰到桌子– 它们只会根据 conntrack 中已有的内容应用正向或反向翻译。

例如,如果有一个出站 DNS 查询(已通过 SNAT 转换为 193.299.181.993)1conntrack -L可能会显示如下状态,其“回复”字段用于匹配相反方向的数据包:

源码 夏令时 运动 端口 回复源 回复 dst 1 r-运动 r 到 d 端口
10.1.124.56 83.171.22.22 39202 53 83.171.22.22 193.299.181.993 53 39202

因此如果你的系统发送了一些出站数据包第一的,它们将匹配 iptables 规则并被 SNAT。但如果 conntrack 认为系统将这些数据包作为回复对于非 DNAT 的入站数据包,则出站数据包将不会根据 iptablesnat规则进行检查。

使用该conntrack工具来验证这一点——例如,尝试删除匹配的状态并查看 NAT 是否突然开始工作。

如果这是问题所在,我可以想到一些潜在的解决方法:

  • 将 DNAT--to-dest 192.168.169.129:10080应用于入站数据包,然后所有匹配的出站回复也将相应地进行 SNAT。
  • 对标志进行一些处理-j CT --notrack,以防止该数据包被存储为 conntrack 状态。
  • 将规则集转换为 nftables,它具有更灵活的链/钩优先级系统,并且可以应用无国籍者NAT ip saddr。(见例子.) 可能可以在同一个系统上堆叠 iptables 和 nftables。

1是的,这应该是明显地虚假 IP 地址。

相关内容