NFTables Masquerade 不起作用

NFTables Masquerade 不起作用

我正在尝试设置 NFTables,将特定 UDP 端口上的流量转发到具有不同 IP 地址的另一台服务器。但是,我的伪装规则似乎不起作用。当我将数据包发送到此特定 UDP 端口时,它会尝试转发流量,但不会将源 IP 更改为转发服务器的 IP 地址。据我所知,这应该发生在伪装规则中。但是,即使是 SNAT 规则也不起作用。

以下是 TCPDump 输出,显示了问题所在:

01:04:12.437619 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:12.437657 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <DestIP>.27015: UDP, length 9
01:04:14.145003 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:14.145051 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <DestIP>.27015: UDP, length 9

我希望它看起来像这样:

01:04:12.437619 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:12.437657 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <ForwardIP>.7130 > <DestIP>.27015: UDP, length 9
01:04:14.145003 fe:00:02:b8:34:ff > 56:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <MyIP>.7130 > <ForwardIP>.27015: UDP, length 9
01:04:14.145051 56:00:02:b8:34:ff > fe:00:02:b8:34:ff, ethertype IPv4 (0x0800), length 51: <ForwardIP>.7130 > <DestIP>.27015: UDP, length 9

以下是我当前的 NFTables 设置方式:

root@forwardtest:~# nft list tables
table ip compressor_forward

root@forwardtest:~# nft list table compressor_forward -a
table ip compressor_forward { # handle 1
        chain prerouting { # handle 15
                type nat hook prerouting priority dstnat; policy accept;
                udp dport 27015 dnat to 149.28.45.245 # handle 17
        }

        chain postrouting { # handle 16
                type nat hook postrouting priority srcnat; policy accept;
                masquerade random # handle 18
        }
}

我尝试过删除randomNAT 标志以及添加persistentNAT 标志。对于我的情况,我确实需要randomNAT 标志。不过,添加/删除标志并没有什么区别。

IPv4转发也设置了:

root@forwardtest:~# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

IPTables (NAT) 也应该被删除。以下是我运行过的一些命令:

root@forwardtest:~# rmmod iptable_nat
rmmod: ERROR: Module iptable_nat is not currently loaded

root@forwardtest:~# lsmod | grep "iptable"

root@forwardtest:~# lsmod | grep "nft"
nft_masq               16384  1
nft_nat                16384  1
nft_chain_nat          16384  2
nf_nat                 40960  3 nft_nat,nft_masq,nft_chain_nat
nf_conntrack          139264  3 nf_nat,nft_nat,nft_masq
nf_tables             135168  8 nft_nat,nft_masq,nft_chain_nat

root@forwardtest:~# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

root@forwardtest:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

请记住,lsmod | grep "iptable"没有返回任何内容。我也尝试过创建postrouting优先级为 1 的链,但没有任何区别。

Ubuntu 20.04 LTS转发服务器在内核上运行5.4.0-26-generic

在这种情况下,我是否遗漏了什么?话虽如此,我对 NFTables 还不熟悉。因此,如果我遗漏了一些显而易见的东西,我深表歉意。

如果您需要更多信息,请告诉我!

非常感谢您的帮助!

感谢您的时间。

答案1

我解决了这个问题。我将转发服务器的内核从 升级5.4.0-26-generic5.6.11-050611-generic,它开始正常工作。话虽如此,我确实尝试在旧内核上重新启动转发服务器,但重新启动后问题仍然存在。因此,我确实相信内核实际上是这里的问题。

这绝对是个奇怪的问题。我将很快设置另一个测试服务器来运行5.4.0-26-generic以进行确认。

谢谢你!

相关内容