MobaXterm连不上Ubuntu?三大报错与完整排错排查手册
2026/9/17 6:27:47 网站建设 项目流程

先别急着重装系统、换终端工具,MobaXterm连不上Ubuntu这个报错,背后藏着的其实是好几类完全不同的故障。Connection refusedConnection timed outHost key verification failed这三行英文提示,分别指向服务端、网络、认证三个完全不同的层面,排查思路和修复手段也截然不同。这篇文章我从服务端配置、客户端设置、虚拟机网络、以及连上之后的中文乱码和字体优化这几个角度,把我在实际环境中踩过的坑和验证过的解决方案完整梳理一遍。无论是刚装好 Ubuntu 想用 Windows 远程登录的新手,还是在公司内网、VMware 虚拟机或者 WSL 环境里反复摸索的老手,这篇都能直接照着排查。

1. 先分清是哪种“连不上”:三种报错指向三个不同病灶

很多人在网上发帖求助只说一句“MobaXterm连不上Ubuntu”,但实际上这句话的信息量几乎为零。同样是连不上,Connection refusedConnection timed out的排错路径天差地别,如果你拿处理超时的思路去查已经被拒绝的连接,折腾半天也不会有结果。所以第一步不是改配置,而是读懂报错本身。

1.1 Connection refused:服务端根本没在监听

这个报错的中文意思是“连接被拒绝”,它的核心特征是非常快速、几乎瞬间就返回错误。这通常意味着你发出的网络包顺利到达了目标机器,但目标机器上的 22 端口没有任何程序在监听,于是系统直接回复了一个 RST 包,告诉你说“这里没这门儿”。

我遇到过的最常见原因是 Ubuntu 上根本没安装openssh-server。很多人装 Ubuntu 桌面版时装完就以为系统自带远程登录能力,实际上桌面版默认只装了openssh-client,也就是只能当客户端去连别人,不能被别人连。如果你用裸机装的是 Ubuntu Server 但安装时没勾选 OpenSSH 组件,同样会有这个问题。

在服务端本地执行一句:

sudo systemctl status ssh

如果提示Unit ssh.service could not be found,说明压根没装;如果提示inactive (dead),说明装了但没启动。前者直接安装:

sudo apt update && sudo apt install -y openssh-server

后者用:

sudo systemctl enable --now ssh

这里有个细节容易被忽略:service sshd statussystemctl status ssh在不同版本上表现不一样,Ubuntu 18.04 之后的服务名统一是ssh,不是sshd,在部分教程里写的是sshd,你直接复制命令可能会报找不到服务,别慌,换ssh再试。

1.2 Connection timed out:网络路径根本不通

Connection timed out就是另一码事儿了。它往往要等好久才报错,比如你盯着 MobaXterm 界面看十几秒、几十秒才跳出来。这说明你的网络包发出去了,但一直到达不了目标机器,或者目标机器收到了但回包回不来,整个链路处于“失联”状态。

这个问题在 VMware 虚拟机环境里简直是重灾区。很多同学在虚拟机里装好了 Ubuntu,然后在 Windows 上用 MobaXterm 去连虚拟机的 IP,结果就是超时。原因大多是虚拟机的网络模式没选对,或者 IP 本身就没拿到。

最快验证方法是在 Windows 的命令行里执行:

ping 你Ubuntu的IP地址

如果 ping 不通,那说明问题出在网络层,SSH 配置再正确也没用。这时候你需要检查三件事:

  1. 虚拟机的网络模式是 NAT 还是桥接,还是仅主机模式
  2. Ubuntu 里面有没有配好 IP,ip addr看看网卡状态
  3. Windows 和 Ubuntu 是否在同一网段

后面第 4 章我会专门用一整节来讲虚拟机和各种环境下的网络坑,这里你先记住结论:凡是超时,先 ping,不要先去折腾 SSH 配置文件。

1.3 Host key verification failed 或 Authentication failed:能到门口但进不去

如果你看到的是这两类报错,恭喜你,网络和服务端其实都已经通了,卡在的是安全验证环节。

