SSH连接被拒绝通常有多种原因,以下是详细的排查步骤:
1. 检查安全组规则配置
- 端口是否正确:确认安全组规则中目标端口是22(或自定义SSH端口)。
- 授权对象:确保源IP范围包含你的客户端IP(如临时测试可设为
0.0.0.0/0,但生产环境建议限制IP)。 - 协议类型:选择 TCP 协议。
- 方向:确保是 入方向(Inbound) 规则。
- 规则优先级:检查是否有更高优先级的拒绝规则(如拒绝所有流量的规则在允许规则之前生效)。
2. 检查云服务器内部防火墙
安全组生效后,服务器内部防火墙(如 iptables、firewalld、ufw)可能仍会拦截流量。
CentOS/RHEL/Fedora
# 查看firewalld状态
sudo systemctl status firewalld
# 临时关闭防火墙(测试用)
sudo systemctl stop firewalld
# 或放行SSH端口
sudo firewall-cmd --add-port=22/tcp --permanent
sudo firewall-cmd --reload
Ubuntu/Debian
# 查看ufw状态
sudo ufw status
# 放行SSH端口
sudo ufw allow 22
通用检查(iptables)
sudo iptables -L -n # 查看规则
sudo iptables -F # 清空规则(临时,谨慎操作)
3. 确认SSH服务状态
# 检查SSH服务是否运行
sudo systemctl status sshd
# 重启SSH服务
sudo systemctl restart sshd
# 检查SSH是否监听正确端口
sudo netstat -tlnp | grep ssh
如果端口未监听,检查 /etc/ssh/sshd_config 中 Port 配置是否与安全组一致。
4. 检查网络ACL(如有)
- 如果云服务器在VPC中,检查网络ACL规则是否允许SSH流量(类似安全组但作用于子网级别)。
5. 检查云服务商安全策略
- 部分云平台有额外安全策略(如阿里云的“安全管控”或AWS的“安全组外绑定”)。
- 确认实例未处于安全隔离组或受安全加固软件影响。
6. 测试网络连通性
# 从其他机器测试端口连通性(替换为你的公网IP)
telnet <公网IP> 22
nc -zv <公网IP> 22
如果超时,可能是网络路由或云平台外部防火墙问题。
7. 检查实例内部配置
- SSH配置限制:检查
/etc/ssh/sshd_config中AllowUsers、DenyUsers或ListenAddress是否限制连接。 - SELinux(仅Linux):
sudo getenforce # 查看状态 sudo setenforce 0 # 临时关闭(测试用)
8. 查看日志定位问题
# SSH连接失败时查看服务端日志
sudo tail -f /var/log/auth.log # Debian/Ubuntu
sudo tail -f /var/log/secure # CentOS/RHEL
日志中可能包含更具体的拒绝原因(如认证失败、地址被拒等)。
快速自检清单
- [ ] 安全组规则:协议TCP、端口22、源IP正确、入方向。
- [ ] 实例内部防火墙已放行22端口。
- [ ] SSH服务正在运行且监听22端口。
- [ ] 网络ACL(如有)已放行。
- [ ] 尝试从同一内网另一台机器SSH连接,排除公网问题。
如果以上步骤仍无法解决,请提供以下信息以便进一步排查:
- 云服务商名称(如AWS、阿里云、腾讯云等)。
- 执行
sudo netstat -tlnp | grep ssh的输出。 - 安全组规则截图(隐藏敏感信息)。
CLOUD技术笔记