VMware虚拟机远程连接实战:NAT模式配置与SSH工具详解
2026/8/24 6:33:44 网站建设 项目流程

1. 项目概述:为什么我们需要远程连接VMware虚拟机?

如果你和我一样,经常在本地电脑上用VMware Workstation跑Linux虚拟机做开发、测试或者学习,那你肯定遇到过这个场景:在VMware窗口里操作,屏幕小、复制粘贴不方便,尤其是想同时开多个终端或者编辑代码时,感觉特别局促。直接在虚拟机里装图形界面又笨重,消耗资源。这时候,一个稳定、高效的远程连接方案就成了刚需。

简单来说,“远程连接VMware中Linux虚拟机”这个事,核心就是摆脱VMware自带的那个“窗口”的束缚,让我们能像操作一台真正的、放在别处的Linux服务器一样,通过专业的终端工具(比如FinalShell、Xshell,或者VSCode的Remote-SSH插件)来连接它。这样做的好处太多了:你可以获得全屏的终端体验,轻松实现本地与虚拟机之间的文件拖拽传输,还能利用现代IDE的强大功能进行远程开发,效率提升不是一点半点。

这个需求看似简单,但新手常会卡在几个关键环节:虚拟机的网络怎么配才能让宿主机找到它?SSH服务怎么安装和启动?防火墙规则怎么设置?连接工具怎么选、怎么配?别担心,接下来我会结合我多年的运维和开发经验,把这些坑一个个填平,带你从零搭建一个既稳定又高效的远程连接环境。无论你是刚接触Linux的新手,还是想优化现有工作流的老手,这篇内容都能给你提供可直接“抄作业”的详细步骤和避坑指南。

2. 核心思路与网络模式选型

远程连接的本质是网络通信。因此,第一步也是最重要的一步,就是为你的VMware Linux虚拟机选择一个正确的网络模式。VMware提供了几种网络模式,选错了可能宿主机根本找不到虚拟机,连接也就无从谈起。

2.1 主流网络模式深度解析

VMware Workstation/Player 主要提供三种网络模式,我们需要深入理解其原理和适用场景。

桥接模式 (Bridged Networking)这是最像真实物理机的模式。在这种模式下,虚拟机会通过你宿主机的物理网卡,直接连接到你的局域网(比如你家或公司的路由器)。虚拟机会从局域网的DHCP服务器(通常是你的路由器)那里获取一个IP地址,这个地址和你的宿主机、你的手机、你的其他电脑都在同一个网段。

  • 工作原理:VMware会在宿主机上创建一个虚拟的网桥,将虚拟机的虚拟网卡和宿主机的物理网卡“桥接”起来。对路由器而言,虚拟机就是一台新加入网络的独立设备。
  • 优点:虚拟机与宿主机、局域网内其他设备完全平等,可以互相访问,也能直接上互联网。配置简单直观,IP地址稳定(如果路由器DHCP分配固定IP的话)。
  • 缺点:需要局域网环境支持。在一些严格管控的公司网络或公共Wi-Fi下,可能因为MAC地址过滤或网络策略导致虚拟机无法获取IP。同时,它“暴露”在局域网中,安全性需要考虑。
  • 适用场景:家庭网络、可控的内部开发网络,或者你需要虚拟机被局域网内其他设备(如另一台电脑、手机)直接访问的情况。

NAT模式 (Network Address Translation)这是VMware默认推荐,也是我个人最常用的模式。NAT模式下,VMware会在宿主机内部虚拟出一个私有的NAT网络(通常是192.168.xxx.0/24网段)。虚拟机在这个私有网络内,并通过宿主机的IP地址“共享上网”。

  • 工作原理:宿主机扮演了路由器的角色。虚拟机发出的网络请求,会经过宿主机的NAT服务进行地址转换,然后以宿主机的名义发出去。外部网络看到的源头是宿主机,而不知道虚拟机的存在。
  • 优点对宿主机友好。虚拟机可以无障碍上网,但宿主机所在的局域网却看不到虚拟机,形成了一个天然的隔离层。非常适合在笔记本上移动办公,无论连接到哪个网络,虚拟机的网络配置都无需更改。配置也极为简单。
  • 缺点:默认情况下,局域网内的其他设备无法直接访问NAT模式下的虚拟机,因为它在宿主机“背后”。不过,我们可以通过端口转发来解决这个问题,这也是我们远程连接的关键步骤。
  • 适用场景:绝大多数个人开发、学习场景。你只需要宿主机能上网,虚拟机就能上网,且网络环境切换无感。

