用 Linux 防火墙做入侵检测的可行路径
先明确一个核心思路:指望 iptables 或 nftables 本身去“理解”攻击语义,确实不现实。它们本质是规则执行者,而非分析引擎。但换个角度,完全可以通过“异常流量特征 → 日志记录 → 告警/处置”这条路径,构建起一套基础的入侵检测能力。
一个比较推荐的组合拳是:用 iptables 的日志与连接限制功能来发现扫描和暴力破解的苗头;用 fail2ban 这类工具实现自动封禁;再引入 Snort 或 Suricata 做更深度的流量检测。必要时,让深度检测系统与防火墙联动阻断,这就迈向了 IDS/IPS 的成熟思路。
二、基于防火墙日志的检测与告警
日志是发现异常的第一道关卡,关键在于记录什么、怎么分析。
- 记录被丢弃/拒绝的数据包
- 想要看清谁在碰壁?可以记录所有被拒绝的入站包:
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4 - 出站异常同样值得关注:
iptables -A OUTPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4 - 查看这些日志,通常用:
grep “IPTables-Dropped” /var/log/syslog(或者在/var/log/kern.log里找)。
- 想要看清谁在碰壁?可以记录所有被拒绝的入站包:
- 发现端口扫描与异常握手
- SYN 包风暴往往是扫描的前奏,记录下来:
iptables -A INPUT -p tcp --syn -j LOG --log-prefix "SYN-Attempt: " - 光记录不够,还得限速。只放行低频、正常的 SYN 连接,其他的直接丢弃:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPTiptables -A INPUT -p tcp --syn -j DROP - 这里用到的
limit模块是个好东西,它能有效抑制告警风暴,避免日志瞬间被刷爆,导致真正的问题被淹没。
- SYN 包风暴往往是扫描的前奏,记录下来:
- 保存规则(持久化)
- 规则配好了,重启可不能丢。在 Debian/Ubuntu 系列上,可以用
iptables-sa ve > /etc/iptables/rules.v4;或者直接使用netfilter-persistent
- 规则配好了,重启可不能丢。在 Debian/Ubuntu 系列上,可以用
三、自动封禁与联动阻断
从发现到响应,自动化是提升效率的关键。
- 自动封禁:fail2ban + iptables
- 安装很简单:
sudo apt install fail2ban - 关键在配置,编辑
/etc/fail2ban/jail.local,一个基础示例:- [DEFAULT] 段设置全局参数,比如
bantime = 600(封禁10分钟),findtime = 600(在10分钟内查找),maxretry = 3(最大重试3次)。 - 然后启用 SSH 防护:[ssh] 段设置
enabled = true,并指定端口、过滤器和日志路径。
- [DEFAULT] 段设置全局参数,比如
- 配置好后,启动并设置开机自启:
systemctl start fail2ban && systemctl enable fail2ban - 它的作用很直接:自动解析像
/var/log/auth.log这样的日志,一旦发现 SSH 暴力破解等模式,立刻调用 iptables 封禁对应 IP,极大缩短了人工响应时间。
- 安装很简单:
- 联动阻断:IDS/防火墙协同
- 思路再进一步:当 Snort 或 Suricata 这类网络入侵检测系统(IDS)的规则被触发时,意味着更复杂的攻击被识别了。此时,可以通过一个脚本,让 IDS 主动调用 iptables,动态插入一条 DROP 或 REJECT 规则。这就形成了一个从“检测”到“阻断”的自动闭环。在生产环境中,这个联动可以通过消息队列或签名命中后的回调函数来实现,更加稳健。
四、深度检测与可视化分析
基础防护之上,是更深层的威胁狩猎与态势感知。
- 网络层 IDS:Snort
- 作为老牌工具,Snort 用法很灵活。一个简单的示例:
sudo snort -r listen.pcap -c /etc/snort/snort.conf -K ascii -A full - 它的告警会输出到
/var/log/snort/alert。这些日志可以导入 BASE 或其他可视化工具进行聚合分析,能从海量事件中更快地发现攻击链和模式。
- 作为老牌工具,Snort 用法很灵活。一个简单的示例:
- 主机层加固与检测
- 网络防线之外,主机自身也要稳固。定期运行
chkrootkit、rkhunter来排查 rootkit 和后门,检查可疑的内核模块。 - 文件完整性监控同样重要。部署像 Tripwire 这样的工具,为关键系统文件建立“健康基线”,然后周期性地校验它们是否被篡改,这是发现入侵后痕迹的有效手段。
- 网络防线之外,主机自身也要稳固。定期运行
五、最小可用配置清单
理论说了不少,最后给出一套能立刻上手的最小可用配置。照着做,就能快速搭建一个具备基础检测和防护能力的防火墙。
- 仅开放必要端口(示例:放行 22/80/443)
iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT- 务必注意顺序:在最后设置默认拒绝策略
iptables -A INPUT -j DROP之前,一定要确保 SSH(22端口)等管理端口已经放行,否则可能导致自己无法远程连接。
- 记录与限速
- 记录被拒流量:
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4 - 对 SYN 连接进行限速:
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT - 超限的 SYN 直接丢弃:
iptables -A INPUT -p tcp --syn -j DROP
- 记录被拒流量:
- 自动封禁
- 部署 fail2ban(配置方法如上),让它专门盯着 SSH 这类高频遭受攻击的服务,实现自动拉黑。
- 持久化
- 所有规则配置妥当后,执行
iptables-sa ve > /etc/iptables/rules.v4(或使用 netfilter-persistent 保存),确保重启后规则依然生效。
- 所有规则配置妥当后,执行
