安全组规则已添加,为何SSH仍连接被拒?

SSH连接被拒绝通常有多种原因,以下是详细的排查步骤:


1. 检查安全组规则配置

  • 端口是否正确:确认安全组规则中目标端口是22(或自定义SSH端口)。
  • 授权对象:确保源IP范围包含你的客户端IP(如临时测试可设为 0.0.0.0/0,但生产环境建议限制IP)。
  • 协议类型:选择 TCP 协议。
  • 方向:确保是 入方向(Inbound) 规则。
  • 规则优先级:检查是否有更高优先级的拒绝规则(如拒绝所有流量的规则在允许规则之前生效)。

2. 检查云服务器内部防火墙

安全组生效后,服务器内部防火墙(如 iptablesfirewalldufw)可能仍会拦截流量。

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_configPort 配置是否与安全组一致。


4. 检查网络ACL(如有)

  • 如果云服务器在VPC中,检查网络ACL规则是否允许SSH流量(类似安全组但作用于子网级别)。

5. 检查云服务商安全策略

  • 部分云平台有额外安全策略(如阿里云的“安全管控”或AWS的“安全组外绑定”)。
  • 确认实例未处于安全隔离组或受安全加固软件影响。

6. 测试网络连通性

# 从其他机器测试端口连通性(替换为你的公网IP)
telnet <公网IP> 22
nc -zv <公网IP> 22

如果超时,可能是网络路由或云平台外部防火墙问题。


7. 检查实例内部配置

  • SSH配置限制:检查 /etc/ssh/sshd_configAllowUsersDenyUsersListenAddress 是否限制连接。
  • 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连接,排除公网问题。

如果以上步骤仍无法解决,请提供以下信息以便进一步排查:

  1. 云服务商名称(如AWS、阿里云、腾讯云等)。
  2. 执行 sudo netstat -tlnp | grep ssh 的输出。
  3. 安全组规则截图(隐藏敏感信息)。
云服务器