实现基于连接上下文的智能策略过滤,核心是让nftables协同内核与用户空间模块整合连接生命周期、网络行为及进程归属等信息驱动精准决策;依托ct state/ct helper构建基础连接上下文,结合cgroupv2、socket元数据、ct mark/meta mark实现服务级与跨模块上下文传递,并通过time、limit、ipset支持动态伸缩策略。

实现基于连接上下文的智能策略过滤,核心不是让 nftables 自己“理解”协议,而是让它高效协同内核与用户空间模块,把连接生命周期、网络行为特征、进程归属等上下文信息组织起来,再驱动精准决策。nftables 本身不维护应用层状态,但它是极佳的策略调度中枢。
用 ct state + ct helper 构建基础连接上下文
conntrack 是所有上下文感知的起点。它自动为每个连接打上状态标签(established/related/invalid),还支持协议辅助模块(ct helper)识别特定协议的关联流:
- 启用 FTP helper:加载 nf_conntrack_ftp 模块后,conntrack 能识别 PORT 命令并自动跟踪后续数据连接,使 ct state related 可匹配 FTP 数据包
- 启用 SIP helper:配合 nf_conntrack_sip,可让 related 状态覆盖 RTP 媒体流,避免手动开大量端口
- 规则示例:允许主连接及由其触发的合法辅助流
nft add rule inet filter forward ct state established,related accept
用 meta cgroupv2 + socket 标记服务级上下文
容器或 systemd 服务可通过 cgroup v2 划分资源边界,nftables 可直接读取进程所属 cgroup 路径,实现“谁发起、谁受控”:
- 确保系统启用 cgroup v2(kernel 启动参数含 systemd.unified_cgroup_hierarchy=1)
- 为关键服务(如 nginx、redis)配置独立 cgroup,例如 /sys/fs/cgroup/web
- 在 OUTPUT 或 FORWARD 链中匹配:
nft add rule inet filter output meta cgroupv2 "/sys/fs/cgroup/web" tcp dport 443 accept - 搭配 socket 层元数据(如 meta skuid)可进一步限制到具体用户,避免服务被提权后滥用出口
用 ct mark / meta mark 实现跨模块上下文传递
标记(mark)是连接上下文在不同处理模块间流转的“通行证”。nftables 不生成上下文,但能读写、判断、转发标记:
- eBPF 程序检测到 TLS ClientHello 中 SNI 为黑名单域名,调用 bpf_skb_mark(skb, 0x100)
- nftables 在 INPUT 链捕获该标记:
nft add rule inet filter input meta mark & 0x100 == 0x100 drop - 用户态守护进程解析 DNS 查询后,将恶意域名对应的连接五元组写入 ipset,并通过 nftables map 更新 ct mark
- 注意:ct mark 存于连接跟踪项中,对整个连接生效;meta mark 存于 skb 中,仅对当前包有效
结合 time、limit 与 ipset 实现动态上下文策略
真实业务有节奏、有范围、有时效——策略也应随上下文变化而伸缩:
- 工作时间放行运维跳板机 IP:
nft add rule inet filter input ip saddr @jumpbox_ips time hour 8-20 accept - 对高频短连接(如健康检查)限速,避免耗尽 conntrack 表:
nft add rule inet filter input ct state new limit rate 5/second burst 10 accept - 用 ipset 存储实时威胁情报(如失陷 IP、恶意 C2 域名解析出的地址),配合 timeout 自动清理:
nft add set inet filter threat_ioc { type ipv4_addr; timeout 30m; }










