nftables 实现复杂网络路由转发的核心是协同 conntrack、NAT 链、策略路由标记与多接口分流,通过 prerouting/forward/postrouting 链配合 ip rule/ip route 完成“标记→选路→转换”,支持 DNAT/SNAT、多出口分流、容器隔离及动态集合策略。

nftables 处理复杂网络拓扑下的路由转发,核心在于结合 连接跟踪(conntrack)、NAT 链、策略路由标记 和 多接口流量分流,而不是单纯靠静态规则堆砌。它不替代内核路由表,而是与 ip rule、ip route 协同工作,实现“先标记、再选路、最后转换”的精细控制。
明确转发场景与链选择
转发类规则必须放在 forward(过滤)和 prerouting / postrouting(NAT)链中,且严格区分方向:
-
入站流量经网关转发:走
prerouting → forward → postrouting,重点在 DNAT + 状态放行 + SNAT -
出站流量从多出口分发:需在
output或prerouting中打标记(meta mark set),再由ip rule查指定路由表 -
容器或 Pod 流量隔离:常配合 cgroup 或 interface 名称(如
oifname "cni0")识别来源,避免影响主机流量
用 nftables 打标记,交给内核路由决策
nftables 本身不改路由表,但可通过 meta mark 或 ct mark 给数据包打标签,触发策略路由:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 给来自特定子网的流量打标:
nft add rule ip filter forward ip saddr 10.10.20.0/24 meta mark set 0x100 - 为 Kubernetes Pod 流量单独标记:
nft add rule ip filter forward iifname "cni0" meta mark set 0x200 - 标记后需配套配置:
ip rule add fwmark 0x100 table 100,再用ip route add default via 192.168.10.1 dev eth1 table 100
跨网段端口转发与地址转换协同
典型双出口网关(如 eth0 接内网、eth1 接公网、eth2 接管理网)需组合使用 DNAT、SNAT 和接口限制:
- 将公网 203.0.113.5:8080 映射到内网 10.0.0.100:80:
nft add rule ip nat prerouting ip daddr 203.0.113.5 tcp dport 8080 dnat to 10.0.0.100:80 - 确保返回流量能正确回源(关键!):
nft add rule ip nat postrouting ip saddr 10.0.0.100 oifname "eth1" snat to 203.0.113.5 - 限制仅从公网接口进入的包才做 DNAT:
nft add rule ip nat prerouting iifname "eth1" ...,防内网伪造攻击
动态分流:结合集合与连接状态提升灵活性
面对混合云或多租户环境,硬编码 IP 不现实,推荐用 动态集合 + ct state 实现自适应转发:
- 创建可热更新的出口白名单集合:
nft add set ip filter egress_whitelist { type ipv4_addr; flags dynamic; } - 对命中集合的连接允许转发:
nft add rule ip filter forward ip daddr @egress_whitelist ct state established,related accept - 配合 conntrack 标记做会话级控制:
nft add rule ip filter forward ct mark 0x1 meta mark set 0x1,后续路由规则据此跳转


















