如何通过Iptables Log模块详尽记录并审计非法连接尝试过程?
- 内容介绍
- 相关推荐
本文共计869个文字,预计阅读时间需要4分钟。
要使iptables的LOG模块正确记录非法连接尝试,关键不在于记录所有,而是要精确定位异常行为。确保日志不被遗漏、丢弃,并能快速检索。核心在于规则顺序、参数组合和日志后端协同。
一、LOG 规则必须放在 DROP/REJECT 之前
LOG 是非终止动作,它只写日志,不阻断包;而 DROP/REJECT 是终止动作,执行后包即消失,后续规则不再匹配。如果 LOG 写在 DROP 后面,永远不会触发。
- ❌ 错误写法(LOG 失效):
iptables -A INPUT -p tcp --dport 22 -j DROPiptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-BLOCKED: " - ✅ 正确写法(先记再拦):
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG \--log-prefix "SSH-SCAN: " --log-tcp-options --log-ip-optionsiptables -I INPUT -p tcp --dport 22 -m state --state NEW -j DROP
二、只记录真正可疑的连接,避免日志爆炸
盲目记录所有 NEW 连接会迅速填满磁盘。应聚焦高风险行为:非常用端口访问、扫描特征包、高频失败连接等。
- 记录 SYN 包(常见扫描起点):
iptables -A INPUT -p tcp --syn -j LOG --log-prefix "SYN-SCAN: " --log-tcp-options - 记录 UDP 全端口探测:
iptables -A INPUT -p udp -m limit --limit 5/min -j LOG --log-prefix "UDP-PROBE: " - 记录来自已知恶意 IP 段的请求(需配合 ipset):
iptables -A INPUT -m set --match-set badips src -j LOG --log-prefix "BADIP-ATTEMPT: "
三、增强日志字段,提升审计价值
默认 LOG 只输出 IP、端口、协议,缺少判断依据。加上关键选项才能识别攻击意图:
-
--log-tcp-options:显示 TCP MSS、Timestamp、SACK 等,可识别 Nmap 扫描指纹 -
--log-ip-options:捕获 Loose Source Route、Record Route 等异常 IP 选项 -
--log-uid:仅 OUTPUT 链有效,记录本地发起连接的用户 ID -
--log-level 4:设为 warning 级别,便于 rsyslog 分级过滤 -
--log-prefix必须设置,且建议带语义(如 "PORT-8080-SCAN"),方便 grep 和 rsyslog 路由
四、确保日志不丢失、可持久、易查找
内核 printk 缓冲区小、rsyslog 默认异步刷盘,高并发下极易丢日志。
- 调大内核日志缓冲:
编辑/etc/sysctl.conf,添加kernel.printk_ratelimit = 0kernel.printk = 4 4 1 7
运行sysctl -p生效 - 配置 rsyslog 持久化:
新建/etc/rsyslog.d/50-iptables.conf:$template IptablesFormat,"%timestamp% %fromhost-ip% %syslogtag%%msg%\n":msg, contains, "SSH-SCAN" /var/log/iptables/ssh-scan.log;IptablesFormat& stop
重启:systemctl restart rsyslog - 实时监控示例:
tail -f /var/log/iptables/ssh-scan.log | grep -E "(SYN|FIN|URG)"
不复杂但容易忽略:LOG 不是万能审计器,它只是第一道线索。真正有效的防御需要结合 conntrack 状态、recent 模块限速、ipset 黑名单,以及 fail2ban 等工具做闭环响应。
本文共计869个文字,预计阅读时间需要4分钟。
要使iptables的LOG模块正确记录非法连接尝试,关键不在于记录所有,而是要精确定位异常行为。确保日志不被遗漏、丢弃,并能快速检索。核心在于规则顺序、参数组合和日志后端协同。
一、LOG 规则必须放在 DROP/REJECT 之前
LOG 是非终止动作,它只写日志,不阻断包;而 DROP/REJECT 是终止动作,执行后包即消失,后续规则不再匹配。如果 LOG 写在 DROP 后面,永远不会触发。
- ❌ 错误写法(LOG 失效):
iptables -A INPUT -p tcp --dport 22 -j DROPiptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-BLOCKED: " - ✅ 正确写法(先记再拦):
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG \--log-prefix "SSH-SCAN: " --log-tcp-options --log-ip-optionsiptables -I INPUT -p tcp --dport 22 -m state --state NEW -j DROP
二、只记录真正可疑的连接,避免日志爆炸
盲目记录所有 NEW 连接会迅速填满磁盘。应聚焦高风险行为:非常用端口访问、扫描特征包、高频失败连接等。
- 记录 SYN 包(常见扫描起点):
iptables -A INPUT -p tcp --syn -j LOG --log-prefix "SYN-SCAN: " --log-tcp-options - 记录 UDP 全端口探测:
iptables -A INPUT -p udp -m limit --limit 5/min -j LOG --log-prefix "UDP-PROBE: " - 记录来自已知恶意 IP 段的请求(需配合 ipset):
iptables -A INPUT -m set --match-set badips src -j LOG --log-prefix "BADIP-ATTEMPT: "
三、增强日志字段,提升审计价值
默认 LOG 只输出 IP、端口、协议,缺少判断依据。加上关键选项才能识别攻击意图:
-
--log-tcp-options:显示 TCP MSS、Timestamp、SACK 等,可识别 Nmap 扫描指纹 -
--log-ip-options:捕获 Loose Source Route、Record Route 等异常 IP 选项 -
--log-uid:仅 OUTPUT 链有效,记录本地发起连接的用户 ID -
--log-level 4:设为 warning 级别,便于 rsyslog 分级过滤 -
--log-prefix必须设置,且建议带语义(如 "PORT-8080-SCAN"),方便 grep 和 rsyslog 路由
四、确保日志不丢失、可持久、易查找
内核 printk 缓冲区小、rsyslog 默认异步刷盘,高并发下极易丢日志。
- 调大内核日志缓冲:
编辑/etc/sysctl.conf,添加kernel.printk_ratelimit = 0kernel.printk = 4 4 1 7
运行sysctl -p生效 - 配置 rsyslog 持久化:
新建/etc/rsyslog.d/50-iptables.conf:$template IptablesFormat,"%timestamp% %fromhost-ip% %syslogtag%%msg%\n":msg, contains, "SSH-SCAN" /var/log/iptables/ssh-scan.log;IptablesFormat& stop
重启:systemctl restart rsyslog - 实时监控示例:
tail -f /var/log/iptables/ssh-scan.log | grep -E "(SYN|FIN|URG)"
不复杂但容易忽略:LOG 不是万能审计器,它只是第一道线索。真正有效的防御需要结合 conntrack 状态、recent 模块限速、ipset 黑名单,以及 fail2ban 等工具做闭环响应。

