iptables -j LOG规则必须置于DROP/REJECT之前才能生效,否则包被丢弃后无法记录;需配合--log-prefix、--log-tcp-options等参数增强日志信息,并调大内核日志缓冲及配置rsyslog持久化,复杂过滤需结合ipset或string模块。

iptables -j LOG 规则必须放在匹配链的早期位置
LOG 目标本身不终止规则匹配流程,它只是把当前数据包信息写入内核日志缓冲区,然后继续走后续规则。如果你把 -j LOG 放在 -j DROP 或 -j REJECT 后面,那包早就被丢弃了,根本不会走到 LOG 这一步。
常见错误是这样写:
iptables -A INPUT -p tcp --dport 22 -j DROP iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ATTEMPT: "
这会导致所有 SSH 包都直接被 DROP,LOG 完全不生效。正确顺序是:
- 先用
-j LOG记录(可加--log-level控制 syslog 级别) - 再用
-j DROP或-j REJECT终止连接 - 如果只想记录不拦截,就不要接后续动作;但通常记录是为了审计+阻断,所以要配对使用
日志内容默认极简,需用 --log-tcp-options、--log-ip-options 等显式开启字段
默认 -j LOG 只输出源/目的 IP、端口、协议、TTL 和包长,不包含 TCP 标志位、TCP 选项、IP 分片信息等关键线索。遇到 SYN Flood 或扫描行为时,光看 IP 很难判断意图。
建议组合使用以下参数:
-
--log-tcp-options:记录 TCP 头部选项(如 MSS、SACK、Timestamp),能识别异常握手 -
--log-ip-options:记录 IP 头部选项(如 Record Route、Loose Source Route),常被扫描工具滥用 -
--log-uid:记录触发该包的用户 UID(仅适用于 OUTPUT 链或本地发起连接) -
--log-prefix "xxx":必须加,否则在/var/log/kern.log或/var/log/messages里无法快速 grep
示例完整规则:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG \ --log-prefix "SSH-NEW: " \ --log-tcp-options \ --log-ip-options \ --log-uid
日志刷盘慢、易丢失,需调大内核日志缓冲并配置 rsyslog 转发
Linux 内核的 printk 缓冲区默认只有 64KB,高并发攻击下 -j LOG 会迅速填满,新日志被丢弃,且不报错。同时,syslog 守护进程(如 rsyslog)默认按秒级批量刷盘,中间断电或 crash 就丢数据。
实操要点:
- 增大内核日志环形缓冲:
sudo sysctl -w kernel.printk_ratelimit=0(关限速),sudo sysctl -w kernel.printk_ratelimit_burst=10000 - 修改
/etc/rsyslog.conf,确保有$SystemMaxMessageSize 64k和$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat - 为 iptables 日志单独建文件:在
/etc/rsyslog.d/iptables.conf中加一行:msg, contains, "SSH-NEW:" /var/log/iptables.log,再sudo systemctl restart rsyslog
不这么做,你看到的“日志”可能只是最后几百条,漏掉关键攻击起始阶段。
LOG 不支持条件过滤,复杂场景必须配合 ipset 或 string 模块
-j LOG 本身不能做内容匹配——比如你想只记录含 "GET /wp-admin" 的 HTTP 请求,或者只记录来自某个 CIDR 段的异常包。这时候单靠 iptables 基础匹配远远不够。
可行路径:
- 用
ipset预先维护黑名单 IP 集合,再用-m set --match-set badips src+-j LOG,比重复写多条规则高效得多 - HTTP 层关键字匹配必须用
-m string --string "wp-login.php" --algo bm,但注意:该模块只工作在 PREROUTING/INPUT 链,且性能开销大,不建议在高流量出口链使用 - 避免在 FORWARD 链滥用 LOG:容器或 KVM 场景下,大量内部转发包会被记录,迅速撑爆磁盘
真正需要深度报文分析时,iptables -j LOG 只是第一道粗筛,后面得靠 tcpdump -w 抓包或 suricata 做应用层检测——LOG 本身不是 IDS。


















