
问题描述
某日发现本地Ubuntu服务器的SSH连接存在异常:
- 本地控制台连接正常:通过本机
ssh localhost
或直接登录控制台无问题。 - 远程连接时好时坏:从其他机器连接间歇性失败,多开几个SSH会话后完全无法连接。
- 初步猜测:怀疑是SSH服务端的并发连接数限制导致。
排查与调整过程
1. 调整SSH最大连接数参数
修改/etc/ssh/sshd_config
中的配置(需sudo
权限):
# 允许同时最多10个未认证的连接
MaxStartups 10:30:60
# 每个网络连接允许创建6个会话
MaxSessions 6
# 保持连接活跃(防止超时断开)
ClientAliveInterval 60
ClientAliveCountMax 3
- 操作步骤:
sudo nano /etc/ssh/sshd_config # 修改参数 sudo systemctl restart sshd # 重启服务生效
- 结果:问题未解决,且后续发现
sshd
服务频繁崩溃。
2. 检查SSHD服务状态与日志
通过以下命令查看服务状态和日志:
systemctl status sshd # 发现服务状态为failed
journalctl -u sshd --since "1 hour ago" # 查看详细日志
- 关键日志信息:
fatal: Cannot bind any address. error: Port 22: Address already in use
- 分析:可能是端口冲突或配置文件错误,但重启服务仍无法恢复。
3. 尝试回滚配置与修复
- 恢复原始的
sshd_config
备份文件。 - 检查端口占用:
sudo netstat -tuln | grep :22
,确认无冲突。 - 重新生成HostKey(备选方案):
sudo rm /etc/ssh/ssh_host_* sudo dpkg-reconfigure openssh-server
- 结果:问题依旧,最终决定重装SSH服务。
4. 重装OpenSSH-Server
执行以下命令彻底重装:
sudo apt purge openssh-server -y
sudo apt install openssh-server -y
sudo systemctl start sshd

- 效果:服务恢复正常,远程连接稳定。
问题根因推测
- 配置冲突:可能在调整参数时误改其他配置项(如
ListenAddress
或权限)。 - 依赖损坏:SSH服务的依赖库或HostKey文件异常。
- 资源限制:系统文件描述符或内存资源耗尽(未彻底排查)。
学到的知识与总结
-
谨慎修改配置:
- 修改关键服务配置前备份文件(如
cp sshd_config sshd_config.bak
)。 - 使用
sshd -t
命令检查语法再重启服务。
- 修改关键服务配置前备份文件(如
-
日志为王:
- 通过
journalctl -u sshd -f
实时跟踪日志,快速定位错误。 - 常见错误类型:端口占用、权限问题、密钥异常。
- 通过
-
服务管理命令:
- 重启服务:
sudo systemctl restart sshd
- 查看状态:
systemctl status sshd
- 重启服务:
-
备选解决路径:
- 检查防火墙:
sudo ufw status
或iptables
规则。 - 验证网络连通性:
telnet 服务器IP 22
。 - 检查SELinux/AppArmor是否限制SSH(Ubuntu默认未启用)。
- 检查防火墙:
-
重装作为最后手段:
- 重装会重置配置,需重新适配原有需求,但能解决深层依赖问题。
反思:此次问题因缺乏逐步验证(如分段修改配置、对比测试)导致排查效率低下。未来需遵循“最小改动验证”原则,避免盲目操作。
文章评论