![如何在nftables中为源nat规则设置硬条件?](https://linux22.com/image/189780/%E5%A6%82%E4%BD%95%E5%9C%A8nftables%E4%B8%AD%E4%B8%BA%E6%BA%90nat%E8%A7%84%E5%88%99%E8%AE%BE%E7%BD%AE%E7%A1%AC%E6%9D%A1%E4%BB%B6%EF%BC%9F.png)
服务器上只有一张表 - “nat”,它只包含两个链:“prerouting”和“postrouting”。 IP 转发已启用。我正在尝试为源 nat 规则设置更具体的条件。当我设定经典规则时:
nft add rule nat postrouting ip saddr 192.168.1.0/24 oif eth0 snat 1.2.3.4
一切正常。但我还想指定网络“saddr 192.168.1.0/24”所在的接口。
nft add rule nat postrouting **iif eth1** ip saddr 192.168.1.0/24 oif eth0 snat 1.2.3.4
当我输入此命令时,程序接受它并且规则出现在表中。但交通不通。有谁知道为什么吗?
答案1
此功能还需要内核 >= 5.5 才能获得足够的 netfilter 支持。描述在kernelnewbies.org:
Linux 5.5被释放2020年1月26日
[...]
网络过滤器
- POSTROUTING 中支持 iif 匹配犯罪
来自提交:
netfilter:支持 POSTROUTING 中的 iif 匹配
通常不要将 NULL 传递给 NF_HOOK_COND() 作为输入设备,而是传递包含路由 skb 的输入设备的 skb->dev 。
请注意,iptables(旧版和 nft)拒绝将输入接口匹配的规则添加到 POSTROUTING 链,但 nftables 允许这样做。
从描述来看,在这次提交之前,netfilter没有提供输入接口,并且表达式iif
从未匹配。