仅主机模式 (Host-Only Networking)这种模式创建了一个完全封闭的网络,只包含宿主机和虚拟机。虚拟机之间可以互通,也可以与宿主机通信,但完全不能访问外部互联网

  • 工作原理:VMware会为宿主机创建一个虚拟网卡(如VMnet1),并赋予其一个IP(如192.168.1.1)。所有使用Host-Only网络的虚拟机,都会连接到这个虚拟网络,并获取同网段的IP。
  • 优点:绝对的安全隔离,适合进行纯内网测试、网络攻防实验或需要完全断网的环境。
  • 缺点:无法上网,安装软件、更新系统需要事先下载好包,或者通过宿主机共享。
  • 适用场景:安全测试、模拟隔离网络、不需要互联网的特定实验环境。

2.2 模式选择与决策建议

对于“远程连接”这个目标,NAT模式是平衡了便利性、安全性和功能性的最佳选择。它保证了虚拟机上网的便捷,同时我们只需要在宿主机和虚拟机之间打通一条SSH通道即可,无需惊动整个局域网。

注意:如果你选择桥接模式,请确保你的网络环境允许新设备加入,并且你知道如何查看虚拟机获取到的IP地址(通常用ip addrifconfig命令)。如果选择NAT模式,我们接下来的所有配置都将基于此展开。

这里有一个快速决策表:

网络模式虚拟机能否上网?宿主机能否访问虚拟机?局域网其他设备能否访问虚拟机?配置复杂度推荐场景
桥接 (Bridged)虚拟机需作为独立服务器被局域网访问
NAT是(需端口转发)否(默认)低(推荐)个人开发、学习,远程连接首选
仅主机 (Host-Only)纯内网、安全测试、断网环境

实操心得:我90%的时间使用NAT模式。它的优势在于“移动性”。今天在家连Wi-Fi,明天到公司插网线,虚拟机的网络配置完全不用动,宿主机换网络对它没影响。只需要在VMware里配好端口转发,远程连接就能一直稳定工作。

3. 虚拟机侧核心配置详解

选定NAT模式后,我们需要在Linux虚拟机内部进行一系列配置,让它准备好接受SSH连接。这个过程就像给房子装上门和锁,并告诉别人门牌号。

3.1 确保网络连通性与获取IP地址

首先,启动你的Linux虚拟机(以Ubuntu/CentOS等常见发行版为例),打开终端。

  1. 检查网络接口与IP:使用ip addr命令。你会看到类似ens33eth0的网络接口。找到inet后面跟着的IP地址,它应该属于192.168.xxx.xxx这样的私有地址段。记下这个IP,比如192.168.137.128。这就是虚拟机在NAT网络内的“门牌号”。

    ip addr show # 或者使用老命令(如果系统有) ifconfig
  2. 测试网络连通性

    • 测试宿主机通信:尝试ping你的宿主机在NAT网络中的网关。通常这个网关地址是你的宿主机虚拟网卡(VMnet8)的IP,一般是192.168.xxx.1192.168.xxx.2。用ping -c 4 192.168.137.1测试。
    • 测试外网ping -c 4 8.8.8.8ping -c 4 www.baidu.com。如果能通,说明虚拟机上网没问题。

注意:如果ip addr显示没有inet地址,或者网络不通,首先检查VMware虚拟网络编辑器(编辑->虚拟网络编辑器),确保NAT模式(通常是VMnet8)是启用状态,并且子网IP范围合理。其次,在虚拟机设置里确认网卡已连接并选择了NAT模式。最后,在Linux内尝试重启网络服务:sudo systemctl restart networking(Debian/Ubuntu) 或sudo systemctl restart NetworkManager(RHEL/CentOS 8+)。

