Linux

如何匹配 nftables 中的 reqid?

  • June 27, 2019

似乎 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

nftables版本 0.9.0 於2018-06-08發布,一年多前,此版本不提供此功能。只有已解封裝的測試可用。

更新nftables 0.9.1 已於2019 年 6 月 24 日發布,因此人們可以希望它很快會被打包到自己喜歡的發行版中。

在 4.20 1版本中添加了對nftables中 ipsec 額外處理的核心支持。在使用者態方面,在 2018 年 9 月 21 日左右的 git master 分支中為 libnftnl 23和 nftables 456添加了對其他 ipsec 功能的相應支持。

最後一個更新檔提供reqid

src:添加 ipsec (xfrm) 表達式 這允許匹配與數據包、ipsec 請求 ID和 SPI 相關聯的 xfrm 狀態下的 ipsec 隧道/甜菜地址。

例子:

ipsec in ip saddr 192.168.1.0/24
ipsec out ip6 daddr @endpoints
ipsec in spi 1-65536

(好吧,沒有請求 id 的範例,也沒有匹配可能未實現的底層協議,請參見下文)

因此,為了能夠使用此功能,目前至少需要:

如果 OP 的iptables規則是追加而不是刪除(目前只能通過使用handle關鍵字在 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:測試reqid應該需要,因此測試已經受到 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

免責聲明:持保留態度,僅測試語法(使用來自 git commit 01e5c6f0ed0315046537612f5a80e506d37a7f8e 的nftables)。這實際上並未在 IPSec 上得到驗證。對於 UDP 封裝的 ESP,可能還需要為 4500/UDP 添加規則。

1 netfilter:nf_tables:添加 xfrm 表達式

2 expr:rt:ipsec 匹配支持

3 expr:添加 xfrm 支持

4 src:rt:添加支持以檢查路由是否將執行 ipsec 轉換

5 src:將元 secpath 重命名為元 ipsec

6 src:添加ipsec (xfrm) 表達式

引用自:https://serverfault.com/questions/971735