nftables 组对 { IP/MAC 地址 }

nftables 组对 { IP/MAC 地址 }

有可能做这样的事情吗:

    set authorized {
    type ipv4_addr ether_addr
    flags constant

    elements = {
        { ipaddr: 192.168.1.xx, etheraddr: xx:xx:xx:xx:xx:xx },
        { ipaddr: 192.168.1.xx, etheraddr: xx:xx:xx:xx:xx:xx },
        { ipaddr: 192.168.1.xx, etheraddr: xx:xx:xx:xx:xx:xx },
    }
}

这将返回语法错误。是否有有效的语法来执行此操作?nftables 网站设置页面上没有显示任何内容。

谢谢

答案1

OP 的集合定义有多个语法错误。

需要一组元素,其中每个元素都是两个基本类型(IPv4 + 以太网)的组合:它不是一组简单的元素,而是一个连接

连接

自 Linux 内核 4.1 起,nftables 支持连接。

此新功能允许您将两个或多个选择器放在一起,以执行非常快速的查找地图、vmap 和仪表。

目前,在所有nft的手册页, A单词的一次出现连接似乎用于非平凡用途,但未在此处定义。因此,虽然nftables' 维基百科有时包含过时的信息,但它仍然包含有用的文档来补充手册。

字符.用于连接多个基值。此外,集合元素不使用额外的对,{ }也不使用:用于映射的字符。

这可以像下面这样定义和使用,重复使用 OP 的信息和具体值。主机将只允许来自匹配的源 IPv4 地址和以太网源 MAC 地址对的传入流量,例如作为一种强制 MAC 和 IP 地址之间关联的方式:

table ip t {
    set authorized {
        type ipv4_addr . ether_addr
        flags constant
        elements = {
            192.168.1.1 . 02:00:00:00:00:01,
            192.168.1.2 . 02:00:00:00:00:02,
            192.168.1.3 . 02:00:00:00:00:03
        }
    }

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

笔记:较新版本的nftables和 kernel 允许更简单的语法。而不是:

type ipv4_addr . ether_addr

当需要找出ipv4_addrether_addr在一些额外的文档中找到它时,可以改用:

typeof ip saddr . ether saddr

重复使用规则语法中使用的相同关键字。

相关内容