3.2 安装与配置SSH服务

SSH(Secure Shell)是我们远程连接的协议。大多数Linux服务器版默认安装了SSH客户端(ssh)和服务端(sshd),但桌面版可能没有。

  1. 安装OpenSSH服务端

    • Debian/Ubuntu:
      sudo apt update sudo apt install openssh-server -y
    • RHEL/CentOS/Fedora:
      sudo yum install openssh-server -y # 或者使用 dnf (新版本) sudo dnf install openssh-server -y
  2. 启动并设置开机自启SSH服务

    sudo systemctl start ssh # Ubuntu/Debian 服务名可能是 ssh sudo systemctl start sshd # RHEL/CentOS 服务名通常是 sshd # 设置开机自启 sudo systemctl enable ssh # 或 sshd

    可以通过sudo systemctl status ssh来检查服务是否正常运行。

  3. (可选但推荐)配置SSH以增强安全性与体验: 编辑SSH服务端配置文件/etc/ssh/sshd_config。使用sudo vim /etc/ssh/sshd_configsudo nano /etc/ssh/sshd_config

    • 修改默认端口(可选):找到#Port 22,去掉注释#,将22改为一个大于1024的端口,如Port 2222。这可以避免一些简单的自动化攻击扫描。
    • 禁止root用户直接登录(强烈推荐):找到#PermitRootLogin yes,改为PermitRootLogin no。这能极大提升安全性,日常使用普通用户登录,再用sudo提权。
    • 启用公钥认证(推荐):确保PubkeyAuthentication yes是启用的。这是我们后续使用密钥登录的基础。
    • 保持连接活跃:添加或修改以下两行,防止连接因超时断开:
      ClientAliveInterval 60 ClientAliveCountMax 3

    修改后,保存文件并重启SSH服务使配置生效:

    sudo systemctl restart ssh # 或 sshd

3.3 配置系统防火墙(如果启用)

如果你的Linux发行版默认开启了防火墙(如Ubuntu的ufw,CentOS的firewalld),你需要放行SSH端口。

  • Ubuntu (使用ufw):

    sudo ufw allow 22/tcp # 如果你改了SSH端口,比如2222,则用 sudo ufw allow 2222/tcp sudo ufw enable # 如果还没启用UFW,这条命令会启用它并设置规则 sudo ufw status verbose # 查看规则状态
  • RHEL/CentOS (使用firewalld):

    sudo firewall-cmd --permanent --add-service=ssh # 默认端口22 # 如果改了端口,比如2222,则需要添加端口 # sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload # 重载配置 sudo firewall-cmd --list-all # 查看所有规则

实操心得:对于个人开发环境,我有时会暂时关闭防火墙以排除网络问题(sudo systemctl stop firewalldsudo ufw disable),但在配置稳定后,建议还是开启并只开放必要的端口,这是一个好习惯。另外,修改SSH端口后,一定要记得同步修改防火墙规则和后续VMware的端口转发设置。

4. 宿主机侧关键配置:VMware端口转发

这是连接NAT模式虚拟机的“魔法”步骤。因为虚拟机在宿主的私有网络里,外部的SSH客户端(如FinalShell)默认是找不到它的。端口转发的作用,就是在宿主机的某个端口(比如2222)和虚拟机的SSH端口(比如22)之间建立一条隧道。

  1. 打开VMware虚拟网络编辑器: 在VMware Workstation菜单栏,点击编辑->虚拟网络编辑器。你需要有管理员权限,可能会提示输入密码或点击“更改设置”。

  2. 选择NAT网络并设置端口转发

    • 在列表中选择VMnet8(通常对应NAT模式),点击右下角的NAT设置...按钮。
    • 在弹出的窗口中,点击添加...按钮。
  3. 填写端口转发规则

    • 主机端口:这是宿主机上对外开放的端口。你可以选择一个未被占用的高端口号,例如2222。这意味着你将在SSH客户端里连接localhost:2222
    • 类型:选择TCP
    • 虚拟机IP地址:填入你在虚拟机里用ip addr查到的那个IP地址,例如192.168.137.128
    • 虚拟机端口:填入虚拟机SSH服务监听的端口,如果你没改过SSH配置,就是22;如果改了,比如改成了2222,这里就填2222
    • 描述:可以写个备注,如SSH to Ubuntu VM

    点击确定保存所有设置。

