最快定位ssh连接失败问题的方式是直接检查22端口占用:用ss -tuln | grep :22(推荐)、netstat -tuln | grep :22或lsof -i :22确认监听状态;若有输出,通过ss -tulnp | grep :22或lsof -i :22获取pid和进程名,常见占用者包括sshd、nginx、docker等;再依情况停止冲突进程或修改ssh端口并开放防火墙。

直接查占用22端口的进程,是最快定位问题的方式。很多情况下SSH服务起不来、连不上,根本不是配置或防火墙问题,而是22端口早被别的程序悄悄占用了。
确认22端口是否正在被监听
先看端口有没有被监听,用下面任一命令:
- ss -tuln | grep :22(推荐,速度快、系统自带)
-
netstat -tuln | grep :22(若提示未安装,可执行
sudo apt install net-tools) -
lsof -i :22(需安装:
sudo apt install lsof)
如果没有任何输出,说明22端口当前没被监听——可能SSH服务根本没运行,也可能是被占了但没监听成功(比如启动失败)。如果有输出,继续往下查是谁在用。
找出占用22端口的具体进程
重点看 PID(进程号)和 COMMAND(程序名):
- 用 lsof -i :22,输出里会直接显示进程名和 PID,例如:
sshd 1234 root 3u IPv4 ... - 用 ss -tulnp | grep :22(加
-p才能显示进程,需要 root 权限),输出类似:tcp 0 0 *:22 *:* LISTEN 1234/sshd - 用 fuser 22/tcp -v,会列出所有使用该端口的用户和进程
常见占用者包括:另一个 sshd 实例、nginx、apache、docker 容器、甚至某些恶意进程。特别注意 PID 是否为 1(systemd)或明显异常的数字。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
判断是不是 SSH 自身冲突
如果看到多个 sshd 占着 22 端口,或者 sshd 启动时反复失败,可能是配置错误导致它反复尝试绑定失败。这时可以:
- 临时停止 SSH:
sudo systemctl stop sshd - 手动以调试模式运行:
sudo /usr/sbin/sshd -d(不加-D,只跑一次) - 观察终端输出,通常会明确报错,例如:
Address already in use或bind: Address already in use
这个方式比看 journal 日志更直接,能立刻验证端口是否真被占、以及谁在挡路。
释放端口并处理后续
找到 PID 后,按需操作:
- 如果是非必要进程(如测试用 nginx),直接停掉:
sudo kill -9 PID或sudo systemctl stop nginx - 如果是另一个 sshd,检查是否误启了多个实例,或配置中写了重复的
Port 22 - 若不能停占用进程(如生产环境关键服务),就改 SSH 端口:编辑
/etc/ssh/sshd_config,添加Port 2222(不要删原 Port 22,先双端口并行),再重启 sshd - 改端口后别忘了开放防火墙:
sudo ufw allow 2222/tcp或sudo firewall-cmd --add-port=2222/tcp --permanent && sudo firewall-cmd --reload
操作完再用 ss -tuln | grep :22 和 ss -tuln | grep :2222 分别确认旧端口已空、新端口已监听。










