nftables封锁容器反弹shell的核心是切断外连通道:output链默认drop并白名单放行,docker-user链拦截高危端口与异常连接,结合限速、连接数控制及日志审计实现纵深防御。

用 nftables 封锁容器发起的反弹 Shell,核心不是识别命令本身,而是切断其外连通道——重点盯住 OUTPUT 链 和 DOCKER-USER 链,限制非业务目标、非常规端口、高频新建连接,并防止容器绕过宿主机规则。
锁定容器出站流量:OUTPUT 链设默认 DROP
容器进程在宿主机上表现为普通用户进程,其外连行为走的是宿主机的 OUTPUT 链。最有效的方式是先收紧出口:
- 设置 OUTPUT 默认策略为 drop:nft add chain ip filter output '{ type filter hook output priority 0; policy drop; }'
- 仅放行必需服务:DNS(53/udp)、NTP(123/udp)、镜像仓库(如 443/tcp 到 registry.example.com)等,全部显式声明
- 禁止向公网私有地址段发 TCP 连接(防横向渗透):nft add rule ip filter output ip daddr { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } tcp drop
拦截高危端口与 C2 常用目标
反弹 Shell 常连 4444、5555、6666、12345 等端口,或伪装成 80/443;结合目标 IP 段可大幅提升准确率:
- 封禁典型反弹端口的出站请求:nft add rule ip filter output tcp dport { 4444, 5555, 6666, 12345 } drop
- 拉黑已知恶意 C2 地址段(例如 185.108.224.0/22、193.108.167.0/24),定期更新:nft add rule ip filter output ip daddr 185.108.224.0/22 drop
- 若业务不需主动发 HTTP 请求,直接封禁所有出站 80/443:nft add rule ip filter output tcp dport { 80, 443 } drop
堵死容器逃逸路径:DOCKER-USER 链优先级控制
Docker 自动插入 DOCKER-USER 链,位于 NAT 和 FILTER 之间,是拦截容器网络行为的“黄金位置”。它比宿主机 INPUT/OUTPUT 更早生效,且不受 dockerd 内部规则干扰:
- 确保 DOCKER-USER 链存在并启用:nft add table ip docker-filter → nft add chain ip docker-filter DOCKER-USER '{ type filter hook input priority -4; policy accept; }'
- 在 DOCKER-USER 中丢弃可疑入站连接(如非 22/80/443 的新连接):nft add rule ip docker-filter DOCKER-USER tcp dport != { 22, 80, 443 } ct state new drop
- 重点封禁容器向外发起的高危端口连接:nft add rule ip docker-filter DOCKER-USER oifname "docker0" tcp dport { 4444, 5555 } drop
压制异常连接行为:限速 + 连接数控制
反弹 Shell 工具(如 Meterpreter)失败后常高频重连,可用 conntrack 辅助识别:
- 限制单 IP 目标每分钟新建连接数(防爆破式反连):nft add rule ip filter output tcp ct state new limit rate 3/minute burst 5 packets counter drop
- 限制同一目的 IP:PORT 的并发连接数(防多线程反连):nft add rule ip filter output tcp dport { 4444, 5555 } ct count over 3 drop
- 记录可疑连接供后续分析:nft add rule ip filter output tcp dport 4444 log prefix "CONTAINER-C2-ATTEMPT: " counter drop