Host key verification failed的意思是 MobaXterm 认识这台主机,但主机返回的身份密钥和它之前记录的不一样。这种情况高发于你重装过 Ubuntu 系统、或者重置过 SSH 主机密钥之后。MobaXterm 出于安全考虑,发现“认证身份对不上”会直接拒绝连接,防止中间人攻击。解决办法也很简单,在 MobaXterm 的Tools菜单里找到MobaKeyGen旁边的清理工具,或者直接到本地用户目录下删除对应的 known_hosts 记录,重新连接时选择信任即可。

Authentication failed就比较直白了,用户名、密码、密钥三者必然有一个不对。这里有个 Ubuntu 特有的坑:默认情况下 root 用户是禁止远程登录的,就算你用 root 和正确密码去连,也依然报认证失败。要先确认你用的是安装时创建的普通用户名。

1.4 能连上但卡死、白屏、秒断:这也是“连不上”的一种

有一类问题经常被人忽略,就是 SSH 连接本身建立了,但 MobaXterm 的终端里一片空白,或者登录成功后过几秒就自动断开。从用户体验上讲,这也是“连不上”。这通常和 SSH 保活机制、服务端sshd_config里的ClientAliveInterval参数、以及本机防火墙对空闲连接的清理策略有关。

这一块我放在第 3 章的客户端配置里详细讲,因为大多数情况下改 MobaXterm 的连接设置就能解决。

2. 服务端整改清单:Ubuntu 侧必须逐项确认的 SSH 配置

排查完报错类型之后,如果你确认问题出在服务端,那下面的项目要挨个过一遍。我见过很多人只看网上零散的教程,装个 SSH 服务就以为万事大吉,结果端口号被改过、防火墙没放行、公钥权限不对,一系列问题全堆在一起,反而更难查。

2.1 确认动态端口和监听状态

很多人不知道,Ubuntu 的 sshd 配置里是可以用Port字段指定监听端口的。如果你之前照着某些安全加固教程把端口从 22 改成了别的,比如 2222 或者 22022,但 MobaXterm 里还傻傻地填 22,那必然报 refused。

先查看服务端实际监听端口:

sudo grep -i port /etc/ssh/sshd_config | grep -v "^#"

再用netstat验证监听状态:

sudo netstat -tlnp | grep ssh

看到0.0.0.0:22说明监听在全部网卡上,这样才比较稳妥。如果显示的是127.0.0.1:22,那说明 sshd 只监听了回环地址,外网(哪怕是从局域网)永远连不上。这个ListenAddress配置项是相当隐蔽的一个坑。

注意:如果sshd_config里没有显式的ListenAddress,默认就是监听所有网卡。出现只监听 127.0.0.1 的情况,多半是有人改过配置或者从模板拷过来时带上了多余项。

2.2 PermitRootLogin 和 PasswordAuthentication 的取值逻辑

PermitRootLogin的默认值在不同 Ubuntu 版本里其实不一样。在比较新的 Ubuntu 22.04/24.04 里,默认是prohibit-password,意思是不允许 root 用密码登录,但允许密钥登录。很多人听说“Ubuntu 不能用 root 登录”就以为必须开PermitRootLogin yes,其实没必要,反而有安全风险。你只需要确保自己使用的普通用户能登录就行。

如果确实需要 root 远程登录,修改/etc/ssh/sshd_config/etc/ssh/sshd_config.d/下的配置:

sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config sudo systemctl restart ssh

PasswordAuthentication这个字段同样要确认是yes,尤其当你用的是密码登录时。这里有个教训:某些云服务器的镜像默认改成no,强制要求密钥登录,你拿密码去连怎么都是 Authentication failed。

改完配置后务必验证语法是否正确:

sudo sshd -t

没有任何输出就说明配置解析通过,然后再重启服务。养成这个习惯,可以避免改错一个字段把整个 SSH 服务干挂,自己把自己锁在外面。

2.3 ufw 防火墙:放行对应端口

Ubuntu 自带的防火墙ufw默认是关闭的,但有部分安装镜像或后续的“安全优化教程”会把它打开。一旦打开,默认策略基本是拒绝所有入站连接,22 端口如果没放行,外面就连不进来。

查看防火墙状态:

sudo ufw status verbose

