虚拟机端口22连接失败,核心排查思路是从SSH服务状态、网络连通性、防火墙规则三个层面逐层检测,绝大多数问题集中在SSH服务未启动、虚拟机IP配置错误或安全组未放行入站规则。
虚拟机ssh连接不上的基础排查步骤
首当其冲要确认虚拟机本身是否健康,很多情况下,端口22不通的根本原因是虚拟机里的SSH服务根本没起来,或者系统正处于启动过程中。
先确认虚拟机自身状态
打开虚拟化平台的控制台(例如VMware vSphere、VirtualBox或KVM的图形界面),直接看虚拟机是否处于运行状态,如果系统卡在启动界面、磁盘写满或被挂起,端口自然无法响应。
在控制台登录虚拟机系统,执行:
ps aux | grep sshd systemctl status sshd
如果sshd进程不存在,用systemctl start sshd启动,行业共识认为,本地虚拟机SSH故障中服务端进程异常占相当比例。
验证SSH服务端进程状态
确认sshd是否监听在正确的网络接口上:
netstat -tlnp | grep :22 ss -tlnp | grep :22
输出里如果有0.0.0:22或::22,说明SSH在正常监听,如果只监听在127.0.0.1而不是对外地址,这就是一个常见的配置坑。
网络连通性逐层检测
服务端正常后,需要从客户端一侧验证网络路径是否通畅。
从宿主机ping虚拟机IP
先用宿主机ping虚拟机IP,确认基础网络通不通。
- 如果ping不通,问题在IP配置或网络适配器;
- 如果ping得通,说明网络层正常,问题集中在端口层。
虚拟机内查看IP地址:
ip addr ifconfig
注意区分NAT模式和桥接模式,NAT模式下虚拟机IP通常是192.168.x.x或10.0.2.x,而桥接模式则和宿主机在同一网段。
用telnet测试端口22是否存活
telnet 虚拟机IP 22 nc -zv 虚拟机IP 22
连接成功会返回SSH版本信息(类似SSH-2.0-OpenSSH_7.4),失败则提示Connection refused或Timeout。
这里有两个典型的区别:
- Connection refused:数据包到达了服务器,但端口上没有服务监听,大概率是sshd进程没起来,或者监听地址不对。
- Timeout:数据包被丢弃,中间有防火墙拦截,或IP地址不可达。
检查虚拟机网络模式与IP配置
VMware和VirtualBox环境下,检查虚拟网络编辑器与虚拟机的网络适配器设置,VMware的NAT模式默认网段通常是192.168.x.0/24(具体以实际安装为准),如果虚拟机IP和网段对不上,需要排查DHCP服务或手工配置静态IP。
常见场景:VMware虚拟机重启后IP变了,但SSH连接工具里还保存着旧IP,在宿主机上用arp -a查询邻居缓存可以快速定位。
防火墙与安全策略的常见拦截点
对于云服务器来说,这是最容易被忽略的一环,即使Linux防火墙完全放行,云平台的安全组策略如果没加端口22的入方向规则,外部连接依然会超时。
Linux防火墙规则排查
检查iptables和firewalld的状态:
systemctl status firewalld iptables -L -n | grep 22
常用的放行命令:
firewall-cmd --permanent --add-port=22/tcp firewall-cmd --reload
如果启用了Docker,还需要检查iptables的DOCKER链是否拦截了流量,部分场景下,清空iptables规则可以让SSH恢复,但这是临时手段,不推荐在生产环境这么做。
云平台安全组入方向规则
国内主流云厂商(简米云、酷番云、华为云)的控制台里,安全组是一个独立于操作系统防火墙的边界防御层,登录云控制台,找到对应实例的安全组,确认入方向规则中存在:
- 协议:TCP
- 端口:22
- 源地址:你的公网IP或0.0.0.0/0(临时测试用)
安全组规则的优先级是数值越小优先级越高,如果存在一条拒绝规则在前面,即便后面有允许规则也不会生效。
linux ssh端口22连接失败的深层原因
排除了网络和防火墙之后,仍连不上就值得检查SSH配置层面的细节,这里列举几个高频故障点。
SSHD配置文件异常
/etc/ssh/sshd_config 里几个关键参数:
Port 22:确认没被改成其他端口PermitRootLogin yes:如果要用root登录PasswordAuthentication yes:密码认证是否被关闭ListenAddress 0.0.0.0:监听所有网卡
改过配置后记得重启服务:
sshd -t systemctl restart sshd
sshd -t做语法检查,确认配置没问题再重启,避免错误配置导致服务起不来。
公钥认证权限问题
如果你是用密钥登录而非密码登录,检查家目录和授权文件的权限。
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
如果~/.ssh目录的属主不是当前用户,OpenSSH会出于安全考虑拒绝使用密钥文件。
SELinux或AppArmor拦截
CentOS/RHEL系默认SELinux开启,错误的SELinux上下文会导致SSH端口能通但登录被拒。
getenforce setsebool -P ssh_sysadm_login on
临时关闭SELinux用setenforce 0,仅用于定位问题,别在正式环境这么干,Ubuntu/Debian环境下,检查AppArmor状态:
aa-status | grep sshd
虚拟机端口22不通的快速修复清单
| 场景 | 现象 | 修复动作 |
|---|---|---|
| SSH服务未启动 | Connection refused | systemctl start sshd |
| IP地址变了 | 超时 | 用控制台进系统改IP |
| 防火墙拦截 | 超时 | 放行22端口 |
| 安全组未放行 | 公网超时 | 云端添加入方向规则 |
| 密钥权限错误 | 登录被拒绝 | chmod 600密钥文件 |
| 端口被修改 | 连接无响应 | 改回22或改用新端口连接 |
排查顺序建议:控制台看系统状态 → 确认sshd监听 → 宿主机ping → telnet端口 → 防火墙检查 → 安全组检查 → 配置细节。
虚拟机ssh连不上相关问题解答
虚拟机ssh连不上但虚拟机内网络是通的,怎么定位?
既然虚拟机能上网,排除网络适配器故障,直接在宿主机执行telnet 虚拟机IP 22,看返回结果是refused还是timeout,refused查sshd服务状态,timeout查防火墙规则,如果宿主机能通但外部机器不能,重点检查NAT端口转发规则是否遗漏。
vmware虚拟机ssh连接失败,桥接模式设置不当怎么办?
桥接模式下虚拟机和宿主机必须处于同一广播域,如果路由器开启了AP隔离,虚拟机无法被外部访问,检查虚拟网络编辑器,确认桥接到正确的物理网卡,无线网卡环境下桥接经常出现不通的情况,改用NAT模式配合端口转发是成功率更高的方案。
云服务器ssh连接超时,安全组已放行还连不上怎么办?
安全组放行后,检查操作系统防火墙是否独立拦截,并确认云控制台的VPC网络ACL(网络访问控制列表)没有额外的拒绝规则,在云服务器上执行iptables -L查看入站链,若存在DROP tcp dpt:22规则,用iptables -D删除或调整优先级,重置网络栈后再次测试,问题大多能定位到具体环节。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/726316.html





