设置:
- Linux(已在 LEDE、OpenWrt、Ubuntu 16 上尝试过)
- iptables 已禁用(内核模块已卸载)
- nftables(尝试过 v.0.8、0.8.2)
链和 NAT 是根据官方 nftables 维基:
% nft add table nat % nft add chain nat prerouting { type nat hook prerouting priority 0 \; } % nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
通过这种设置,dnat 可以按预期运行,例如:
% nft add rule nat prerouting tcp dport 15000 dnat 192.168.0.50:20000
将所有传入的 TCP 数据包从端口 15000 重定向到 192.168.0.50:20000 并返回。
但是,没有处理任何 snat 规则(以下规则均不处理):
% nft add rule nat postrouting counter ip saddr 192.168.0.50 snat 1.2.3.4
% nft add rule nat postrouting counter tcp sport 20000 snat 1.2.3.4:1234
% nft add rule nat postrouting counter ip protocol tcp drop
我已单独或以变体形式尝试了这些规则(oif、ip+tcp 等)- 数据包仍按原样通过(WireShark 已证明)或未被丢弃。不过:
- 后路由链已被处理,因为如果我删除后路由链,dnat(通过预路由)将停止工作(如预期的那样)。
- 向输入或输出链添加删除规则是可行的。
type nat hook input/output
根据添加链AB 的建议仍然没有解决问题。
那么,如何编写 nftables snat 规则?