资讯动态

虚拟机SSH连接全攻略:从网络模式到免密登录

发布时间:2026/10/20 13:45:22 来源:尧图企业网站定制
1. 为什么非要把 SSH 请进虚拟机里刚接触 Linux 虚拟机的人十有八九都是在 VMware 或 VirtualBox 的窗口里敲命令。一开始还能忍等你要编辑文件、翻日志、反复粘贴命令的时候那种“窗口太小、鼠标被卡、复制还经常带格式”的体验会迅速消磨掉你的耐心。换个思路把虚拟机当成一台远程服务器用宿主机上的 SSH 客户端连过去窗口大小随便调复制粘贴顺滑命令历史都在宿主机终端里留着效率完全是两个世界。这个标题看起来简单其实背后牵扯到的知识点一点也不浅虚拟机网络模式怎么选、SSH 服务端怎么配、防火墙要不要关、连不上到底卡在哪一层。这篇就按我自己的实操顺序把这些坑一个一个给你捋清楚。适合刚装好 Linux 虚拟机、被终端窗口折磨到想砸键盘的人也适合做实验需要频繁在宿主机和虚拟机之间切换的开发者。SSH 这个协议本身并不神秘它做的事情就是在两台机器之间建立一条加密通道让你安全地远程执行命令。几乎所有 Linux 发行版都默认自带 OpenSSH 客户端服务端装一下就能用。真正让新手栽跟头的往往不是 SSH 本身而是虚拟机网络不通、服务没启动、防火墙把端口拦了这类“外围问题”。所以这篇文章的结构就是先讲懂网络选型再一步步把环境配好最后把常见问题一网打尽。2. 动手前的关键决策虚拟机网络模式怎么选2.1 三种网络模式的本质区别VMware 和 VirtualBox 这类虚拟机软件默认给你提供了几种网络模式。很多人装完系统直接一路默认根本没注意自己用的是哪种。等要 SSH 的时候才发现虚拟机能上网宿主机却死活连不进去。这就是网络模式选错的典型症状。NAT 模式最常见虚拟机通过宿主机共享网络上网虚拟机自己处在一个私网段里宿主机可以主动访问虚拟机但外部网络访问不了虚拟机。桥接模式则让虚拟机直接暴露在宿主机所在的局域网里相当于一台独立设备局域网里其他机器也能直接访问它。仅主机模式则是完全隔离虚拟机只能和宿主机通信不通外网。这三种模式各有适用场景日常学习用 NAT 就够因为宿主机连虚拟机这个方向是通的正好满足 SSH 的需求。2.2 为什么首选 NAT 模式而不是桥接很多新手一听“桥接更像真实服务器”就跑去选桥接结果反而给自己挖坑。桥接模式下虚拟机要走物理网卡如果你在的局域网 DHCP 分配不老实、或者网络对陌生设备有限制虚拟机会拿不到有效 IP或者拿到 IP 也出不了网折腾半天连包 ping 都发不出去。而且桥接模式还会暴露虚拟机给整个局域网安全风险也跟着涨。NAT 模式是软件内部做了一层地址转换宿主机是虚拟机的“网关”虚拟机只管跟宿主机通信外部一概不关心。这个模型跟家用路由器后面的设备很像内网设备能出网外面找不到内网设备。你宿主机访问虚拟机走的是虚拟网卡稳定可靠不受外部网络环境影响。实际测试下来NAT 模式下 SSH 连接的成功率几乎百分之百所以除非你有“让局域网其他电脑访问虚拟机”这个硬需求否则老老实实用默认的 NAT。2.3 确定网络模式的检查方法装系统的时候选了啥你不记得就用命令看一眼。在虚拟机里执行ip addr看网卡的 IP 网段再回宿主机执行ipconfigWindows或ip addrLinux / macOS对比两边网段。如果虚拟机 IP 是 192.168.x.x 这种私有段而宿主机虚拟网卡也是同网段基本就是 NAT 或仅主机要是虚拟机 IP 跟宿主机的物理网卡同网段那就是桥接。还有一个更直接的判断方法看 VMware 的“编辑 → 虚拟网络编辑器”选择 VMnet8 是 NATVMnet1 是仅主机VMnet0 是桥接。VirtualBox 则在“全局设定 → 网络”里看 Host-Only 和 NAT 网段。知道自己在哪个网络模式下后面排查问题时心里才踏实不会像个无头苍蝇一样乱试。3. 虚拟机端环境准备从装服务到放行端口3.1 安装并启动 OpenSSH 服务现在假设你已经装好了 Ubuntu / CentOS / Debian 这些主流发行版并且能正常登录系统。第一步先更新软件源然后安装 OpenSSH 服务端。不同发行版包名略有差异Ubuntu / Debian 是openssh-serverCentOS / RHEL / Rocky 是openssh-server但包管理器是 yum 或 dnf。命令我直接给你# Debian / Ubuntu 系 sudo apt update sudo apt install -y openssh-server # CentOS / Rocky / AlmaLinux 系 sudo dnf install -y openssh-server装完之后确认服务状态。现代系统大多用 systemd 管理服务执行sudo systemctl status ssh看到active (running)就是正常的。如果没跑起来手动启动并设置开机自启sudo systemctl start ssh sudo systemctl enable ssh注意 CentOS 系的服务名可能叫sshd用sudo systemctl status sshd查看。这两个名字本质上是一个东西只是发行版传统不同别因为名字不一样就以为装失败了。3.2 确认 IP 地址和监听端口服务装好了你还得知道虚拟机 IP 才能连接。执行ip addr看网卡信息找eth0或ens33这类网卡下的inet地址那个就是虚拟机在 NAT 网络里的 IP。比如我的 Ubuntu 虚拟机显示inet 192.168.200.130那我在宿主机上就连192.168.200.130。SSH 默认端口是 22你可以在虚拟机上确认监听状态sudo ss -tlnp | grep sshd看到类似LISTEN 0 128 0.0.0.0:22的输出说明 sshd 正在所有网卡的 22 端口上监听。这一步很多人跳过但如果你改了 sshd 配置、或者系统里有过其他 SSH 服务残留端口不对会让排查周期拉长所以建议每次配置完都顺手看一眼。3.3 防火墙策略关掉不是好习惯很多教程会教你把防火墙直接关掉说“反正虚拟机是测试环境”。我不赞成这个习惯因为它会掩盖配置问题让你在真正需要防火墙的生产环境里手足无措。正确做法是给 SSH 端口放行。Ubuntu 默认用的 ufwCentOS 默认用 firewalld。命令分别如下# Ubuntu / Debian sudo ufw allow 22/tcp sudo ufw reload sudo ufw status # CentOS / Rocky sudo firewall-cmd --permanent --add-port22/tcp sudo firewall-cmd --reload sudo firewall-cmd --list-ports如果你确实不想用防火墙也别急着systemctl stop firewalld先把规则看清楚再说。曾经有个同学找我说 SSH 连不上结果一看他之前为了跑某个服务把 firewalld 规则改得乱七八糟恢复规则比开端口麻烦多了。能放行就放行别走极端。3.4 宿主机能不能 ping 通虚拟机配置完网络先做一次最简单的连通性测试——ping。在宿主机终端执行ping 192.168.200.130换成你虚拟机的实际 IP。能 ping 通说明二层三层链路是通的问题大概率在 SSH 服务或端口层。ping 不通也别慌回到第 2 节检查网络模式八成是虚拟机的网络适配器断了或模式不对。还有一种偷懒但好用的方法直接在虚拟机里 ping 宿主机的 IP如果也能通说明双向链路都正常。宿主机 IP 可以用ipconfigWindows查。实在懒得查ping 一下网关地址也基本能判断链路状态。提示如果虚拟机里 ping 外网 IP 不通但 ping 宿主机通先检查 NAT 模式的网关配置这属于路由问题不会影响宿主机连虚拟机。4. 宿主机上的 SSH 连接实操命令行与图形化工具4.1 命令行一把梭OpenSSH 客户端宿主机如果是 Linux / macOS终端自带 OpenSSH 客户端Windows 10 以上版本也默认带了ssh命令。不用装任何额外软件直接执行ssh 用户名虚拟机IP比如我的虚拟机用户名是testIP 是192.168.200.130那就执行ssh test192.168.200.130第一次连接会提示确认主机指纹输入yes回车就行这个指纹会保存在~/.ssh/known_hosts里。之后输入虚拟机用户的密码就能看到虚拟机里的 shell 提示符了。确认已经进入虚拟机后可以执行hostname或ip addr验证一下自己连的确实是目标机器。Windows 用户如果用的是 CMD 或 PowerShell同样可以直接用ssh命令。只是一些老教程教的 PuTTY 属于第三方工具现在反而没必要了官方原生支持不香吗。Windows 的 OpenSSH 客户端不需要单独安装系统自带如果确实没有去“设置 → 应用 → 可选功能”里添加“OpenSSH 客户端”即可。4.2 图形化工具的适用场景命令行 SSH 对多数人够用但有些人喜欢图形化界面或者需要传文件、编辑远程文件、保存多个连接配置那就可以上图形化工具。Windows 上我用得比较多的是 MobaXterm它自带 SFTP 文件管理面板拖拽上传下载文件非常直观还支持保存多个会话配置。Mac 上很多人用 Termius界面漂亮同步配置方便。但这些工具本质上只是把ssh命令包装成 GUI底层还是同一个协议所以你不能说哪款更“厉害”只能说哪款更顺手。这里有个小陷阱很多图形化工具第一次连接也会校验主机指纹如果你之前用命令行连接过换了工具之后指纹不一致会弹警告。遇到这种情况回想一下是不是改过虚拟机的 SSH 配置或重装过系统确认无误后选择信任新指纹即可。4.3 SSH 配置文件的进阶用法一次配置永久复用频繁敲ssh test192.168.200.130也不是不行但确实不够优雅。你可以在宿主机的~/.ssh/config文件里写一个别名配置Host vm-ubuntu HostName 192.168.200.130 User test Port 22保存之后每次连接只需要执行ssh vm-ubuntu这个配置文件还能设置密钥路径、代理跳板、连接超时等参数算是 SSH 的“路由器模式”把所有连接参数集中管理。建议新手一开始就用这个方式后面机器多了记不清哪个 IP 是干嘛的配置文件里加一行注释就全明白了。5. 安全加固与免密登录这一步值得做5.1 生成密钥对并部署公钥每次 SSH 都输密码连接多了也觉得烦更不用说密码容易被偷看。更靠谱的方式是密钥对认证。原理就是一对钥匙私钥留在宿主机上公钥放到虚拟机的~/.ssh/authorized_keys文件里。连接时客户端用私钥签名服务端用公钥验证全程不需要输密码。生成密钥对用 ssh-keygenssh-keygen -t rsa -b 4096 -C your_comment执行之后会让你选存放路径默认在~/.ssh/id_rsa也可以指定文件名。然后设置 passphrase这个相当于密钥的解锁密码。如果你追求完全免密直接回车跳过。但我建议设一个信息安全别太放松。把公钥部署到虚拟机上的办法有很多最推荐的是 ssh-copy-id 工具ssh-copy-id -i ~/.ssh/id_rsa.pub test192.168.200.130这个命令会要求输入一次虚拟机密码然后把公钥追加到虚拟机的~/.ssh/authorized_keys。之后再用ssh test192.168.200.130就直接进去了不再要密码。如果你用 Windows 没有 ssh-copy-id 命令可以手动操作把公钥内容整行复制然后在虚拟机里执行mkdir -p ~/.ssh chmod 700 ~/.ssh echo 粘贴的公钥内容 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys权限这步不能省OpenSSH 对 authorized_keys 的权限有严格要求权限太宽松反而会被拒绝认证。5.2 调整 sshd_config 提升安全性公钥部署成功之后可以考虑关掉密码登录把不安全的认证方式拒之门外。编辑虚拟机的/etc/ssh/sshd_config修改这几个参数sudo vim /etc/ssh/sshd_configPermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes改完重启 sshdsudo systemctl restart ssh这里有个特别容易踩的坑如果你把密码登录关了但公钥部署那一步没做对下一次连接就会被拒。所以一定先保证密钥登录能正常进入再改配置文件。我就干过这种蠢事连不上虚拟机只能回控制台窗口里把配置改回去折腾二十分钟。5.3 修改默认端口的是与非把 SSH 从 22 端口改到其他端口比如 2222看起来更安全但实际上防的只是扫描脚本。对真正的针对性攻击改端口意义不大。更重要的还是密钥认证、禁止 root 登录、以及定期更新系统。如果你确实要改改完记得放行新端口的防火墙规则并且宿主机连接时加-p 2222参数或写到 SSH config 里。每次改完 sshd 配置都建议先检查配置语法sudo sshd -t没问题再重启服务。这条命令帮我避免过很多次把服务改崩的尴尬值得养成习惯。6. 连接失败排查实录从底层到应用层逐层剥茧6.1 虚拟机能 ping 通但 SSH 连不上这是最常见的场景链路是通的但 SSH 在报错。先用第 3 节的办法看端口是否监听再确认服务状态。如果都正常试一下从宿主机直接连虚拟机的 IP 和端口组合ssh -v test192.168.200.130加-v参数会输出详细调试信息你能看到卡在哪一步。常见的情况有卡在Connection timed out—— 说明防火墙把端口拦了卡在Permission denied—— 认证失败密钥或密码不对提示Host key verification failed—— 虚拟机的指纹变了宿主机 known_hosts 里的旧记录要清理。6.2 完全 ping 不通虚拟机链路都不通先检查虚拟机的网络连接状态。VMware 里虚拟机右下角的网卡图标如果显示断开或者虚拟机网络适配器没有勾选“已连接”那就是这个原因。VirtualBox 也有类似设置在“设备 → 网络 → 网卡”里勾选启用。再检查虚拟机内部确认网卡有没有拿到 IP。执行ip addr如果只有lo没有eth0说明网卡没启用用sudo ip link set eth0 up或sudo dhclient eth0试试。Ubuntu 新版用的 netplan 配置也需要确认 yaml 文件里的dhcp4: true写对了。6.3 常见问题速查表现象可能原因解决思路连接超时防火墙挡端口 / 网络模式不对放行 22/tcp检查 NAT 模式连接被拒绝sshd 未启动 / 端口被改systemctl 启动 ssh确认监听端口认证失败密码错 / 密钥未部署 / 权限错检查密码重新部署公钥确认 .ssh 权限Host key 警告虚拟机重装或指纹变化删除 known_hosts 对应记录后重连卡在 SSH 黑屏SSH 服务繁忙或会话挂起重启 sshd或等待几秒重连这块没有太高深的内容但你要是了解 TCP 三次握手和 SSH 协议的分层排查起来就快得多。链路上不通先看网络配置TCP 层不通先看防火墙和监听状态应用层认证失败再看密钥和密码。从底层往上摸基本几分钟就能定位。6.4 一条命令提高排障效率组合拳排查排查连不上的问题时我习惯一条命令同时确认多个状态ping -c 3 192.168.200.130 nc -vz 192.168.200.130 22 ssh test192.168.200.130ping检查 ICMP 链路nc -vz检查 TCP 端口最后 SSH 登录。哪一步失败就把范围缩小到哪一层。nc在 Windows 上可能没装可以用 PowerShell 的Test-NetConnection替代Test-NetConnection 192.168.200.130 -Port 22这个命令会返回 TcpTestSucceeded 字段True就代表端口通。两个命令组合下来基本能覆盖绝大多数排障需求。7. 连接成功之后的效率拉满文件传输与会话管理7.1 用 scp 传文件比拖拽更可靠SSH 连通之后顺手用scp传文件比你在虚拟机的图形界面里拖拽省事得多。把本地文件传到虚拟机scp /home/local/file.txt test192.168.200.130:/home/test/从虚拟机下载文件到宿主机scp test192.168.200.130:/home/test/log.txt /home/local/scp 走的就是 SSH 通道天然加密比传统的 FTP 安全一个量级。如果你经常传输目录加-r参数递归操作。传大文件时建议用rsync替代 scp支持断点续传和增量同步体验好很多。7.2 借助 SSH 配置文件统一管理多台虚拟机如果你手头有 Ubuntu、CentOS、Debian 好几台虚拟机SSH config 的威力就出来了。每个虚拟机一段配置起一个好记的别名Host vm-ubuntu HostName 192.168.200.130 User test IdentityFile ~/.ssh/id_rsa Host vm-centos HostName 192.168.200.131 User admin IdentityFile ~/.ssh/id_rsa_centos用别名连接时还能自动加载对应的私钥不用每次指定。这个方法在很多真实工作场景里同样适用管理云服务器、跳板机、内网机器都能用同一套思路。7.3 会话保持与断线恢复虚拟机里跑长任务时终端突然断开会让人抓狂。SSH 的默认会话本质上是一对一的断开就没了。想更好地管理会话可以给 SSH 配置增加心跳保持在宿主机~/.ssh/config里加ServerAliveInterval 30 ServerAliveCountMax 3这个配置逻辑是每隔 30 秒发一个维持心跳连续 3 次失败才断开能有效避免 NAT 超时导致连接被掐断。如果需要更完整的断线恢复能力可以考虑 tmux 或 screen把会话挂在虚拟机上终端关了重启后还能回到同一个会话现场。8. 实操心得一套更稳妥的习惯我在虚拟机 SSH 上踩坑踩了不少总结下来最值得养成的习惯有三个一是每次改完 sshd 配置先跑sshd -t验证语法二是连不上时从底层到应用层按顺序排查别跳过链路检测直接看配置三是公钥部署成功之前绝对不要关掉密码认证。能做到这三条SSH 远程连接虚拟机这条路就算真正走稳了。还有个小技巧每次你换一个虚拟机网络环境或者宿主机 IP 变化之后先检查虚拟机的 IP 是否跟着变了。DHCP 分配地址不稳定是常事最好给虚拟机配置一个固定 IP或者通过 MAC 绑定保证地址不变。否则昨天还能用ssh vm-ubuntu连接今天突然连不上大概率就是 IP 变了。这篇文章到这儿连接虚拟机的整套流程咱们已经走了一遍从网络模式选型、SSH 服务端部署、宿主机连接实操到免密登录和故障排查每一步都能落地。自己动手配一遍比看十篇教程都管用遇到问题就去查日志、看状态、按层排查SSH 这个东西并不玄你摸清它的脾性之后会发现它在运维和开发里都是一个非常可靠的老伙伴。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