nftables通过iifname和oifname可实现跨网卡双向流精准控制,需分链处理入向与出向流量,并结合ct state或集合提升多接口管理效率。

直接用 meta iifname(入接口名)配合 oifname(出接口名)就能实现跨网卡的双向流精准控制,关键不在“双向”本身,而在于区分方向、绑定策略、避免规则冲突。
明确入向与出向的匹配逻辑
网络流量有天然方向性:进来的包走 iifname,出去的包走 oifname。nftables 不支持单条规则同时匹配两者,必须分链或分规则处理:
-
iifname "eth0"匹配所有从 eth0 进来的包(如外网请求) -
oifname "eth1"匹配所有从 eth1 发出去的包(如内网响应) - 若需限制“从 eth0 进、再从 eth1 出”的整条路径,不能靠单条规则,而要结合连接跟踪状态(
ct state established,related)或标记(ct mark)联动判断
典型跨网卡策略场景与写法
常见需求不是“禁止某卡通信”,而是“只允许某方向通行”或“隔离不同网段间转发”:
- 放行从公网卡(ppp0)进、内网卡(br0)出的已建立连接:
nft add rule inet filter forward iifname "ppp0" oifname "br0" ct state established,related accept - 禁止内网设备主动访问公网(即 br0 进、ppp0 出的新建连接):
nft add rule inet filter forward iifname "br0" oifname "ppp0" ct state new drop - 让管理网卡(mgmt0)只接受 SSH,且仅限本机响应:
nft add rule inet filter input iifname "mgmt0" tcp dport 22 acceptnft add rule inet filter output oifname "mgmt0" tcp sport 22 accept
用 meta iifname + 集合提升多网卡管理效率
当有多个物理口或虚拟口需要统一策略时,硬编码每个 iifname 易出错。可用命名集合批量管理:
- 创建接口集合:
nft add set inet filter wan_ifs { type ifname \; }nft add element inet filter wan_ifs { "ppp0", "enp1s0" } - 一条规则覆盖所有 WAN 口入向过滤:
nft add rule inet filter input iifname @wan_ifs ip saddr 0.0.0.0/0 counter drop(先拦非法源) - 配合
fib判断路由意图,防止绕过:nft add rule inet filter forward iifname @wan_ifs fib daddr type local counter drop(防公网直打本机服务)
注意 oifname 在 OUTPUT 链中的行为边界
oifname 在 output 链中可用,但仅适用于**路由后已确定出口**的包。未路由的本地生成包(如 ping 127.0.0.1)可能无 oifname,此时规则不匹配。稳妥做法是:
- 优先在
forward链处理跨网卡转发 - 在
output链用oifname时,加fib daddr type unicast或ip daddr != 127.0.0.0/8排除本地环回 - 对严格控制出口的场景(如只允许某卡发 DNS),建议搭配
meta skuid或socket表达式进一步限定应用层来源










