看来 Linux 已经有一个用于 nftables nf_xfrm 的模块,其中包含一些有关 reqid 的代码,但是手册页中没有关于它的描述。
那么,如何将以下命令翻译成 nftables?
iptables -D FORWARD -s 10.0.0.1/32 -i eth0 -m policy --dir in --pol ipsec --reqid 1 --proto esp -j ACCEPT
答案1
nftables版本 0.9.0 是发布日期:2018-06-08,一年多前就已经存在了,这个功能在这个版本中没有,只能进行解封装测试。
更新:nftables 0.9.1 已发布于 2019-06-24 发布,因此人们希望它能很快被打包到人们最喜欢的发行版中。
内核支持对 ipsec 进行额外的处理nftables在 4.20 版中添加1. 在用户空间方面,相应支持额外的 ipsec 功能曾是2018 年 9 月 21 日左右在 git master 分支中为 libnftnl 添加2,3和 nftables4,5,6。
最后一个补丁提供了请求:
src:添加 ipsec (xfrm) 表达式这允许在与数据包关联的 xfrm 状态下匹配 ipsec 隧道/beet 地址,ipsec 请求 ID和 SPI。
例子:
ipsec in ip saddr 192.168.1.0/24 ipsec out ip6 daddr @endpoints ipsec in spi 1-65536
(嗯,没有请求 ID 的示例,也没有匹配可能未实现的底层协议,请参阅后面的内容)
因此,为了能够使用此功能,目前至少需要以下内容:
- 内核 4.20
- libnft 1.1.2 或1.1.3
- 建造nftables从git 源。 A新的nftables即将发布,但目前看来有所延迟。
如果 OP 的iptables规则是附加而不是删除(目前只能在 nftables 中通过使用处理关键词)应该翻译成这样(包括样板):
nft add table ip filter
nft add 'chain ip filter forward { type filter hook forward priority filter; policy accept; }'
nft add rule ip filter forward ip saddr 10.0.0.1 iifname "eth0" ipsec in reqid 1 accept
meta ipsec exists
我之前没有添加ipsec in reqid 1
:测试请求应该要求并因此测试已经经过 ipsec 解封装。
似乎没有提供且未提及的内容在文档中相当于 --proto esp
,所以我没法放它。
如果匹配 esp 协议真的需要时,可以想象使用外部封装数据包上的标记应该可以做到这一点,并且知道解封装后该标记会被保留:
nft add table ip filter
nft add 'chain ip filter input { type filter hook input priority filter; policy accept; }'
nft add 'chain ip filter forward { type filter hook forward priority filter; policy accept; }'
nft add rule ip filter input ip protocol esp meta mark set 1
nft add rule ip filter forward meta mark 1 ip saddr 10.0.0.1 iifname "eth0" ipsec in reqid 1 accept
免责声明:仅测试了语法(使用nftables来自 git 提交01e5c6f0ed0315046537612f5a80e506d37a7f8e)。这实际上并未在 IPSec 上得到验证。可能还需要为 4500/UDP 添加一条规则,用于 UDP 封装的 ESP。
1netfilter:nf_tables:添加 xfrm 表达式
2expr: rt: ipsec 匹配支持
3expr:添加 xfrm 支持
4src: rt:添加支持以检查路由是否执行 ipsec 转换
5src:将 meta secpath 重命名为 meta ipsec
6src:添加 ipsec(xfrm)表达式