我正在尝试设置 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 的新手。因此,如果我遗漏了一些明显的东西,我深表歉意。
如果您需要更多信息,请告诉我!
非常感谢任何帮助!
感谢您的时间。
我解决了这个问题。我将转发服务器的内核从
5.4.0-26-generic
to升级了5.6.11-050611-generic
,它开始正常工作。话虽如此,我确实尝试在旧内核上重新启动转发服务器,并且在重新启动后问题仍然存在。因此,我确实相信内核实际上是这里的问题。绝对是一个奇怪的问题。我将设置另一个很快运行的测试服务器
5.4.0-26-generic
来确认。谢谢!