nftables 不是横向移动检测工具,而是通过策略性流量限制阻断其网络通路。它按角色控制smb/rdp等高危协议通信,利用docker-user链拦截容器渗透,结合限速与动态黑名单压制扫描行为,并通过日志实现检测-阻断-响应闭环。

nftables 本身不是专为内网横向移动设计的检测工具,但它能成为阻断横向移动的关键网络控制层。它的作用不在于识别攻击行为(如Pass-the-Hash、SMB爆破、WMI滥用),而在于用策略性流量限制,让攻击者“连不通、连不上、连得慢、连得少”——从网络通路层面压缩横向移动的生存空间。
锁定内网通信边界:按角色划分出站/入站策略
横向移动依赖于主机间建立新连接(尤其是SMB/445、RDP/3389、WinRM/5985、LDAP/389、DNS/53等协议)。nftables 可在宿主机或网关节点上,对这些协议实施精细化放行:
- 仅允许业务必需的跨网段通信,例如:
- 数据库服务器 → 应用服务器(只放行 3306/tcp 或 5432/tcp)
- 域控制器 → 特定管理终端(只放行 389/636/53/88)
- 显式拒绝非授权方向的高危端口:
nft add rule ip filter output oifname "eth1" ip daddr 10.20.0.0/16 tcp dport { 445, 3389, 5985 } drop - 禁止内网主机主动向其他内网网段发起任意 TCP 连接(默认 deny-out + 白名单例外),切断“扫描→爆破→利用”的链路起点。
利用 DOCKER-USER 或自定义链拦截容器级横向渗透
当攻击者通过容器逃逸或利用容器网络(如 docker0、cni0)尝试横向跳转时,标准 INPUT/OUTPUT 链可能已失效。此时需借助:
-
DOCKER-USER链(Docker 自动创建,优先级高于 dockerd 内置规则):# 拦截容器发往内网其他子网的 SMB 请求 nft add rule ip filter DOCKER-USER oifname "docker0" ip daddr 172.16.10.0/24 tcp dport 445 drop # 限制容器对外新建连接速率(防暴力扫描) nft add rule ip filter DOCKER-USER oifname "docker0" ct state new limit rate 5/minute burst 10 packets drop
- 若使用 CNI(如 Calico、Cilium),可在 host-local 链中插入类似规则,覆盖 pod-to-pod 流量。
基于连接状态与速率的动态压制
横向移动常伴随高频短连接(如密码喷洒、端口扫描、域控枚举)。nftables 可结合 conntrack 和限速机制实时干预:
- 对新建连接(
ct state new)做速率限制:nft add rule ip filter input ip saddr @scan-blockers ct state new limit rate 3/second burst 6 packets drop
- 将异常源 IP 加入动态黑名单集合(
@scan-blockers),配合脚本自动更新:nft add set ip filter scan-blockers { type ipv4_addr\; } # 日志中捕获到连续失败登录后,脚本执行: nft add element ip filter scan-blockers { 10.1.5.22 }
配合日志审计实现闭环响应
nftables 支持 log 目标,可记录被拦截的可疑连接,为溯源提供依据:
nft add rule ip filter input tcp dport { 445, 3389 } log prefix "BLOCKED-SMB-RDP: " drop
配合 rsyslog 或 journalctl 过滤 BLOCKED-SMB-RDP 日志,触发告警或联动脚本自动封禁源IP,形成“检测→阻断→响应”轻量闭环。
不复杂但容易忽略