如果发现 22 或你自定义的端口没有出现在列表里,执行:

sudo ufw allow 22/tcp

注意,如果你改过 sshd 的监听端口,防火墙也要放行那个新端口,比如sudo ufw allow 2222/tcp。这里有朋友容易搞混——防火墙放行的是实际端口,不是你心里想的 22。

提示:如果ufw status显示inactive,说明防火墙完全关闭,不用继续折腾。另外cloud-init在云服务器上可能自动配置了 nftables/iptables 规则,这类环境要额外用sudo iptables -L -n检查一下,不过本地虚拟机通常没这个困扰。

2.4 环境变量配置错误引发的“连不上”假象

有一种非常隐蔽的故障:SSH 能建立连接、用户也能通过认证,但终端卡死或立刻断开,翻看 SSH 日志也没发现异常。这类问题往往不是 SSH 本身的问题,而是用户 shell 启动时加载的环境变量脚本出错了。

最常见的就是/etc/profile~/.bashrc~/.profile里有人写了错误的export PATH=...,把系统路径覆盖了。登录时 shell 启动脚本执行到一半报错,终端直接退出,表现就是“刚连上就断了”。更严重的还会导致sudols这类基础命令都无法找到。

如果你还能通过物理终端或其他方式登录,可以这样检查:

grep -n "PATH=" /etc/profile ~/.bashrc ~/.profile 2>/dev/null

把明显错误的那一行注释掉再重新登录试试。如果是 root 通过执行sudo -i切过去时出的问题,还要查 root 自己的~/.bashrc

这个坑在网上极少被系统性地讲透,但它真真切切让我有一次差点重装整个系统。

3. 客户端排错:MobaXterm 这边的配置决策与隐藏选项

服务端一切正常,那问题大概率在 MobaXterm 客户端本身。很多人创建一个 session 跟着网上填,端口默认用 22,用户名填 root,密码一输就以为完事儿。真正等你连不上的时候,客户端里这几个设置才浮出水面。

3.1 新建 Session 时的协议与端口匹配

MobaXterm 新建 session 时,左上角第一步要选对协议类型。连接 Linux 服务器选择 SSH,不是 Telnet,不是 RDP。选错协议的人虽然少,但一旦选错,报错信息往往是看不懂的乱码或者直接超时。

端口这里要和服务端保持一致。服务端是 22 就填 22,服务端改成 2222 就填 2222,没有任何例外。MobaXterm 里填端口时注意不要在数字后面加空格,这种低级错误通常发生在复制端口号的时候。

Remote host 那一栏填 IP 地址或域名都可以,但要注意如果 Ubuntu 的 IP 是动态获取的,DHCP 租约到期后换了新 IP,你在 MobaXterm 里保存的还是旧地址,那自然连不上。所以每次连不上先ping一下当前 IP,确认和目标保存的 IP 是否一致。

3.2 用户名之惑:为什么 root 密码明明正确却连不上

前面提过 Ubuntu 默认prohibit-password导致 root 无法用密码登录。这个问题在 MobaXterm 里表现得很诡异:输错密码是Access denied,但输对了密码也一样Access denied,让人怀疑自己是不是记错了密码。

正确做法是在 username 里填入安装 Ubuntu 时创建的普通用户,比如ubuntumobaxterm等。如果你真的需要 root 登录,建议配置密钥认证而不是把PermitRootLogin改成yes,安全系数高很多。

密钥配置的姿势是这样的,在 MobaXterm 的 Tools 菜单里打开 MobaKeyGen,生成一对密钥,把公钥追加到服务器的~/.ssh/authorized_keys文件里,然后在 session 设置里指定私钥路径。这里有个权限细节:服务器侧的.ssh目录权限必须是 700,authorized_keys文件权限必须是 600,权限太宽松 SSH 会直接忽略这个公钥,继续要求输密码甚至直接拒绝。

mkdir -p ~/.ssh && chmod 700 ~/.ssh touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys

3.3 SSH keepalive 与终端卡死问题

很多人在 MobaXterm 里连上 Ubuntu 后,挂着一段时间不动,回来再看终端已经没响应了,输入什么都没反应,过一会儿直接断开。这通常不是服务器挂了,而是中间有 NAT 设备或防火墙把空闲连接清理掉了。

