iptables日志需插在DROP/REJECT规则之前,配合--log-prefix、--log-tcp-options、--log-ip-options等参数确保字段完整,并通过rsyslog分离存储、awk/grep提取分析。

iptables 日志不是“开了就完事”,关键在规则位置、字段完整性和后续可分析性。日志必须出现在 DROP/REJECT 之前,否则包已丢弃,根本不会记录;同时要带前缀、限频、分离存储,才能真正用于排查和告警。
日志规则必须插在丢弃动作之前
LOG 目标不终止规则链,但必须确保它在 DROP 或 REJECT 规则之前匹配,否则无日志可记。推荐用 -I 插入链首,避免被后续规则跳过:
- 错误写法(放在 DROP 后):日志永远不会触发
- 正确写法:sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "SSH-NEW: " --log-tcp-options --log-ip-options
- 若需记录被拒绝的连接,应在 DROP 前加 LOG,例如:先 LOG 再 DROP,而非反过来
用 --log-prefix 和扩展选项提升日志信息量
没有前缀的日志难以过滤,没有 TCP/IP 选项的日志难以识别扫描行为。必须搭配以下参数:
- --log-prefix "xxx":强制添加唯一标识,如 "BLOCK-ICMP: ",便于 grep 或 rsyslog 过滤
- --log-tcp-options:记录 TCP 标志位、窗口大小、时间戳等,对识别端口扫描或指纹探测很关键
- --log-ip-options:捕获源路由、记录路由等非常规 IP 选项,有助于发现隐蔽攻击尝试
- 可选:--log-level 4(warning 级),避免淹没在 info 级噪音中
通过 rsyslog 实现日志分离与缓冲优化
默认日志混在 /var/log/messages 或 syslog 中,必须分离才能高效分析:
- 编辑 /etc/rsyslog.d/iptables.conf,添加:
:msg, contains, "SSH-NEW:" -/var/log/iptables-ssh.log
:msg, contains, "BLOCK-" -/var/log/iptables-block.log
& stop - 重启服务:sudo systemctl restart rsyslog
- 为防日志丢失,建议在 /etc/rsyslog.conf 中调大内核日志缓冲区:
$SystemMaxMessageSize 64k
$IMJournalStateFile /var/lib/rsyslog/imjournal.state
用命令行快速筛选与结构化提取关键字段
原始日志是文本流,需用标准工具提取 src、dst、dpt、proto 等字段:
- 查所有 SSH 尝试:grep "SSH-NEW" /var/log/iptables-ssh.log
- 提取源 IP 和目标端口:awk '{print $9, $11}' /var/log/iptables-ssh.log | grep -oE 'SRC=[0-9.]+|DPT=[0-9]+'
- 统计高频攻击源:awk '/SSH-NEW/ {for(i=1;i
- 配合 limit 模块防刷:-m limit --limit 3/min --limit-burst 6,避免日志爆炸

















