首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较NFTables中的‘and’和‘`daddr`’的字节

比较NFTables中的‘and’和‘`daddr`’的字节
EN

Unix & Linux用户
提问于 2020-06-05 18:28:24
回答 1查看 1.1K关注 0票数 1

我有很多子网10.x.y.0/24,其中0 ≤ x ≤ 500 ≤ y ≤ 20

我希望允许10.x.y.0/2410.z.y.0/24之间对(x, y, z)的每一个值进行通信。

我可以使用nft可执行文件执行脚本,但我想知道是否可以使用单个规则和二进制操作来完成脚本。

我能够使用y“提取”地址的“ip saddr & 0.0.255.0字节”,但是当我尝试使用==运算符时,nftables告诉我语法无效:

代码语言:javascript
复制
$ cat /etc/nftables.conf
# [...]
        ip saddr & 0.0.255.0 == daddr & 0.0.255.0 accept
# [...]
$ sudo nft -f /etc/nftables
/etc/nftables.conf:113:27-31: Error: syntax error, unexpected daddr
        ip saddr & 0.0.255.0 == daddr & 0.0.255.0 accept

我尝试过几种变体,但它们似乎都不起作用,而且NFTables的wiki从来没有比较过包的不同字段。

有办法吗?

EN

回答 1

Unix & Linux用户

发布于 2020-06-06 18:19:40

我认为目前nftable不支持比较的右侧任意的非常量表达式。我不知道在如何生成足够的字节码方面,这个限制是在用户空间方面,还是内核端的字节码无法处理这些问题。可以进行常量查找或集/映射查找,但不会有更多。这可能会在未来发生变化。

无论如何,我提出了一个替代的解决方案,使用设置串连作为查找表。仍然使用特定的网络掩码操作,这将只需要y元素(21),这比详尽的规则集或其等效的完整设置版本(因为它是散列的缘故,它仍然比简单的规则集更快)要好得多:它们可能需要更多的规则或元素来完成一个详尽的匹配列表。

我将在示例中使用表ip myfilter及其type filter hook forwardip myfilter forward,请调整如下:

代码语言:javascript
复制
nft add table myfilter
nft add chain ip myfilter forward '{ type filter hook forward priority 0; policy drop; }'

添加一组由两个IP地址类型级联而成的集合:

代码语言:javascript
复制
table ip myfilter {
    set same-y {
        type ipv4_addr . ipv4_addr
    }
}

由以下单位创建:

代码语言:javascript
复制
nft add set ip myfilter same-y  '{ type ipv4_addr . ipv4_addr; }'

查找将匹配两个IP地址的连接。现在仍然可以在比较的左边应用操作符,所以您的自定义net掩码操作符仍然会被使用:只需提供修改的源地址和修改的目标地址,如果集合中有匹配的元素,结果将为真(规则将运行accept语句)。

代码语言:javascript
复制
nft 'add ip myfilter forward ip saddr & 0.0.255.0 . ip daddr & 0.0.255.0 @same-y accept'

同样:让它工作的不同之处是,在这里,取决于包的内容的两个表达式都在比较的左边,因此是允许的。

现在,用0.0.y.0 : 0.0.y.0类型的条目填充集合,以完成逻辑比较的部分,而逻辑比较的部分仅在数据包路径遍历过程中无法完成,例如使用这个shell循环:

代码语言:javascript
复制
for i in $(seq 0 20); do printf 'add element ip myfilter same-y { 0.0.%d.0 . 0.0.%d.0 }\n' $i $i; done | nft -f -

它将在@same-y中添加21个元素:

代码语言:javascript
复制
0.0.0.0 . 0.0.0.0,
0.0.1.0 . 0.0.1.0,
[...]
0.0.20.0 . 0.0.20.0

如果网络扩展并接收10.x.21.0/24类型的子网络,它只需要添加一个元素,这仍然可以在运行时完成。

如果您需要对筛选器进行一些异常,同时保持它的泛型,则可以将上面的集合转换为一个判决映射。大多数裁决元素将以: accept结尾,异常将类似于0.0.15.0 . 0.0.15.0 : jump exception-net-15 (这样的用户链也必须在相同的规则集中定义)。

有了这张判决地图:

代码语言:javascript
复制
table ip myfilter {
    map accept-same-y {
        type ipv4_addr . ipv4_addr : verdict
    }
}

这些元素应该包含这样的元素:

代码语言:javascript
复制
0.0.0.0 . 0.0.0.0 : accept,
0.0.1.0 . 0.0.1.0 : accept,
[...]
0.0.20.0 . 0.0.20.0 : accept

并沿此规则使用,如果找到,vmap将执行地图中的判决:

代码语言:javascript
复制
ip saddr & 0.0.255.0 . ip daddr & 0.0.255.0 vmap @accept-same-y
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/591128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档