ssh连接失败应先检查端口开放与防火墙拦截:确认sshd服务运行及监听正确端口(如0.0.0.0:22),核查sshd_config中port和listenaddress配置,确保防火墙(firewalld/ufw/iptables)及云平台安全组放行对应tcp端口,并用telnet或nc验证端口连通性。

SSH连接失败时,先确认端口是否开放、防火墙是否拦截,这是最常见也最高效的排查起点。
检查SSH服务是否在运行并监听正确端口
登录服务器本地终端,执行以下命令确认sshd进程状态和监听端口:
- systemctl status sshd(或 systemctl status ssh,取决于发行版)——查看服务是否正在运行
- ss -tlnp | grep :22(默认端口)或替换为自定义端口如 grep :2222——确认sshd是否真正监听对应端口
- netstat -tlnp | grep ssh(若安装了net-tools)——辅助验证监听情况
如果无输出或显示“inactive”,说明服务未启动或配置错误;若监听的是127.0.0.1:22而非0.0.0.0:22,则仅允许本地连接,需检查/etc/ssh/sshd_config中ListenAddress和BindAddress设置。
确认SSH端口未被修改或占用
很多用户修改过默认端口以增强安全,但容易忘记更新客户端连接参数:
- 检查/etc/ssh/sshd_config中的Port行,例如Port 2222,则客户端必须用ssh -p 2222 user@host
- 用lsof -i :2222或ss -tlnp | grep :2222确认该端口未被其他进程(如nginx、docker)意外占用
- 修改配置后务必执行sudo systemctl restart sshd生效
检查系统防火墙(iptables/nftables/firewalld)是否放行SSH端口
即使服务运行且端口监听,防火墙也可能拦截入站连接:
- firewalld(CentOS/RHEL/Fedora):sudo firewall-cmd --list-all 查看当前区域规则;若未放行,执行sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reload
- ufw(Ubuntu/Debian):sudo ufw status verbose;若禁用或未允许,运行sudo ufw allow OpenSSH 或 sudo ufw allow 22
- iptables(传统方式):sudo iptables -L INPUT -n 检查是否有ACCEPT规则匹配目标端口;常见漏配是只允许了22而忽略自定义端口
注意:云服务器(如阿里云、腾讯云)还需额外检查**安全组规则**,它独立于系统防火墙,必须手动开通对应端口的入方向TCP规则。
验证网络连通性与中间设备限制
从客户端执行基础检测,缩小问题范围:
- ping 服务器IP —— 确认基础网络可达(部分主机禁ping,不成功不代表不通)
- telnet 服务器IP 端口 或 nc -zv 服务器IP 端口 —— 直接测试TCP端口是否可建立连接。能连上但SSH失败,问题可能出在认证环节;连不上则大概率是网络、防火墙或服务未监听
- 若使用跳板机或NAT环境,检查路由、SNAT/DNAT配置及中间防火墙策略
不复杂但容易忽略。










