端口扫描的检测有一个把它与常见工具区分开来的特点。Fail2ban 读的是应用日志——而当一个关闭的端口被扫描时,那里根本没有应用,所以日志里也不会有记录。扫描只在防火墙这一层才看得见,而 PSAD 正是在那里工作:它读的是 iptables 关于被拒绝数据包所写的消息。

先决条件:日志记录必须打开

这正是 PSAD「装好了却什么都不显示」的主要原因。防火墙里没有日志规则,它就无从可读,而与此同时也不会产生任何报错。

如果你用 UFW:

sudo ufw logging low
sudo ufw status verbose

为了确认消息确实在来:

sudo journalctl -k | grep -c '\[UFW'
sudo grep -c 'UFW BLOCK' /var/log/ufw.log

两条命令都是零,就意味着 PSAD 不会工作。关于 Debian 12 和 Ubuntu 24.04 要单独说一句:没有 rsyslog 时文件 /var/log/ufw.log 干脆就不存在,一切都进 systemd 的日志——而 PSAD 的配置里日志路径必须把这一点考虑进去。

安装

sudo apt install psad
sudo psad --sig-update
sudo psad -R
sudo psad --Status

最后这条命令才是关键。它会显示分析了多少数据包、看到了哪些地址、以及处于什么危险等级。而如果被分析数据包的计数器是零,那就回到上一节:问题出在日志记录上,而不是没人在扫描。

配置在 /etc/psad/psad.conf 里。而真正有实用意义的参数不多:邮件地址、日志路径,以及危险等级的阈值。

危险等级

PSAD 会根据被触碰的不同端口有多少、以及行为与已知扫描手法有多接近,给每个来源打 1 到 5 的等级。

  • 1–2——对关闭端口的零星触碰。这是互联网恒常的背景噪声;不需要反应;
  • 3——对端口的系统性梳理。通常是研究性扫描器,网络上有好几十个;
  • 4–5——从同一个地址对大量端口有意识的试探,往往还伴随着掩盖接触性质的尝试。

发邮件的阈值由 EMAIL_ALERT_DANGER_LEVEL 设定。取 3 通常意味着每天好几封邮件,而这会相当快地导向邮件客户端里的一条规则。更合理的做法是设成 4,其余的在某个汇总页面上看。

自动封禁:别开

PSAD 自己也能往防火墙里加规则(ENABLE_AUTO_IDS)。而在一台独自运行的服务器上开启它并不合适,理由很硬:数据包里的发送方地址是可以伪造的。只要有人朝你发来改过地址的数据包——你就会封掉他挑中的那个地址。而那可能恰好是你自己的客户、某个支付网关或者某个监控服务。

而如果确实还是需要封禁,那就用较高的危险阈值开启,并且一定要带上时限(AUTO_BLOCK_TIMEOUT),免得一条错误的记录永远留在那里。

实际上拿它怎么办

扫描本身是无害的:它什么也不破坏,而且对所有人都在持续发生。PSAD 数据的价值不在事件本身,而在它性质的变化上。

有用的观察:

  • 有针对性的兴趣。普通扫描器会梳理成千上万个地址和十来个常用端口。但如果有人在系统性地试探恰恰是你服务器的端口,包括非标准端口,那就不再是背景噪声了;
  • 对某个具体端口的扫描。对数据库或控制面板端口的触碰意味着有人正在找的正是那个服务——通常是在它的新漏洞消息出来之后;
  • 动手前的侦察。扫描量骤增,几小时后来自同一网段的密码猜测,这是常见的次序,而它的前半段能买来一点时间。

而这些观察中任何一个的实际结论都是一样的:请检查朝外的端口清单符合你的预期,而且每个端口上跑着的都是你今年更新过的东西。

它在工具中的位置

PSAD 既不替代防火墙,也不替代 Fail2ban,更不替代任何入侵检测系统。它堵的是一处很窄的空白——那些在别处不留痕迹的尝试,因为它们从未到达过任何一个应用。它的代价很低,第一次跑起来之后就无需照料,而它的汇总回答的是一个否则没人会问的问题:除了普遍的背景噪声之外,有没有人对你的服务器感兴趣。这份汇总是什么样子,见下面的演示页面。