欢迎访问易策 · ZeroToOne,从0到1的成长与探索!

服务器端口扫描与SSH爆破检查方法

服务器暴露在公网后,SSH、Web、数据库等端口经常会被自动化扫描。本文以 Ubuntu / Debian 为例,介绍如何检查服务器是否正在被扫描、SSH 是否被暴力破解,以及如何判断是否已经出现异常登录。

通过查看认证日志、监听端口、防火墙记录、用户与密钥配置等信息,可以快速判断服务器当前面临的是普通扫描,还是已经存在被入侵的风险。

一、检查 SSH 是否被爆破

SSH 是最常见的爆破目标。可以先查看最近 24 小时的 SSH 登录失败记录:

sudo journalctl -u ssh --since "24 hours ago" | grep -Ei "Failed password|Invalid user|authentication failure"

如果系统服务名是 sshd,使用:

sudo journalctl -u sshd --since "24 hours ago" | grep -Ei "Failed password|Invalid user|authentication failure"

也可以查看传统认证日志:

sudo grep -Ei "Failed password|Invalid user|authentication failure" /var/log/auth.log

如果需要进一步排查历史记录,还可以查看轮转后的认证日志:

sudo zgrep -Ei "Failed password|Invalid user|authentication failure" /var/log/auth.log*

如果看到大量类似内容:

Failed password for root from 1.2.3.4 port 54321 ssh2
Invalid user admin from 1.2.3.4

通常说明 SSH 正在被扫描,或者有人正在进行暴力尝试登录。

二、统计爆破最多的 IP

可以用下面命令统计失败登录最多的来源 IP:

sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head

查看所有认证失败来源:

sudo grep -Ei "Failed password|Invalid user" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

如果某个 IP 在短时间内出现几十次甚至几百次失败记录,基本可以判断为自动化爆破行为。

三、检查是否有人成功登录

只看到失败记录,通常说明服务器只是被扫描或爆破尝试。更关键的是确认有没有陌生 IP 已经成功登录。

1. 查看 SSH 成功登录记录

sudo grep -Ei "Accepted password|Accepted publickey" /var/log/auth.log

2. 查看最近登录历史

last -a

3. 查看失败登录历史

sudo lastb -a

4. 查看当前在线用户

who
w

如果发现陌生 IP、陌生用户,或者在异常时间段存在登录行为,就需要重点排查。

四、检查服务器开放了哪些端口

查看当前正在监听的端口:

sudo ss -tulnp

只查看监听端口:

sudo ss -tulnp | grep LISTEN

也可以使用 lsof 查看:

sudo lsof -i -P -n | grep LISTEN

排查时重点关注以下内容:

  • 是否有陌生端口监听公网
  • 是否有不认识的进程名
  • 是否有数据库端口暴露到公网
  • 是否有异常高位端口长期监听

如果发现可疑进程,可以继续查看:

ps aux | grep 进程名

五、检查防火墙和端口扫描痕迹

如果使用 UFW,先查看防火墙状态:

sudo ufw status verbose

查看 UFW 拦截日志:

sudo grep "UFW BLOCK" /var/log/ufw.log | tail -100

如果没有日志,可以开启 UFW 日志:

sudo ufw logging on

需要注意的是,如果之前没有开启防火墙日志,很多端口扫描行为不会留下详细记录。对于云服务器,还需要同时查看云厂商安全组、云防火墙或安全中心的相关日志。

六、检查异常用户和 SSH 密钥

查看系统用户:

cat /etc/passwd

检查是否存在异常 UID 0 用户。正常情况下,通常只有 root

awk -F: '$3 == 0 {print}' /etc/passwd

检查 root 的 SSH 公钥:

sudo cat /root/.ssh/authorized_keys

检查普通用户的 SSH 公钥文件:

sudo find /home -name authorized_keys -type f -exec ls -l {} \;

如果 authorized_keys 中出现陌生公钥,说明风险很高,可能已经被植入后门登录方式。

七、检查计划任务和启动项

查看 root 定时任务:

sudo crontab -l

查看所有用户的定时任务目录:

sudo ls -la /var/spool/cron/crontabs/

查看 systemd 启动服务:

systemctl list-unit-files --type=service | grep enabled

查看最近 30 天修改过的 systemd 服务文件:

sudo find /etc/systemd/system -type f -mtime -30 -ls

异常的 cron 或 systemd 服务,常见于木马、自启动脚本、挖矿程序或反连后门。

八、快速判断是否只是被扫描

一般只是被扫描或爆破时,常见特征是:

大量 Failed password
大量 Invalid user
没有 Accepted password / Accepted publickey
没有陌生在线用户
没有异常监听端口
没有异常 cron 或 systemd 启动项

这种情况通常说明有人在尝试撞库或爆破,但未必已经登录成功。

九、判断是否可能已经被破解

如果出现以下情况,就不能只当成普通扫描处理:

出现陌生 IP 的 Accepted 登录
出现陌生用户
authorized_keys 有陌生公钥
有异常监听端口
有异常 cron 或 systemd 启动项
CPU 或带宽异常升高
安全组出现非本人添加的规则

尤其是下面这条命令的结果最关键:

sudo grep -Ei "Accepted password|Accepted publickey" /var/log/auth.log

只要有陌生 IP 成功登录,就应该按入侵事件进行排查。

十、发现异常后的处理建议

如果只是被爆破,可以先进行基础加固:

sudo ufw allow 你的SSH端口/tcp
sudo ufw enable

建议同时做到:

  • 修改 SSH 默认端口
  • 禁止 root 直接登录
  • 禁止密码登录
  • 使用 SSH 密钥登录
  • 安装 fail2ban
  • 云安全组只放行自己的固定 IP

如果确认有异常登录,应立即修改密码:

passwd
sudo passwd root

同时检查 SSH 密钥、计划任务、启动项、异常进程和安全组规则。严重情况下,建议先备份业务数据,再重装系统,因为被入侵后的系统通常很难完全确认是否已经清理干净。

总结

检查服务器是否被扫描或破解,重点看三类信息:SSH 登录日志、系统开放端口,以及异常用户与持久化痕迹。

如果只有大量失败记录,通常只是遭遇扫描或爆破;但一旦出现陌生 IP 成功登录、异常公钥或可疑启动项,就应立即按入侵事件处理。

在服务器安全排查中,端口扫描和 SSH 爆破是最常见的外部威胁之一。通过快速识别登录日志中的关键信息,可以初步判断是常规扫描,还是已经发生了入侵行为。

下面整理了 SSH 爆破检查时常见的日志特征和异常痕迹,便于你更高效地进行初步排查与处置。

SSH 登录日志的关键特征

失败登录:Failed password / Invalid user
成功登录:Accepted password / Accepted publickey
异常痕迹:陌生用户、异常端口、异常密钥、异常启动项

如何判断风险等级

如果只有失败登录记录,通常属于公网服务器上较常见的自动化扫描或暴力尝试,未必代表系统已经被攻破。但这类行为仍说明服务器暴露在持续探测之中,建议结合来源 IP、尝试频率和时间分布进一步分析。

如果日志中出现陌生的成功登录记录,则应立即按安全事件处理。此时需要尽快核查登录来源、登录时间、登录账号、密钥变更情况,以及是否存在异常端口、异常用户、异常启动项等持久化痕迹。

总结

判断 SSH 爆破风险的核心,在于区分“失败尝试”与“异常成功登录”。前者多为常见扫描行为,后者则可能意味着服务器已被入侵,应第一时间开展全面排查与处置。

评论