iptables不能直接识别反弹shell应用层行为,只能基于端口、协议、ip等网络层特征匹配规则;需结合其出站连接特征在output链设drop默认策略,放行必要流量,并联动conntrack、fail2ban等实现纵深防御。

iptables本身不直接识别“反弹Shell”这类应用层行为,它只能基于网络层和传输层特征(如端口、协议、连接状态、IP/端口组合)做规则匹配。真正有效的加固,是结合反弹Shell的典型通信模式,用iptables在入口处做前置拦截,同时配合其他手段形成纵深防御。
识别反弹Shell的典型网络特征
常见反弹Shell流量具备以下可被iptables捕获的特征:
- 出站连接目标端口集中:攻击者常监听80、443、53、4444、5555等“白名单端口”,诱导目标机主动连接
- 源IP不可信但目标IP固定:内网主机向外部某个特定IP(如C2服务器)发起TCP连接,且该IP不在业务白名单中
- 连接状态异常:大量短连接、无HTTP/HTTPS协议头的纯TCP连接、源端口非常规(如高位随机端口→目标80)
-
非业务协议混用:例如目标端口为80,但数据包不含
GET /或Host:字段(需配合string模块,但性能开销大,慎用)
用iptables拦截高风险出站连接(OUTPUT链)
这是最直接、最可控的加固方式——不让本机主动连出去。适用于Web服务器、数据库等无需外联的生产节点。
- 先设置默认策略为DROP:
iptables -P OUTPUT DROP - 仅放行必需的出站流量,例如DNS解析:
iptables -A OUTPUT -p udp --dport 53 -d 8.8.8.8 -j ACCEPT - 放行NTP时间同步:
iptables -A OUTPUT -p udp --dport 123 -d 192.168.1.1 -j ACCEPT - 禁止所有到公网C2常用IP段的连接(可定期更新):
iptables -A OUTPUT -d 185.108.224.0/22 -j DROP - 限制单IP并发连接数,防批量反连:
iptables -A OUTPUT -p tcp -m connlimit --connlimit-above 5 -j DROP
在入口侧阻断已知C2通信模式(INPUT/FORWARD链)
若服务器需对外提供服务,但要防止被用作跳板或被植入后反连控制端,可在INPUT链中做针对性封禁:
- 拒绝来自已知恶意IP段的所有新连接:
iptables -I INPUT -s 45.128.0.0/16 -m state --state NEW -j DROP - 拦截非标准端口上的SSH连接尝试(反弹Shell常伪装成SSH):
iptables -I INPUT -p tcp --dport 2222 -m state --state NEW -j DROP - 对Docker宿主机,重点管控DOCKER-USER链,防止容器内反弹Shell绕过:
iptables -I DOCKER-USER -p tcp -m multiport --dports 4444,5555,6666 -j DROP - 禁止非负载均衡器IP访问管理端口(如22、3306):
iptables -I INPUT -p tcp --dport 22 ! -s 10.10.0.0/16 -j DROP
配套加固与验证建议
iptables只是第一道防线,必须与其他机制联动:
- 启用
conntrack并记录可疑连接:iptables -I INPUT -p tcp -m state --state NEW -m limit --limit 3/min -j LOG --log-prefix "NEW_CONN: " - 用
tcpdump抓包验证规则是否生效:tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and port 4444' - 结合Fail2Ban监控日志,自动封禁反复试探的IP
- 禁止非必要用户执行
/dev/tcp或nc等工具,从源头减少反弹能力 - 定期导出规则并审计:
iptables-save > /etc/iptables/rules.v4,避免重启丢失