原理剖析:完成这个配置后,当你在宿主机上向127.0.0.1:2222发起连接时,VMware的NAT服务会拦截这个请求,并将其转发到192.168.137.128:22,也就是你的虚拟机。这样,SSH客户端就通过宿主机这个“中介”,成功连接到了内部的虚拟机。

重要提示:虚拟机的IP地址如果是通过DHCP动态获取的,重启后可能会变化。一旦IP变化,端口转发规则就失效了。因此,我强烈建议在虚拟机内将IP设置为静态。具体方法因发行版而异(通常是修改/etc/netplan/*.yaml(Ubuntu 18.04+) 或/etc/sysconfig/network-scripts/ifcfg-ens33(CentOS 7)),你可以搜索“你的发行版名 设置静态IP NAT”来找到详细教程。设置静态IP能保证连接的长久稳定。

5. 远程连接工具实战与对比

一切准备就绪,现在可以挑选顺手的“兵器”来连接了。这里我重点介绍两款最常用、体验最好的工具:FinalShell和VSCode Remote-SSH。

5.1 FinalShell:一站式终端与SFTP解决方案

FinalShell是一款国产的、功能强大的SSH客户端,集成了终端、SFTP文件传输、服务器监控于一体,对中文用户非常友好。

  1. 下载与安装: 从其官网下载对应操作系统的安装包。安装过程很简单,一路下一步即可。

  2. 创建SSH连接

    • 打开FinalShell,点击左上角的文件夹图标(“连接管理器”),然后点击窗口左上角的“新建”按钮(一个小电脑带加号)。
    • 在弹出的窗口中:
      • 名称:给你这个连接起个名字,如“Ubuntu-Dev”。
      • 主机:填写127.0.0.1localhost。因为我们在宿主机上连接,且配置了端口转发到本机。
      • 端口:填写你在VMware中设置的主机端口,例如2222
      • 用户名:填写虚拟机中你的登录用户名。
      • 密码:可以先不填,连接时输入。更推荐使用“密钥”方式(后面会讲)。
    • 点击“确定”保存。
  3. 发起连接与文件传输

    • 在连接管理器里双击你刚创建的连接。
    • 首次连接会提示保存主机密钥,点击“接受并保存”。
    • 输入用户密码,即可进入熟悉的终端界面。
    • 文件传输:FinalShell界面下方默认有SFTP面板,直接以图形化方式浏览虚拟机文件系统,拖拽即可上传下载文件,极其方便。

FinalShell的优点

  • 界面直观,功能集成度高(终端、SFTP、监控一体)。
  • 服务器资源监控(CPU、内存、网络)很直观。
  • 命令自动补全、历史记录管理做得不错。
  • 对于需要频繁进行文件交互的操作,效率极高。

5.2 VSCode Remote-SSH:无缝远程开发体验

如果你主要进行代码开发,那么VSCode的Remote-SSH扩展绝对是“神器”。它让你感觉像是在本地开发一样,却能使用远程虚拟机的所有环境。

  1. 安装扩展: 在VSCode的扩展商店中搜索并安装Remote - SSH扩展(由Microsoft发布)。

  2. 配置连接

    • 安装后,VSCode左侧活动栏会出现一个远程资源管理器图标。
    • 点击它,在“SSH TARGETS”旁边点击加号(+)。
    • 在弹出的命令框中输入连接命令:ssh username@127.0.0.1 -p 2222。这里的username是你的虚拟机用户名,2222是宿主机转发端口。
    • 按回车,VSCode会生成一个配置文件(通常在~/.ssh/config中),你可以选择保存位置(默认用户目录下的.ssh/config即可)。
    • 接下来,在SSH TARGETS列表里会出现你刚配置的主机,右键点击它,选择“在当前窗口中连接”或“在新窗口中连接”。
  3. 连接与开发

    • 首次连接会要求选择远程主机的平台(Linux),然后输入用户密码。
    • VSCode会在远程虚拟机上自动安装一个轻量级的服务端。完成后,整个VSCode的界面就变成了连接到远程虚拟机的状态。
    • 此时,你可以打开文件夹(就是虚拟机上的目录)、安装扩展(扩展可以安装在本地或远程)、运行终端(终端直接是远程虚拟机的Shell),编码、调试、运行一气呵成,体验与本地开发几乎无差。

VSCode Remote-SSH的优点

  • 开发体验无缝,直接使用远程环境,避免本地与远程环境不一致的问题。
  • 可以方便地使用远程的计算资源(如GPU、大内存)进行开发调试。
  • 所有操作(git、调试、插件)都在远程上下文完成,非常干净。

工具选择建议

  • 日常运维、服务器管理、需要看实时监控:选FinalShell
  • 专注于写代码、项目开发:选VSCode Remote-SSH
  • 我个人的工作流是两者结合:用VSCode Remote-SSH进行日常编码和调试,当需要深度系统排查、看实时性能或者快速传文件时,就用FinalShell。

5.3 进阶:配置SSH密钥登录(免密码)

每次连接都要输密码太麻烦,也不够安全(容易被暴力破解)。配置SSH密钥对,可以实现免密且更安全的登录。

  1. 在宿主机生成密钥对(如果你用FinalShell,它自带生成工具;这里以命令行通用方法为例): 在宿主机(Windows可用Git Bash,macOS/Linux直接用终端)执行:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    一路回车,使用默认路径(~/.ssh/id_rsa)和空密码(如需更高安全可设密码)。完成后会在~/.ssh/目录下生成两个文件:id_rsa(私钥,绝不能泄露)和id_rsa.pub(公钥)。

  2. 将公钥上传到虚拟机

    ssh-copy-id -p 2222 username@127.0.0.1

    输入一次密码,公钥就会自动追加到虚拟机对应用户的~/.ssh/authorized_keys文件中。如果ssh-copy-id不可用,可以手动复制公钥内容,然后登录虚拟机,粘贴到~/.ssh/authorized_keys文件末尾(需要创建.ssh目录并设置权限)。

  3. 修改虚拟机SSH配置以启用密钥认证(如果之前没做): 确保/etc/ssh/sshd_config中有PubkeyAuthentication yes。然后重启SSH服务。

  4. 测试免密登录

    ssh -p 2222 username@127.0.0.1

    现在应该可以直接登录,无需密码。

  5. 在FinalShell或VSCode中使用密钥

    • FinalShell:在新建或编辑连接时,在“认证”方式里选择“密钥”,然后浏览选择你生成的私钥文件(id_rsa)。
    • VSCode Remote-SSH:它默认会使用宿主机~/.ssh/下的密钥,如果密钥路径和名称是标准的,通常会自动识别。如果不行,可以在~/.ssh/config文件中为该主机指定密钥路径:
      Host myvm HostName 127.0.0.1 User username Port 2222 IdentityFile ~/.ssh/id_rsa

实操心得:务必保护好你的私钥文件(id_rsa),它相当于你的“数字身份证”。建议为私钥设置一个强密码(在ssh-keygen时输入),这样即使私钥文件泄露,没有密码也无法使用。虽然每次连接需要输入密钥密码,但可以通过SSH-Agent来管理,实现一次输入,多次使用。

6. 常见问题排查与实战技巧

即使按照步骤操作,你也可能会遇到一些问题。这里我整理了最常见的几种情况及其解决方法。

6.1 连接超时或拒绝连接

这是最常见的问题,通常意味着网络路径没通。

  • 症状Connection timed outConnection refused
  • 排查思路(从内到外)
    1. 虚拟机内SSH服务状态:在虚拟机内执行sudo systemctl status ssh,确保服务是active (running)
    2. 虚拟机内防火墙:检查UFW或firewalld是否放行了SSH端口。可以暂时关闭防火墙测试:sudo ufw disablesudo systemctl stop firewalld
    3. 虚拟机IP是否变化:在虚拟机内再次运行ip addr,确认IP地址和你在VMware端口转发规则里设置的是否一致。如果变了,要么修改端口转发规则,要么去设置静态IP。
    4. VMware端口转发规则:仔细检查虚拟网络编辑器中的NAT设置,确认主机端口、虚拟机IP、虚拟机端口填写无误。可以尝试删除规则重新添加。
    5. 宿主机防火墙Windows用户特别注意!Windows Defender防火墙或第三方安全软件可能会阻止VMware的入站连接。你需要为VMware的相关进程(如vmware-authd.exe,vmware-hostd.exe)或直接为你的主机端口(如2222)在Windows防火墙中添加入站规则,允许TCP连接。
    6. 端口占用:在宿主机上使用netstat -ano | findstr :2222(Windows) 或lsof -i:2222(macOS/Linux) 检查你设置的“主机端口”是否已被其他程序占用。如果占用,换一个端口。

6.2 连接成功但提示“密码错误”或“权限被拒绝”

  • 症状:能连上,但认证失败。
  • 排查
    1. 确认用户名和密码:Linux系统大小写敏感,确认用户名和密码无误。可以在虚拟机本地登录测试。
    2. 检查SSH配置:确认/etc/ssh/sshd_configPasswordAuthentication是否为yes(如果使用密码登录)。修改后需重启SSH服务。
    3. 检查用户目录权限:如果使用密钥登录失败,检查虚拟机上对应用户的~/.ssh目录权限必须是700~/.ssh/authorized_keys文件权限必须是600
      chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
    4. SELinux(仅限RHEL/CentOS):SELinux可能会阻止SSH访问某些文件。可以尝试临时禁用SELinux测试:sudo setenforce 0。如果问题解决,需要调整SELinux策略或永久禁用(不推荐生产环境)。

6.3 连接缓慢或卡顿

  • 症状:输入命令后响应慢,或者登录过程卡住很久。
  • 可能原因与解决
    1. DNS反向解析:SSH服务端默认会尝试解析客户端的IP地址为主机名,如果DNS服务器响应慢或不可达,就会造成延迟。在虚拟机SSH配置文件中(/etc/ssh/sshd_config)添加或修改:
      UseDNS no
      然后重启SSH服务。
    2. GSSAPI认证:同样可能导致延迟。可以禁用:
      GSSAPIAuthentication no
    3. 网络模式问题:NAT模式在数据包转发时会有轻微开销,但对于本地连接,影响微乎其微。如果卡顿严重,检查宿主机和虚拟机的资源(CPU、内存)占用是否过高。

6.4 文件传输问题(使用FinalShell SFTP或scp命令)

  • 症状:SFTP连接失败,或传输文件权限错误。
  • 排查
    1. 确保SSH连接本身正常:SFTP是SSH的一个子系统,SSH能连上,SFTP通常没问题。
    2. 检查磁盘空间:虚拟机磁盘空间不足会导致传输失败。用df -h命令检查。
    3. 权限问题:你登录的用户是否有权写入目标目录?尝试传输到用户家目录(~)下。

6.5 高级技巧:使用Hosts映射简化连接

如果你觉得每次都要记127.0.0.1:2222很麻烦,可以在宿主机的hosts文件里加个映射。

  • Windows:编辑C:\Windows\System32\drivers\etc\hosts(需要管理员权限)。
  • macOS/Linux:编辑/etc/hosts。 在文件末尾添加一行:
127.0.0.1 myubuntu-vm

保存后,你就可以在FinalShell或SSH命令中用myubuntu-vm代替127.0.0.1了。注意,端口号仍需指定:ssh user@myubuntu-vm -p 2222

我个人习惯是为每个虚拟机在hosts文件中设置一个别名,并在FinalShell或VSCode的SSH配置中使用这个别名,这样管理多个虚拟机时非常清晰,不用再记IP和端口。这套组合拳下来,从虚拟机网络配置到远程连接优化,基本覆盖了你会遇到的所有核心场景和坑点。关键在于理解每一步背后的原理,这样无论遇到什么问题,你都能自己分析和解决。

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

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

立即咨询