iptables记录慢连接攻击需先log后drop,关键在-i插入链首、启用--log-tcp-options/--log-ip-options捕获异常tcp/ip特征,并通过rsyslog分离日志至/var/log/iptables-slow.log,配合增大内核缓冲防丢日志。

要记录并分析慢连接攻击(如 Slowloris、Slow HTTP POST 等),关键不是简单拦截,而是在连接建立初期就捕获异常行为特征,并留下可追溯的原始报文线索。iptables 本身不解析应用层内容,但可通过组合状态跟踪、TCP 标志、连接速率和精细日志字段,实现对慢速攻击的有效识别与留痕。
一、识别慢连接攻击的关键特征
慢连接攻击本质是滥用 HTTP 协议握手或请求过程:
- 发送不完整的 HTTP 请求头(如只发
GET / HTTP/1.1\r\nHost:后长期不补全) - 极慢地分段发送请求体(每几十秒发一个字节)
- 维持大量半开连接(
SYN_RECV或ESTABLISHED但无数据交互)
iptables 虽不能解析 HTTP 内容,但能观察以下网络层信号:
- 大量
SYN包未完成三次握手(SYN Flood 变种) -
ESTABLISHED状态连接长时间无数据(需配合 conntrack) - TCP 标志异常(如重复
PSH、无ACK的FIN、超长空闲ACK) - 单 IP 建立过多并发连接(即使每个连接流量极小)
二、用 iptables 记录可疑连接行为
仅靠 -j DROP 无法取证,必须先 -j LOG,且带足够字段:
# 记录所有新 TCP 连接(含源端口、TTL、TCP 选项等) iptables -I INPUT -p tcp -m state --state NEW -j LOG \ --log-prefix "SLOW-NEW: " \ --log-tcp-options \ --log-ip-options \ --log-uid \ --log-level 6 # 记录长时间空闲但仍 ESTABLISHED 的连接(需配合 conntrack 日志) iptables -I INPUT -p tcp -m conntrack --ctstate ESTABLISHED -m recent --name slow_conn --rcheck --seconds 300 -j LOG \ --log-prefix "SLOW-IDLE: " \ --log-level 6
⚠️ 注意:
-
--log-tcp-options才能捕获 MSS、Window Scale、Timestamp —— 慢连接常篡改这些值 -
--log-ip-options可发现异常路由选项(虽少见,但扫描工具偶用) -
--log-uid对 OUTPUT 链更实用;INPUT 中一般为 0,但可辅助判断是否本地代理发起 -
--log-prefix必须加,否则日志混杂难过滤
三、让日志真正可用:避免丢弃与便于分析
内核 printk 缓冲默认仅 64KB,高并发下日志会静默丢失:
# 增大内核日志缓冲(临时) sysctl -w kernel.printk_ratelimit=0 sysctl -w kernel.printk_ratelimit_burst=1000 # 持久化:写入 /etc/sysctl.conf echo 'kernel.printk_ratelimit = 0' >> /etc/sysctl.conf echo 'kernel.printk_ratelimit_burst = 1000' >> /etc/sysctl.conf
同时,用 rsyslog 将 iptables 日志分离到独立文件:
# /etc/rsyslog.d/iptables-slow.conf :msg, contains, "SLOW-" /var/log/iptables-slow.log & stop
然后创建文件、设权限、重启服务:
touch /var/log/iptables-slow.log chmod 640 /var/log/iptables-slow.log chown root:adm /var/log/iptables-slow.log systemctl restart rsyslog
四、从日志中提取慢连接线索
原始日志示例(简化):
Jul 30 01:22:14 server kernel: SLOW-NEW: IN=eth0 OUT= MAC=... SRC=192.168.5.111 DST=10.0.0.2 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=12345 DF PROTO=TCP SPT=54321 DPT=80 WINDOW=64800 RES=0x00 ACK SYN URGP=0 OPT (020405B40402080A000000000000000001030307)
常用分析命令:
-
查看高频慢连接源 IP:
awk '/SLOW-NEW/ {for(i=1;i -
提取异常 TCP 选项(如无 Window Scale 但声明大窗口):
grep "SLOW-NEW" /var/log/iptables-slow.log | grep -v "0303" # 0303 是 Window Scale 选项标识,缺失可能为手工构造包
-
统计单 IP 长时间空闲连接数:
awk '/SLOW-IDLE/ {for(i=1;i 5'
不复杂但容易忽略。











