nftables concat特性通过构造ipv4_addr.inet_service.inet_protocol复合键实现单次哈希匹配。需严格按顺序创建映射、插入带协议区分的键值,并在规则中用@引用及相同顺序拼接字段,配合counter和trace验证命中路径。

直接用 nftables 的 concat 特性,可以把源 IP、目的端口、传输协议三个字段拼成一个复合键,让内核一次哈希查找就完成匹配,避免逐条规则扫描。关键不是“加条件”,而是“造键值”。
构造支持三字段拼接的映射表
先建一个类型为 ipv4_addr . inet_service . inet_protocol 的映射,注意字段顺序和类型必须严格对应:
-
ipv4_addr对应ip saddr(4 字节) -
inet_service对应tcp dport或udp dport(2 字节) -
inet_protocol对应ip protocol(1 字节),值为 6(TCP)或 17(UDP)
执行命令创建映射:
nft add map inet filter ipportproto_map { type ipv4_addr . inet_service . inet_protocol : verdict; }插入带协议区分的复合规则
同一个端口(比如 8080)对 TCP 和 UDP 可以定义不同动作。例如只允许 TCP 8080,拒绝 UDP 8080:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
-
192.168.10.5 . 8080 . 6 : accept(TCP) -
192.168.10.5 . 8080 . 17 : drop(UDP)
一次性写入:
nft add element inet filter ipportproto_map { 192.168.10.5 . 8080 . 6 : accept, 192.168.10.5 . 8080 . 17 : drop }在链中调用 concat 规则
在 input 链里添加一条规则,用 @ 引用映射,并按相同顺序拼接字段:
⚠️ 注意:这里 tcp dport 是协议敏感写法;若需同时覆盖 TCP/UDP,得改用通用字段 th dport 并确保映射中协议值一致,否则会不命中。
验证与排错要点
拼接类规则容易静默失效,建议三步确认:
- 用
nft list map inet filter ipportproto_map -n查看实际插入的数值(如0xc0a80a05 . 0x0318 . 0x06),避免字符串解析歧义 - 加
counter后运行nft monitor trace,观察是否真正查到了映射路径,而非 fallback 到下一条规则 - 确认所有字段总长 ≤ 256 字节(本例仅 7 字节,安全)










