有可能做这样的事情吗:
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 支持连接。
目前,在所有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_addr
或ether_addr
在一些额外的文档中找到它时,可以改用:
typeof ip saddr . ether saddr
重复使用规则语法中使用的相同关键字。