我有一个我正在使用的 Fedora 31 系统iptables-nft
。我需要这个,因为仍然有一堆软件需要传统的iptables
命令行工具。这意味着我的 nftables 配置具有相应的一组表来匹配旧配置:
table ip filter
table ip nat
table ip6 filter
table ip mangle
table ip6 nat
table ip6 mangle
我使用了一个容器化的 VPN 服务,在 nftables 之前,它可以通过在 vpn 出现时运行类似的东西来在我的主以太网接口上启用伪装:
iptables -t nat -A POSTROUTING -s 172.16.254.0/24 -o eth0 -j MASQUERADE
自从升级到 Fedora 31 和iptables-nft
之后,这不再有效。容器(运行 alpine)没有iptables-nft
兼容性包装器,但它本身有nft
命令。
我不能使用nft
cli 向现有表添加规则,因为这会破坏iptables-nft
. 但我可以创建新表。我希望我可以应用这样的配置:
table ip vpn {
chain postrouting {
type nat hook postrouting priority filter; policy accept;
ip saddr 172.16.254.0/24 oifname "eth0" counter masquerade
}
chain forward {
type filter hook forward priority filter; policy accept;
ip saddr 172.16.254.0/24 counter accept
}
}
...但这似乎没有任何影响。通过将此表中的链设置为优先级 0,我希望它们能在旧表之前nat
匹配,但事实并非如此。
有没有办法使这项工作?
在
#netfilter
irc 频道上进行了一些讨论后,事实证明事情是“按设计”运行的。一条链不可能提供比具有(或)规则的链更广泛的访问权限(以规则的形式)。accept
reject
drop
一个
accept
判决只在它发生的链中有效,它不会阻止数据包处理在更高优先级的链中继续进行。换句话说,如果你有这样的链:
无法通过创建额外的链来授予访问权限。覆盖该规则的唯一方法是在同一个链中
reject
添加其他规则。这是一个猜测。