MobaXterm 里对应的设置比较简单,在 session 的 SSH 高级设置里,找到SSH keepalive选项,设置为每 5 秒发送一次心跳包即可。sudo 权限不足也没关系,这是客户端行为,不依赖服务器。

同时服务端配合调整:

sudo cat >> /etc/ssh/sshd_config <<EOF ClientAliveInterval 30 ClientAliveCountMax 3 EOF sudo systemctl restart ssh

这样服务端每 30 秒检测一次客户端状态,即便会话空闲也不容易被断开。

3.4 密码保存与凭据管理器

还有一个使用层面的注意点:MobaXterm 默认会把密码保存在本地配置文件中,你如果勾选了保存密码,那么换了一台机器重新安装 MobaXterm 后,即便导入会话配置,密码也未必能同步过去。很多人以为是配置错了,其实是凭据没过去。

我现在的习惯是:重要服务器用密钥认证,普通测试机用密码认证但不开密码保存,每次手动输入。省去了很多“为什么这边能连那边连不上”的困惑。

4. 虚拟机、WSL 和局域网环境下的常见场景

MobaXterm 连不上 Ubuntu 这个问题,有一大半其实不是 SSH 的问题,而是网络环境搭建的坑。VMware、VirtualBox、WSL、双系统、树莓派、局域网服务器,每种环境都有各自的“连不上”原因。

4.1 VMware 虚拟机:NAT 和桥接模式怎么选

VMware 装完 Ubuntu 后,默认的网络模式通常是 NAT。在 NAT 模式下,虚拟机和宿主机可以互通,虚拟机可以访问外网,但局域网里的其他设备无法通过虚拟机的 IP 访问它。这对从 Windows 宿主机上用 MobaXterm 连接 Ubuntu 是没有问题的,因为宿主机和虚拟机在 NAT 网络内可以直接通信。

但你如果希望在别的电脑上也能远程连这台虚拟机里的 Ubuntu,NAT 模式就不行了,需要改成桥接模式。桥接模式下,虚拟机像是和宿主机并排在同一个局域网里的独立设备,可以获得一个和路由器同一网段的 IP。

切换桥接模式后别忘记做两件事:

  1. 在 Ubuntu 里检查是否拿到了新 IP,ip addr看网卡状态
  2. 确认新的 IP 和你 MobaXterm 里填写的 IP 一致

有一次我帮同事排查,他的 VMware Ubuntu 网络一直不通,最后发现是桥接模式绑定到了电脑的无线网卡上,而无线局域网有“AP 隔离”功能,设备之间禁止互相访问,所以 ping 不通,SSH 自然不行。换成有线网卡的桥接后立刻就好了。

4.2 WSL、WSL2 环境下的特殊连接方式

在 Windows 上用 WSL 跑 Ubuntu,MobaXterm 连接方式又不一样。WSL1 和 WSL2 的网络模型不同,WSL1 的 localhost 是和 Windows 共享的,你直接在 MobaXterm 里填127.0.0.1就能连。但 WSL2 是一个轻量虚拟机,有自己的虚拟网卡和独立 IP,虽然 Windows 上做了 localhost 转发,但如果你配置的是监听在 WSL 内部 IP 的 SSH 服务,MobaXterm 从 Windows 里填 localhost 未必能连上。

最稳妥的做法是在 WSL 的 Ubuntu 里启动 sshd 后,用ip addr查看 WSL 的 IP,然后在 MobaXterm 里填 WSL 的 IP。但如果 WSL 重启,IP 可能会变化,所以更推荐在 WSL2 里跑 sshd,然后直接在 Windows 侧通过 localhost 转发来连:

sudo service ssh start

然后在 MobaXterm 的 Remote host 填localhost127.0.0.1,端口 22。很多时候 WSL 的 IP 不稳,但 localhost 转发这条通道是稳定的。

4.3 局域网服务器和开发板场景:固定 IP 与服务的自启动

