要让 iptables 记录被丢弃的数据包,必须将 log 规则置于 drop 规则之前,确保匹配条件一致;使用 -i 插入链首更稳妥,并启用 --log-tcp-options、--log-ip-options、--log-prefix 和 --log-level;通过 rsyslog 将日志分离存储至 /var/log/iptables.log,并调大内核 log_buf_len 防丢失。

要让 iptables 记录被丢弃的数据包,关键不是“在 DROP 后加 LOG”,而是把 LOG 规则放在 DROP 之前,并确保它匹配到真正要丢弃的流量。否则包一被 DROP 就没了,根本不会走到 LOG。
LOG 规则必须排在 DROP 前面
iptables 是按顺序逐条匹配的。一旦某条规则触发了 DROP 或 REJECT,后续规则就不再执行。所以记录日志的动作(-j LOG)必须出现在丢弃动作(-j DROP)之前,且匹配条件一致。
- 错误写法(LOG 不生效):
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-DROP: " - 正确写法(先记再丢):
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "SSH-NEW-DROP: " --log-tcp-options --log-ip-options
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j DROP - 用 -I 插入链首更稳妥,避免被已有规则跳过;-A 追加时需确认位置
让日志内容真正有用
默认的 LOG 只输出 IP、端口、协议和包长,对分析攻击意图帮助很小。必须显式开启关键字段:
- --log-tcp-options:记录 TCP 选项(如 Timestamp、MSS),可识别扫描工具或异常握手
- --log-ip-options:捕获 IP 头部选项(如 Loose Source Route),常被恶意扫描利用
- --log-prefix "xxx":必须设置,方便后续用 grep 或 rsyslog 过滤
- --log-level 4(warning):避免日志被 info 级别淹没,也比 debug 更易管理
把日志单独存到文件,不混在系统日志里
/var/log/syslog 或 /var/log/messages 里日志太多,容易覆盖、难检索。推荐分离存储:
- 新建配置文件:
/etc/rsyslog.d/iptables.conf - 写入内容:
:msg, contains, "SSH-NEW-DROP:" /var/log/iptables.log & ~
(把所有含该前缀的日志写进指定文件,然后丢弃,不进其他日志) - 重启服务:
sudo systemctl restart rsyslog - 记得创建日志目录并设权限:
sudo mkdir -p /var/log/iptables && sudo chmod 600 /var/log/iptables.log
防日志丢失:调大内核缓冲 + 避免刷盘延迟
高并发场景下,内核 printk 缓冲区太小(默认 64KB)会导致 LOG 被 silently 丢弃;rsyslog 默认批量写盘,断电可能丢最近几秒日志。
- 临时增大缓冲:
sudo sysctl -w kernel.log_buf_len=8388608(8MB) - 永久生效:在
/etc/sysctl.conf中加一行kernel.log_buf_len = 8388608 - 可选优化 rsyslog:在
/etc/rsyslog.conf中取消注释或添加$ActionFileDefaultTemplate RSYSLOG_ForwardFormat和$ActionQueueSaveOnShutdown on











