nftables 不解析复杂协议,仅基于 conntrack 实现四层状态过滤,并与外部工具协同完成协议级监控;其在跨网闸场景中应部署于前后端服务器,而非网闸本体。

nftables 本身不解析复杂协议(如 OPC UA、DNP3、Modbus TCP、FTP 控制/数据通道分离等),也无法直接监控跨网闸(air-gapped 或单向光闸)环境中的协议状态机。它能做的,是基于连接跟踪(conntrack)提供可靠、轻量、内核级的四层状态过滤,并与外部检测机制协同完成“有状态”策略执行。
关键在于:nftables 不做深度解析,但可精准分流、标记、限速、丢弃或重定向,为上层协议分析模块提供干净、可控的数据流入口。
跨网闸场景下 nftables 的合理定位
- 网闸通常采用“摆渡+协议剥离”或“单向光纤+内容白名单”架构,物理隔离两侧网络;
- 协议穿越时往往被拆解、重组、校验、日志化,原始 TCP 流可能被转换为 UDP 封装、HTTP 隧道或定制报文;
- 在这种环境下,nftables 部署位置通常是:
- 网闸前端(接入侧)服务器:对入向原始流量做初步连接状态控制与速率限制;
- 网闸后端(业务侧)服务器:对出向还原后的协议流做目标服务准入控制;
- 不建议在网闸设备本体上运行 nftables(多数专用网闸使用定制内核或无 shell 环境)。
利用 conntrack 实现可靠的四层有状态过滤
nftables 原生支持 ct state 匹配,这是最稳定、低开销的状态感知方式:
-
ct state established:只放行已完成三次握手的 TCP 连接、或已有对应 conntrack 条目的 UDP 流(如 DNS 响应); -
ct state related:匹配由主连接触发的辅助连接(例如 FTP 数据通道、SIP RTP 关联流、ICMP 错误报文); -
ct state invalid:匹配无法归入任何连接的异常包(如伪造 FIN/ACK、失序 RST、无连接的 ACK),建议默认 drop; -
ct status dnat/snat:在 NAT 环境中区分内外方向,适用于网闸做地址映射的场景。
示例规则(部署于网闸后端业务服务器 input 链):
# 默认拒绝所有新连接请求 nft add rule inet filter input ct state invalid drop nft add rule inet filter input ct state new tcp flags & (tcp fin | tcp syn | tcp rst | tcp ack) != tcp syn drop nft add rule inet filter input ct state established accept nft add rule inet filter input ct state related accept # 仅允许已建立连接的返回流量,禁止主动发起新连接到内部服务 nft add rule inet filter input iifname "eth0" ct state new reject with icmpx type port-unreachable
⚠️ 注意:
ct state new并非指“第一次 SYN”,而是 conntrack 内核模块判定为新建连接条目的包;若网闸做了连接复用或隧道封装,需确保其行为兼容 conntrack。
与外部协议监控模块协同工作
真正实现“复杂协议监控”,需引入用户态组件,nftables 负责配合:
-
通过
meta mark标记特定流量,供用户态工具(如 Suricata、custom eBPF probe、Python 协议解析器)识别并处理:nft add rule inet filter input tcp dport 502 meta mark set 0x1234
-
使用
queue目标将指定协议包送入用户态队列(需nfnetlink_queue模块):nft add rule inet filter input tcp dport 44818 queue num 0
用户程序可调用 libnetfilter_queue 接收、解析 CIP/EtherNet/IP 报文,再通过 netlink 发送 verdict(accept/drop)。
-
结合
limit和meter实现协议级速率控制(防爆破、防洪):# 对 Modbus TCP(502端口)每秒最多放行 5 个新连接 nft add rule inet filter input tcp dport 502 ct state new meter modbus_limit { ip saddr limit rate 5/second } accept
针对跨网闸的特殊注意事项
- 避免依赖应用层字段:nftables 不解析 HTTP URI、TLS SNI、MQTT Topic,这些必须交由代理或 DPI 工具处理;
-
禁用连接跟踪干扰项:某些网闸会修改 TTL、TOS 或插入中间代理头,导致 conntrack 误判;可临时关闭
nf_conntrack_tcp_be_liberal=1或调整nf_conntrack_tcp_loose; -
日志与审计联动:用
log prefix "modbus-deny:" level warn记录被拒连接,输出至 journald 或 rsyslog,供 SIEM 统一分析; -
规则持久化与加载时机:确保
nftables.service在网闸代理服务启动前就绪,避免启动窗口期暴露。
不复杂但容易忽略。











