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