如果你连接的是局域网里的物理 Ubuntu 服务器、树莓派、imx6ull这类嵌入式开发板,那就要特别注意 IP 固定和服务自启动的问题。开发板第一次上电拿到的是路由器分配的随机 IP,重启后可能就变了。更坑的是,有些精简系统镜像为了减小体积,默认没装 openssh-server,或者装在系统分区上,每次重启后手动启动 sshd。

对于长期使用的设备,我建议在/etc/rc.local或者 systemd 服务里把 sshd 设为开机自启:

sudo systemctl enable ssh

IP 固定则可以通过 netplan 或者/etc/network/interfaces配置,避免每次从路由器后台翻看 IP。

5. 连上之后的体验优化:编码、字体、日志和卡顿处理

费了九牛二虎之力终于用 MobaXterm 连上了 Ubuntu,但终端里中文乱码、字迹发虚、操作卡顿、日志没法留存——这些体验问题同样会影响工作流。特别是中文乱码,在很多嵌入式开发场景中频繁出现。参考热搜里的关键词“imx6ull开发板在屏幕终端中文显示乱码,但是在mobaxterm可以显示中文”,这其实是字符集编码不一致导致的,解决办法值得单独梳理。

5.1 中文乱码的本质与解决思路

终端里中文显示成方块或者问号,核心原因是连接会话使用的字符集和服务端的 locale 设置不匹配。绝大多数现代 Linux 服务器默认使用 UTF-8,MobaXterm 默认终端编码也是 UTF-8,两者搭配基本没问题。但如果你连接的是某些嵌入式开发板,或者服务器 locale 被改成了非 UTF-8 编码,乱码就来了。

MobaXterm 里可以手动切换会话的字符集:在 Session 设置里进入Terminal标签页,找到Default charset选项,把它设为UTF-8。如果某些板子系统强制用了GBK或者ANSI,那就要改成对应的编码。

服务端侧先确认 locale:

locale

如果LANG不是en_US.UTF-8C.UTF-8,可以临时切换:

export LANG=C.UTF-8

但更彻底的做法是把默认 locale 生成为 UTF-8:

sudo locale-gen en_US.UTF-8 sudo update-locale LANG=en_US.UTF-8 LANGUAGE=en_US:en

我遇到过一种情况:开发板本身是精简文件系统,压根没装 locale 数据,终端里怎么设置都是乱码。这时候不要死磕 locale,直接在 MobaXterm 里把终端编码切到 UTF-8,再检查实际应用输出的是什么编码,两边尽量对齐就好。

5.2 接近 macOS 体验的字体配置

很多从 macOS 切到 Windows 的开发者对终端字体的审美有执念,MobaXterm 默认的字体确实谈不上好看,而热搜词里也专门有“wsl ubuntu写代码最推荐的字体接近macos的体验”。这里把字体问题一并解决。

我实测下来,最接近 macOS 终端观感、同时适合中文显示的组合是:

  • 英文字体:JetBrains MonoSource Code Pro
  • 中文字体:Noto Sans Mono CJK SCSarasa Mono SC
  • 字号:13 或 14 号,行距保持默认

MobaXterm 的 Settings 菜单里进入Configuration,在Terminal选项卡的Font区域选择字体。JetBrains Mono在等宽基础上保留了一些人文曲线的细节,Source Code Pro则更圆润活泼,两者在终端里的辨识度都远高于默认的 Courier New。

个别朋友在 MobaXterm 下用JetBrains Mono显示中文会有些偏高偏瘦,这时候把中文字体单独设置为微软雅黑或者Sarasa Mono SC就能兼顾中英文混排的观感。

5.3 保存日志和时间戳:便于问题追溯

运维排查和日常调试时,终端输出往往需要留存。MobaXterm 的日志功能在SettingsTerminal选项卡里,可以设定终端全部输出自动写入指定文件。但默认日志文件名没有时间戳,会不断覆盖。我的习惯是开启日志并按日期生成不同文件。

如果你需要的是实时时间戳输出,而不是保存日志文件名的时间戳,可以在 Ubuntu 侧用ts命令给每条输出前添加时间:

sudo apt install moreutils ping 8.8.8.8 | ts

