nftables的concat实现mac+ip绑定,核心是将ether saddr与ip saddr拼成10字节唯一键,通过哈希查表一次匹配;需用ip地址族建map、小写冒号mac格式、点分十进制ip,并在input链调用@macip_map{ether saddr . ip saddr}。

用 nftables 的 concat 实现 MAC + IP 绑定,核心是把 ether saddr 和 ip saddr 拼成唯一键,让内核一次哈希查表就确认是否合法组合,避免规则堆叠和线性扫描。
构造支持 MAC+IP 的映射表
需严格按字段类型与顺序定义映射:
-
ether saddr 对应 6 字节 MAC 地址(类型
ether_addr) -
ip saddr 对应 4 字节 IPv4 地址(类型
ipv4_addr) - 两者拼接总长 = 6 + 4 = 10 字节,远低于 256 字节上限,安全可靠
执行建表命令:
nft add map ip filter macip_map { type ether_addr . ipv4_addr : verdict; }插入合法绑定对
每条元素格式为 MAC . IP : 动作,支持批量写入:
注意:MAC 地址必须用小写、冒号分隔;IP 必须是标准点分十进制格式;动作可为 accept、drop 或跳转链(如 jump secure_chain)。
在 INPUT 链中调用绑定规则
规则需显式指定匹配方向,并启用计数器便于验证:
nft add rule ip filter input @macip_map { ether saddr . ip saddr } counter⚠️ 关键细节:
- 必须使用
ip地址族(非inet),因为ether saddr仅在 L2 层可用,不支持双栈 - 该规则只作用于进入本机的流量(INPUT),不适用于转发(FORWARD)或出向(OUTPUT)
- 若需同时限制 ARP 请求中的 IP-MAC 关系,需额外在
arp表中单独配置(concat 不跨地址族)
验证是否真正生效
三步快速确认:
- 运行 nft list map ip filter macip_map -n 查看原始键值,例如
0xaabbccddeeff . 0xc0a80a05,确认无解析错误 - 加
counter后发包测试,再执行 nft --handle --numeric list chain ip filter input 观察计数器是否递增 - 开启 trace:nft add rule ip filter input meta nftrace set 1,另起终端跑 nft monitor trace | grep -A3 'macip_map',确认命中路径为 map 查找而非 fallback
不复杂但容易忽略:MAC 地址在虚拟化或容器环境中可能被重写,生产环境建议配合 iifname 进一步限定物理入口(如 ether saddr . ip saddr . iifname),提升绑定可靠性。











