Xshell 弹出一个 Connection failed 窗口CentOS 虚拟机在 VMware 里跑得好好的宿主机就是连不上——这个场景我遇到过太多次了。多数时候不是 Xshell 本身坏了也不是 CentOS 系统崩了而是网络层、sshd 服务层、认证算法层里的某一环卡住了。只要把报错原文、IP、端口、服务状态、日志这几样东西串起来看Xshell 不能连接 CentOS 的问题基本都能定位到具体原因。这篇内容适合正在用 Xshell 连 CentOS 的开发、运维和刚接触 Linux 的朋友尤其是用 VMware 虚拟机、云服务器、WSL2 环境的人。我会按实际排障顺序把常见报错、网络配置、sshd 检查、防火墙、SELinux、密钥交换算法、Xshell 会话设置和实操复现全部拆开讲。很多人一看到连不上第一反应是重装 Xshell 或者重装 CentOS结果折腾半天问题还在。其实 SSH 连接就是一条链路Xshell 发起 TCP 连接到目标 IP 的某个端口sshd 监听并接受连接然后双方协商加密算法、验证用户身份最后打开 shell。任何一环断了表现都是“连不上”但修法完全不同。下面按我的习惯从报错窗口开始判断。1. 先从报错窗口判断Xshell 连不上 CentOS 到底卡在哪一层Xshell 的报错信息其实很有价值只是很多人直接点“确定”就过去了。把报错原文看清楚能省掉至少一半的排查时间。比如 Connection refused 和 Connection timed out 完全是两个方向前者通常是端口没开、sshd 没监听或者防火墙拒绝后者通常是网络不通、IP 写错、路由不到或者云服务器安全组没放行。再比如 No matching key exchange method found 是算法协商失败跟网络和服务状态都没关系。1.1 常见报错和背后的第一嫌疑下面这张表是我自己排障时最常用的速查表你可以直接对着 Xshell 的报错找方向。Xshell 报错/现象大概率原因第一检查动作Could not connect to x.x.x.x (port 22): Connection failed网络不通、端口没开、sshd 没启动ping 目标 IP测 22 端口Connection refusedsshd 没监听、防火墙拒绝、端口写错ss -tlnp看 22 端口systemctl status sshdConnection timed outIP 不对、路由不通、云安全组未放行、虚拟机网卡没开ping、tracert、检查安全组和 VMware 网络No matching key exchange method foundXshell 版本旧CentOS 新 OpenSSH 移除了旧算法升级 Xshell 或调整算法配置No matching host key type found主机密钥算法不匹配检查 HostKeyAlgorithmsPermission denied (publickey,password)用户名/密码错、root 禁止登录、密钥权限不对看/var/log/secure检查 sshd_config中文显示乱码Xshell 编码不是 UTF-8 或字体不含中文会话属性改 UTF-8换中文字体登录后卡很久才出提示符DNS 反查慢、UseDNS 开启关闭 UseDNS重启 sshd这张表不是让你背而是让你形成条件反射先看报错再决定查网络还是查服务。很多人把 Connection refused 当成网络问题去 ping 半天其实 ping 通只能说明 IP 层通不代表 22 端口开着。1.2 我的三层排查法网络层、服务层、认证层我习惯把 Xshell 连 CentOS 分成三层。第一层是网络层目标是确认“Xshell 所在机器能不能到达 CentOS 的 IP并且 TCP 22 端口有没有响应”。第二层是服务层目标是确认“CentOS 上的 sshd 有没有运行、有没有监听正确端口、防火墙和 SELinux 有没有放行”。第三层是认证与算法层目标是确认“用户名密码对不对、密钥权限对不对、Xshell 和 sshd 能不能协商出共同支持的加密算法”。这三层的顺序不要乱。网络层没通你去改 sshd_config 毫无意义服务层没起来你去查密码也是白费只有前两层都通了才轮到认证和算法。实际排障时我一般会用三个命令快速分层# 第一层网络是否可达 ping -c 4 192.168.1.100 # 第二层22 端口是否开放Linux/macOS nc -vz 192.168.1.100 22 # Windows PowerShell 可用 Test-NetConnection 192.168.1.100 -Port 22如果 ping 通、端口也通但 Xshell 还是连不上那问题基本就在第三层重点看报错里的算法和认证关键字。如果 ping 不通先别碰 CentOS 里的 SSH 配置回去查 VMware 网络、CentOS IP、云服务器安全组或者 WSL2 端口转发。2. 网络层排查IP 通不通、端口开不开、虚拟网卡选没选对网络层是 Xshell 连 CentOS 最容易翻车的地方尤其是 VMware 虚拟机。宿主机和虚拟机之间隔着虚拟网卡、虚拟交换机、NAT 服务任何一个环节配置不对Xshell 都会告诉你“连接失败”。而且 CentOS 7.9、CentOS 8.5、CentOS 9 在网卡命名和网络管理工具上还有差异CentOS 7 常用network服务CentOS 8/9 更推荐nmcli排查命令不能混用。2.1 VMware 三种网络模式对 Xshell 连接的影响VMware 虚拟机常用的网络模式有三种桥接、NAT、仅主机。它们的区别直接决定 Xshell 该填哪个 IP。桥接模式相当于虚拟机直接连到物理局域网虚拟机会从路由器获取一个和宿主机同网段的 IP。比如宿主机是192.168.1.10虚拟机可能是192.168.1.20。这种模式下Xshell 直接填虚拟机的 IP 就能连前提是物理网络允许。缺点是 IP 可能变换网络环境后虚拟机可能拿不到同网段地址。NAT 模式是虚拟机通过宿主机上网虚拟机通常在一个独立网段比如192.168.100.0/24宿主机在192.168.1.0/24。宿主机能访问虚拟机的 NAT 网段但局域网其他机器默认访问不到。Xshell 如果装在宿主机上直接填虚拟机 NAT IP 一般能连如果 Xshell 装在另一台电脑上就需要在 VMware 虚拟网络编辑器里做端口转发把宿主机的某个端口映射到虚拟机的 22 端口。仅主机模式最封闭虚拟机和宿主机之间可以通信但虚拟机不能上外网。适合做隔离实验。Xshell 连接时填虚拟机在 VMnet1 网段的 IP。如果你发现 CentOS 能 ping 通宿主机但宿主机 ping 不通 CentOS多半是仅主机模式或者防火墙拦截。我自己的习惯是本地实验优先用 NAT需要局域网其他设备访问就用桥接做离线安全实验用仅主机。选好模式后一定要在 VMware 的“虚拟网络编辑器”里确认对应 VMnet 的网段、DHCP 和 NAT 设置别只看虚拟机里的 IP。2.2 CentOS 7.9 查 IP、网卡、网关和路由的常用命令CentOS 7.9 最小化安装后第一件事是确认网卡有没有启动、有没有拿到 IP。常用命令如下# 查看所有网卡和 IP ip addr # 查看网卡连接状态 nmcli dev status # 查看连接配置 nmcli con show # 查看路由和网关 ip route route -n # 查看 DNS cat /etc/resolv.conf如果ip addr里只有lo没有ens33或eth0说明网卡没启用。CentOS 7 可以编辑/etc/sysconfig/network-scripts/ifcfg-ens33TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.100.128 PREFIX24 GATEWAY192.168.100.2 DNS1223.5.5.5改完后重启网络systemctl restart network # 或者 nmcli con up ens33CentOS 8/9 里network服务已经弱化推荐用nmclinmcli con mod ens160 ipv4.addresses 192.168.100.128/24 nmcli con mod ens160 ipv4.gateway 192.168.100.2 nmcli con mod ens160 ipv4.dns 223.5.5.5 nmcli con mod ens160 ipv4.method manual nmcli con up ens160这里有个细节CentOS 7.9 查看网卡命令很多人记不住其实ip addr和nmcli dev status足够。别再用ifconfig最小化安装默认没有 net-tools还得额外装。改完 IP 后先在 CentOS 里ping网关再ping外网最后从宿主机ping虚拟机。这三步都通了网络层才算基本过关。2.3 ping 不通网关和云服务器安全组的处理CentOS ping 不通网关常见原因有四个网卡没启动、IP 网段写错、VMware 虚拟网络编辑器配置不对、宿主机防火墙拦截。可以先在 VMware 里检查 VMnet 的 DHCP 范围确认虚拟机 IP 是否在范围内。如果是 NAT 模式还要确认 VMware NAT Service 有没有运行。Windows 宿主机上可以看服务列表里的 VMware NAT Service 和 VMware DHCP Service。云服务器上 Xshell 连不上 CentOS第一嫌疑是安全组。云服务器的安全组是外层防火墙默认可能只开放 22 端口给特定来源 IP或者完全没放行。你需要去云控制台的安全组入方向规则里放行 TCP 22 端口来源可以先设成你的公网 IP不要图省事设成0.0.0.0/0。放行后再测试端口# Linux/macOS nc -vz 服务器公网IP 22 # Windows PowerShell Test-NetConnection 服务器公网IP -Port 22WSL2 里启动的虚拟机或者 WSL2 自身要 Xshell 连接又是另一套逻辑。WSL2 默认在 NAT 网络里Windows 宿主机不能直接通过 WSL2 的 IP 访问。常见做法是在 Windows 上用netsh interface portproxy做端口转发把 Windows 的某个端口转发到 WSL2 的 IP 和 22 端口同时放行 Windows 防火墙。注意 WSL2 每次重启 IP 可能变所以转发规则要跟着更新或者写脚本自动处理。3. SSH 服务层sshd 没起来Xshell 再折腾也白搭网络通了以后下一步就是确认 CentOS 上的 SSH 服务。CentOS 最小化安装不一定自带 openssh-server很多人装完系统发现 22 端口没监听就是因为只装了客户端没装服务端。服务层要查四件事sshd 有没有运行、有没有监听 22 端口、防火墙有没有放行、SELinux 有没有拦截。3.1 检查 sshd 状态、22 端口监听和安装情况先看服务状态systemctl status sshd如果显示inactive (dead)或者Unit sshd.service could not be found说明没装或者没启动。CentOS 7/8/9 安装命令yum install -y openssh-server systemctl start sshd systemctl enable sshdCentOS 8/9 使用dnf也一样dnf install -y openssh-server systemctl enable --now sshd再看监听端口ss -tlnp | grep 22 # 或者 netstat -tlnp | grep 22正常应该看到0.0.0.0:22或:::22。如果只看到127.0.0.1:22说明 sshd 只监听本机回环地址外部连不上。这通常是sshd_config里ListenAddress 127.0.0.1导致的改成ListenAddress 0.0.0.0或者注释掉然后重启 sshd。查看是否安装rpm -qa | grep openssh应该能看到openssh-server、openssh-clients等包。如果只有 clients没有 serverXshell 当然连不上。3.2 防火墙和 SELinux 放行 SSH 端口CentOS 7 以后默认用 firewalld。先看放行情况firewall-cmd --list-all如果services里没有ssh需要放行firewall-cmd --permanent --add-servicessh firewall-cmd --reload如果你改了 SSH 端口比如从 22 改成 2222就要放行对应端口firewall-cmd --permanent --add-port2222/tcp firewall-cmd --reload很多人改完端口只重启了 sshd忘了防火墙结果 Xshell 还是连不上。更隐蔽的是 SELinux。SELinux 会限制 sshd 只能监听特定端口默认 22 没问题改成 2222 可能需要额外授权semanage port -a -t ssh_port_t -p tcp 2222 semanage port -l | grep ssh如果临时排查可以setenforce 0把 SELinux 设为宽容模式但不建议长期关闭。永久关闭要改/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled然后重启系统。生产环境更推荐保留 SELinux只做端口授权和上下文修复。3.3 sshd_config 改错导致连不上监听地址、端口和登录权限/etc/ssh/sshd_config是 SSH 服务的核心配置改错一个参数就可能导致 Xshell 连不上。几个关键参数Port 22 ListenAddress 0.0.0.0 PermitRootLogin yes PasswordAuthentication yes PubkeyAuthentication yes UseDNS no GSSAPIAuthentication noPortSSH 端口改了以后 Xshell 会话里也要改。ListenAddress监听地址写成127.0.0.1就只允许本机连。PermitRootLogin是否允许 root 登录。有些系统默认prohibit-passwordroot 用密码就登不上。PasswordAuthentication是否允许密码认证。设成no就只能用密钥。UseDNS开启后登录时做 DNS 反查网络慢会导致登录卡很久。GSSAPIAuthentication在某些环境下也会拖慢登录。改完配置一定要先检查语法sshd -t没有输出说明语法没问题。然后重启systemctl restart sshd如果重启失败用journalctl -u sshd -n 50看日志。连接失败时/var/log/secure是排查认证问题的关键文件tail -f /var/log/secureXshell 那边按连接的同时这边看日志能看到具体是用户不存在、密码错误、权限拒绝还是算法不匹配。4. 认证与算法层密码没错Xshell 也可能死在算法协商上网络通、端口通、sshd 也在跑Xshell 还是连不上那就进入认证与算法层。这一层最典型的两个坑一个是老版本 Xshell 和新版 OpenSSH 的算法不兼容另一个是用户名、密码、密钥权限配置不对。4.1 老 Xshell 4/5 连 CentOS 报 no matching key exchange method foundCentOS 7.9 如果升级过 OpenSSH或者直接使用 CentOS 8/9默认的 OpenSSH 版本比较高已经移除了很多旧算法比如ssh-rsa、diffie-hellman-group1-sha1。而 Xshell 4、Xshell 5 这类老版本默认支持的算法比较旧双方没有交集就会报No matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha256解决办法有三个方向升级 Xshell 到较新版本比如 Xshell 7 或 Xshell 8默认算法支持更全。在 Xshell 会话属性里手动添加算法。老版本 Xshell 4 的位置一般在会话属性 - 连接 - SSH - 密钥交换/加密算法勾选或添加diffie-hellman-group-exchange-sha256、diffie-hellman-group14-sha256等。在 CentOS 的/etc/ssh/sshd_config里临时恢复旧算法比如KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1 HostKeyAlgorithms ssh-rsa PubkeyAcceptedAlgorithms ssh-rsa改完重启 sshd。但我要提醒一句恢复旧算法只是兼容老客户端的临时手段会降低安全性。生产环境优先升级 Xshell 或换用支持新算法的客户端。现在 Xshell 也有平替方案比如 Windows Terminal 自带 ssh、MobaXterm、PuTTY 新版本等都可以作为备选。4.2 用户名、密码、密钥和 root 登录的细节认证失败最常见的原因不是密码打错而是系统不允许这种登录方式。比如你用 root 登录但PermitRootLogin no你用密码登录但PasswordAuthentication no。可以在 CentOS 本机先自测ssh rootlocalhost ssh usernamelocalhost本机都登不上Xshell 更不可能登上。如果本机能登Xshell 不能登重点看 Xshell 会话里的用户名、端口、认证方式是否选错。密钥登录也有权限要求chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_rsa权限太开放sshd 会拒绝使用密钥。如果密钥放在自定义目录还要注意 SELinux 上下文restorecon -R -v /home/user/.ssh另外AllowUsers和DenyUsers参数也可能限制登录用户。检查sshd_config里有没有写死只允许某个用户。改完记得sshd -t和重启。4.3 Xshell 会话管理保存的密码、字体、传输文件和命令回退连接成功后Xshell 的日常使用体验也值得调一调。中文乱码问题进入会话属性 - 终端 - 编码选 UTF-8外观里换一个支持中文的字体比如微软雅黑或等宽字体。这样 CentOS 里ls中文文件名、查看日志里的中文就不会乱码。Xshell 怎么传输文件最方便的是用 Xshell 自带的 SFTP 面板或者安装lrzsz用rz上传、sz下载yum install -y lrzsz rz sz filename命令回退目录用cd -可以在当前目录和上一个目录之间切换。这个在深层目录之间跳转很实用。关于 Xshell 保存的密码Xshell 会把会话信息保存在本地密码是加密存储的。如果你忘了保存的密码不建议去找第三方工具解出来正确做法是删掉会话重新输入或者使用 Xshell 的主密码功能统一管理。导出会话文件时也要注意里面可能包含服务器地址和用户名别随手发到公开渠道。5. 实操复现VMware 装 CentOS 7.9 到 Xshell 成功连接下面按我从零搭建的顺序走一遍。环境是 Windows 宿主机 VMware CentOS 7.9 minimal Xshell。这个流程同样适用于 CentOS 8.5、CentOS 9只是网络管理命令略有差异。5.1 虚拟机网络和 CentOS 最小化安装的关键选择VMware 新建虚拟机时网络类型建议先选 NAT。安装 CentOS 7.9 时在“网络和主机名”页面把以太网打开让它通过 DHCP 获取 IP。安装完成后登录系统先用ip addr查看 IP。如果要做静态 IP编辑/etc/sysconfig/network-scripts/ifcfg-ens33TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.100.128 PREFIX24 GATEWAY192.168.100.2 DNS1223.5.5.5然后重启网络systemctl restart network ip addr ping -c 4 192.168.100.2 ping -c 4 223.5.5.5这里要注意VMware NAT 模式的网关通常是x.x.x.2不是x.x.x.1。具体看 VMware 虚拟网络编辑器里的 NAT 设置。IP 不要和 DHCP 分配范围冲突否则可能出现 IP 冲突。5.2 开启 SSH、放行端口并做本机自检CentOS 7.9 minimal 一般自带 openssh-server但保险起见检查一下rpm -qa | grep openssh systemctl status sshd systemctl enable --now sshd ss -tlnp | grep 22放行防火墙firewall-cmd --permanent --add-servicessh firewall-cmd --reload firewall-cmd --list-all本机自测ssh rootlocalhost能登录说明 sshd 和认证基本正常。然后从 Windows 宿主机测试ping 192.168.100.128 Test-NetConnection 192.168.100.128 -Port 22TcpTestSucceeded : True就说明网络和端口都通了。5.3 Xshell 新建会话主机、端口、用户和第一次连接打开 Xshell新建会话。名称随便写比如centos7-dev。协议选 SSH主机填192.168.100.128端口 22。用户身份验证里填 root 或普通用户。第一次连接会提示接受主机密钥点接受。如果连不上回到前面三层排查。连接成功后建议做几件事设置终端编码为 UTF-8换中文字体。配置日志记录方便回溯操作。使用 SFTP 面板或lrzsz传文件。拍一个 VMware 快照后续折腾坏了可以回滚。如果后面要装 Redis、Nginx、Docker、Node.js、Maven先把网络和 SSH 稳住再动这些服务。CentOS 登录进 Redis 用redis-cliDocker 修改镜像源、离线安装 Node.js 和 Maven 都属于连接成功之后的扩展操作不要和 SSH 连不上混在一起排查。6. 常见问题速查与避坑经验排障到最后其实常用的就是那几个命令和思路。下面把 Xshell 连 CentOS 的高频问题整理成速查表再补充一些我踩过的坑。6.1 Xshell 连 CentOS 问题速查表现象可能原因解决动作Xshell 报 Connection refusedsshd 没启动、端口不是 22、防火墙拒绝systemctl start sshdss -tlnp放行防火墙Xshell 报 Connection timed outIP 错、网络不通、云安全组未放行ping检查 VMware 网络和云安全组本机能 sshXshell 不能监听地址限制、防火墙、Xshell 端口填错检查ListenAddress和 Xshell 会话端口密码正确但 Permission deniedroot 禁止登录、密码认证关闭、AllowUsers 限制看/var/log/secure改 sshd_config报 no matching key exchangeXshell 版本旧OpenSSH 算法新升级 Xshell 或调整 KexAlgorithms登录后卡住很久UseDNS 开启、GSSAPI 反查关闭 UseDNS 和 GSSAPIAuthentication改了 SSH 端口后连不上防火墙没放行、SELinux 没授权firewall-cmd --add-portsemanage port -aCentOS ping 不通网关网卡未启动、IP 网段错、VMware NAT 服务异常检查nmcli、VMware 虚拟网络编辑器WSL2 无法被 Xshell 连接WSL2 在 NAT 网络Windows 未做端口转发用netsh interface portproxy转发并放行防火墙中文显示乱码Xshell 编码非 UTF-8、字体不支持中文会话属性改 UTF-8换中文字体Xshell 传文件失败未装 lrzsz、SFTP 权限不足yum install lrzsz或用 SFTP 面板克隆虚拟机后连不上MAC/IP 冲突、网卡名变化重新生成 MAC检查 ifcfg 文件6.2 我踩过的坑和独家建议第一个坑是 VMware 网络模式混用。同一台虚拟机先桥接后 NATIP 变了但 Xshell 会话还填旧 IP当然连不上。建议给每个环境固定的会话名称IP 变了先ip addr确认。第二个坑是克隆虚拟机。克隆后 MAC 地址和 IP 可能冲突CentOS 里网卡名也可能从ens33变成ens34但配置文件还是旧的。解决办法是在 VMware 里重新生成 MAC进系统用nmcli重新配置连接。第三个坑是防火墙 permanent 规则没 reload。firewall-cmd --add-servicessh不加--permanent重启就失效加了--permanent不--reload当前又不生效。两个参数要配对使用。第四个坑是 SELinux 改端口。改 SSH 端口只改sshd_config和防火墙忘了 SELinux结果端口监听不了。semanage port -a -t ssh_port_t -p tcp 2222这句要记住。第五个坑是云服务器安全组。本地虚拟机通了上云就连不上多半是安全组没放行 22 端口或者来源 IP 限制太严。云服务器还要注意公网 IP 和内网 IP 的区别Xshell 填的是公网 IP。第六个坑是宝塔面板。装了宝塔面板后它可能会改 SSH 端口或者防火墙规则Xshell 连不上时先看宝塔安全里放行的端口和实际 sshd 端口是否一致。第七个坑是 CentOS 扩容和磁盘挂载。这些操作本身不影响 SSH但如果你在扩容后改错了/etc/fstab系统起不来Xshell 自然连不上。改分区和挂载前一定要拍快照。最后再分享一个小技巧把常用排查命令写成一段脚本放在跳板机或者本地连接失败时依次执行。先 ping再测端口再看 sshd 状态再看日志。十次里有八次不是 Xshell 的错而是网络或服务端配置。把sshd -t和journalctl -u sshd -n 50养成习惯比反复重启系统有用得多。