这样每一行都会带上精确的时间,排查网络抖动、串口返回延迟之类的问题时特别方便。装了多台设备的场景下,把 MobaXterm 保存的日志统一归档到D:\logs\%Y_%M_%D_%H_%m_%S_#M.txt这类命名模板里,时间戳加会话名,不重不漏。

5.4 卡顿优化:从渲染到连接的逐级检查

MobaXterm 使用一段时间后出现明显卡顿,主要有三个来源:一是终端内容渲染量过大导致的 GPU/CPU 高占用;二是 SSH 保活机制没配好导致长时间空闲后缓冲堵塞;三是 MobaXterm 在 Windows 上开了过多的标签页和后台任务。

针对渲染性能,进入Settings->Configuration->Display,可以关闭一些耗时的视觉效果,比如Smooth scrolling,并减少终端缓冲区行数。针对 SSH 连接质量,打开前面说过的 keepalive 设置。如果只是单纯觉得 MobaXterm 启动慢,检查是否有大量 SFTP session 自动挂载目录,SFTP protocol设为None可以明显提速。

6. 完整排错命令速查表与我的排查习惯

讲了这么多,最后把所有有用的检查命令整理成一张速查表,方便你挂在手边,遇到连不上问题时按图索骥,基本上一两分钟内就能定位问题出在哪一层。

6.1 按排查顺序排列的速查命令

排查层级操作命令预期结果失败指向
网络连通性ping <Ubuntu_IP>有回包网络配置、虚拟机网卡、路由器隔离
端口可达性telnet <Ubuntu_IP> 22成功连接sshd 未启动、防火墙拦截、端口错误
端口监听`sudo netstat -tlnpgrep ssh`0.0.0.0:22
SSH 服务状态sudo systemctl status sshactive (running)服务未启动
SSH 配置语法sudo sshd -t无输出配置文件存在语法错误
防火墙状态sudo ufw status verbose22/tcp 放行或 inactive防火墙拦截
认证机制`grep -E "PermitRootLoginPasswordAuthentication" /etc/ssh/sshd_config`符合你的登录方式
客户端连接详情MobaXterm 的ssh -v <user>@<IP>输出详细握手日志卡在哪一步代表故障在哪一层

上面表格里的telnet <IP> 22这一步要特别说明:即使没有 telnet 客户端,Windows 10/11 也自带了,但默认没启用,你可以用 PowerShell 里的Test-NetConnection <IP> -Port 22,效果类似,能快速判断端口是否通。

6.2 我在实际接线环境中积累的几条习惯

第一,永远不要跳过 ping 直接折腾 SSH 配置。我见过太多人花一下午改 sshd_config,最后发现虚拟机的网卡根本没启用物理连接。网络层不通,上层再怎么调都是白搭。

第二,养成看日志的习惯。连接失败后,在服务端执行:

sudo tail -50 /var/log/auth.log

sshd会把每次连接尝试都记录在这里,Failed passwordConnection closed这些提示比任何猜谜都靠谱。比如你看到error: maximum authentication attempts exceeded,说明是重试次数太多,需要等一下再试;看到Connection reset by IP,说明客户端在网络中途被重置了连接。

第三,尽量给 virbr0、docker0 这类虚拟网卡地址留个心眼。如果你在 Ubuntu 机器上装了 Docker,宿主机上会多出docker0网卡,很多人用ip addr找 IP 时一眼看到了172.17.0.1就往 MobaXterm 里填,结果自然是连不上。正确地址是与你物理网卡同网段的那个 IP,通常是ens33eth0ens160对应地址。

6.3 最后再分享一个实用小技巧

排查过程中如果人不在服务器旁边,又担心修改 SSH 配置把自己锁在外面,我建议永远保持两个以上远程登录通道。比如一个连接用密码登录,另一个用密钥登录,或者一个走 SSH、一个走 MobaXterm 自带的 SFTP。万一改坏了一个通道,还能用另一个救回来。

另外一个习惯是,Ubuntu 系统每次大版本升级之后,都主动用 MobaXterm 重新连一次。升级过程中如果 openssh-server 的配置文件被覆盖或者端口被 DenyUsers 之类的默认规则限制,很多隐蔽的“连不上”就出来了。提前验证,别等上生产环境才发现远程管理通道已经断了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询