我正在尝试设置 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
}
}
我尝试过删除random
NAT 标志以及添加persistent
NAT 标志。对于我的情况,我确实需要random
NAT 标志。不过,添加/删除标志并没有什么区别。
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-generic
到5.6.11-050611-generic
,它开始正常工作。话虽如此,我确实尝试在旧内核上重新启动转发服务器,但重新启动后问题仍然存在。因此,我确实相信内核实际上是这里的问题。
这绝对是个奇怪的问题。我将很快设置另一个测试服务器来运行5.4.0-26-generic
以进行确认。
谢谢你!