如何为saddr和daddr重复使用相同的nftables集?

如何为saddr和daddr重复使用相同的nftables集?

我使用以下 nftables 配置将可以使用路由器的计算机列入白名单:

table bridge filter {
    set authorized {
        typeof ether saddr
        flags constant
        elements = {
            aa:aa:aa:aa:aa:aa,
            ff:ff:ff:ff:ff:ff
        }
    }

    set authorized2 {
        typeof ether daddr
        flags constant
        elements = {
            aa:aa:aa:aa:aa:aa,
            ff:ff:ff:ff:ff:ff
        }
    }

    chain input {
            type filter hook input priority 0; policy drop;
            ether saddr @authorized accept
            ether daddr @authorized2 accept
    }

}

除类型外,这两组完全相同。

有什么方法可以为两者指定和仅使用一组saddrdaddr避免重复 MAC 地址吗?

答案1

很简单:与手册页中可以检查的typeof ether saddr类型相同typeof ether daddrnft(8):

以太网报头表达式

ether {daddr | saddr | type}

表 37. 以太网标头表达式类型

关键词 描述 类型
爸爸 目的MAC地址 以太地址
萨德尔 源MAC地址 以太地址
类型 以太类型 以太类型

这意味着可以使用下面 3 种等效方法之一定义单个集合,并获得相同的结果。以前不存在视觉区别nftables0.9.4其中引入使用第一列中的定义的新关键字作为使用第三列中的定义的关键字typeof的替代。type

  • 原始type关键字(需要检查文档以了解确切类型)

    type ether_addr
    
  • 或较新的typeof关键字(可以或多或少地重用使用它的规则中的词汇表)

    • 任何一个

      typeof ether saddr
      
    • 或者

      typeof ether daddr
      

所以最终规则集可以写成:

table bridge filter {
    set authorized {
        typeof ether saddr
        flags constant
        elements = {
            aa:aa:aa:aa:aa:aa,
            ff:ff:ff:ff:ff:ff
        }
    }

    chain input {
            type filter hook input priority 0; policy drop;
            ether saddr @authorized accept
            ether daddr @authorized accept
    }
}

注意:当前规则集接受该集合中的任何内容或该集合中的任何内容。不匹配两个都同时。另外,由于它是输入钩子而不是向前钩子,必须接受目标 MAC 地址是自己的 MAC 地址看起来有点奇怪(当然,在混淆时,不应该设置第一个字节多播位,它作为源无效。但是如果目标是匹配广播目的地,这是一种方法)。

相关内容