iptables记录异常访问需LOG规则置于DROP前、启用tcp/ip选项日志、设置log-prefix并分离存储至独立文件,再用grep/awk实时分析。

想让 iptables 真正记录特定端口的异常访问,关键不是“加一条 LOG”,而是让日志在包被丢弃前触发、字段足够判别意图、输出位置便于分析。
规则顺序必须是 LOG 在 DROP/REJECT 之前
错误写法(日志永远不会触发):
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-BLOCK: "
正确做法:LOG 动作要先于终止动作,且建议用 -I 插入链首,确保早匹配:
- iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG \
- --log-prefix "SSH-NEW: " \
- --log-tcp-options \
- --log-ip-options
再跟一条 DROP 或 REJECT 规则——这样新连接既被记录,又被阻断。只记录不拦截,就去掉后续动作;但安全审计通常需要“记录+阻断”配对。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
日志字段要开全,不能只靠 SRC/DST
默认 -j LOG 只输出 IP、端口、协议、TTL 和长度,缺少判断扫描或攻击的关键线索。必须显式启用:
- --log-tcp-options:捕获 MSS、Timestamp、SACK 等,识别慢速扫描、SYN Flood 或指纹探测
- --log-ip-options:记录 Loose Source Route、Record Route 等非常规 IP 选项,常见于渗透工具
- --log-prefix:必须带,否则 grep 无法快速定位,比如 "SSH-SCAN: " 或 "WEB-PROBE: "
- 可选 --log-level 4(warning)避免刷屏,也方便 rsyslog 按级别分流
日志要分离存储,别混在 syslog 里
/var/log/messages 或 kern.log 里日志杂乱、易被覆盖,也不利于自动化分析。推荐独立文件:
- 新建 /etc/rsyslog.d/iptables.conf,写入:
- :msg, contains, "SSH-NEW:" /var/log/iptables.log
- & ~
- 重启 rsyslog:sudo systemctl restart rsyslog
- 为防高并发丢日志,调大内核缓冲:sudo sysctl -w kernel.log_buf_len=8388608(8MB)
之后所有带 "SSH-NEW:" 前缀的日志都会单独落盘到 /var/log/iptables.log,稳定又干净。
快速提取和统计异常特征
不用翻整份日志,几条命令就能定位问题:
- 实时看新记录:sudo tail -f /var/log/iptables.log
- 提取高频攻击源 IP:
sudo grep "SSH-NEW:" /var/log/iptables.log | awk '{for(i=1;i - 查异常 TCP 选项(如含 Timestamp 的扫描包):
sudo grep "TCP" /var/log/iptables.log | grep "TSval" | head -20 - 统计目标端口分布:
sudo grep "DPT=" /var/log/iptables.log | awk '{for(i=1;i
每行日志里的 SRC=、DST=、DPT=、PROTO=、TCP_SEQ=、TCP_OPT= 都是结构化字段,awk 按等号切分即可提取,无需复杂解析器。

















