你好,我想获得一些关于如何使用 VyOS 进行特定类型 NAT 的建议。
我遇到过一种情况,我想对目标地址和目标端口匹配的连接进行 NAT。但我不仅想转换目标端口,还想转换源地址。所以我需要 DNAT 和相应的 SNAT。
将会有多个连接,其理念是,它们将根据原始目的地获得不同的源地址,并重新路由到一个共同的目的地。
问题是 DNAT 先进行,由于它转换目的地,我不知道在 SNAT 中要匹配什么。如果我能够先进行 SNAT,那么问题就解决了。或者,如果我能够以某种方式用 DNAT “标记”连接,然后在 SNAT 中匹配它,那么也可以。
下面是两个连接的示例,其中我发明了一些不存在的连接标记功能来说明我想要做的事情:
set nat destination rule 89 destination address 192.168.222.222
set nat destination rule 89 destination port 10089
set nat destination rule 89 translation port 10000
set nat destination rule 89 modify mark '89'
set nat source rule 89 connection mark '89'
set nat source rule 89 translation address 10.1.1.89
set nat destination rule 96 destination address 192.168.222.222
set nat destination rule 96 destination port 10096
set nat destination rule 96 translation port 10000
set nat destination rule 96 modify mark '96'
set nat source rule 96 connection mark '96'
set nat source rule 96 translation address 10.1.1.96
请注意,两个连接都转换到同一个目的地,所以我无法在 SNAT 规则中使用它。
有没有办法在 DNAT 之前进行 SNAT,或者在 VyOS 中以其他方式实现我想要的效果?
其他注意事项:
- 所有连接都来自同一主机,因此无法匹配
- 原始源端口是短暂的,所以我无法匹配
- 这种设置的目的是模拟从多个客户端到一个公共目的地的连接,而实际上它们来自单个主机,使用不同的目标端口来区分每个模拟客户端。
编辑:我认为如果我使用 iptables 而不是 VyOS 的话,这是可能的,如下所示:
iptables -t mangle -A PREROUTING -d 192.168.222.222 -p tcp --dport 10106 -j CONNMARK --set-mark 89
iptables -t nat -A PREROUTING -d 192.168.222.222 -p tcp --dport 10089 -j DNAT --to-destination 192.168.222.222:10000
iptables -t nat -A POSTROUTING -m connmark --mark 89 -j SNAT --to-source 10.1.1.89
iptables -t mangle -A PREROUTING -d 192.168.222.222 -p tcp --dport 10096 -j CONNMARK --set-mark 96
iptables -t nat -A PREROUTING -d 192.168.222.222 -p tcp --dport 10096 -j DNAT --to-destination 192.168.222.222:10000
iptables -t nat -A POSTROUTING -m connmark --mark 96 -j SNAT --to-source 10.1.1.96
如果 iptables 可以做到这一点,我猜 VyOS 也可以……但也许不行?
我在 VyOS 论坛上提出了这个问题并得到了答案: https ://forum.vyos.io/t/matching-in-snat-after-dnat/
总结一下,到目前为止,还没有办法使用 VyOS 实现我想要的效果。但是,部分解决方案已经存在。有一种方法可以标记连接,因此唯一缺少的功能是能够匹配 SNAT 的连接标记。