NAT模式虚拟机端口转发配置详解:宿主机轻松访问VM的SSH与HTTP服务

NAT模式虚拟机端口转发配置详解:宿主机轻松访问VM的SSH与HTTP服务 开头直接切题把我这几年玩虚拟机的经验倒出来。NAT 模式下的端口转发是我在 VMware 和 VirtualBox 之间来回折腾时最常被问到的问题之一宿主机到底怎么访问 VM 里的 SSH 和 HTTP 服务很多人第一步就卡住了——虚拟机装好了网也通了但宿主机就是连不上 VM 里的 Nginx 和 sshd。这篇文章我就从 NAT 网络的底层逻辑讲起把端口转发的原理、配置步骤、不同虚拟机软件的差异以及我踩过的坑一次性说清楚。如果你正在用 NAT 模式跑虚拟机并且需要在宿主机上通过 SSH 远程登录 VM或者用浏览器访问 VM 里的 Web 服务这篇文章就是为你准备的。VMware Workstation、VirtualBox、Hyper-V 我都实测过不同方案各有利弊我会把最稳的做法逐一拆开讲。1. 先搞懂 NAT 模式下宿主机和 VM 之间的网络关系1.1 NAT 网络的核心组件和默认行为很多人对 NAT 的理解就停留在“虚拟机可以上网”但宿主机访问 VM 时为什么时通时不通完全不清楚。其实 NAT 模式在宿主机上模拟了一整套小型局域网它包含三个核心组件虚拟网卡、虚拟 DHCP 服务器、虚拟 NAT 网关。以 VMware Workstation 为例安装完成后宿主机上会出现一张 VMnet8 虚拟网卡这张网卡的 IP 通常是 192.168.x.1。VM 内的虚拟机则通过虚拟 DHCP 获取到同网段的 IP比如 192.168.x.128。虚拟 NAT 网关的 IP 一般是 192.168.x.2负责把 VM 的流量代理到宿主机物理网卡再转发到外网。这里有个关键区别VMware 的 NAT 模式下宿主机和 VM 之间是天然可达的。因为宿主机拥有 VMnet8 这张虚拟网卡的 IP它本身就处在 192.168.x.0/24 这个网段里所以你可以直接 ssh root192.168.x.128 访问 VM。但 VirtualBox 默认的 NAT 模式不一样它没有一张宿主机侧的虚拟网卡VM 的 10.0.2.15 对宿主机来说根本不可路由所以必须通过端口转发才能访问。1.2 为什么要用端口转发而不是切换桥接模式遇到“宿主机访问不了 VM”的情况很多人第一反应是切到桥接模式这确实能解决一部分问题但代价很大。桥接模式下VM 会直接出现在宿主机所在的物理局域网中由路由器分配 IP。这样做的问题有三个第一VM 的 IP 取决于路由器 DHCP 的分配结果你每次换网络环境比如从公司到家、从有线切到 WiFiVM 的 IP 都可能会变第二VM 直接暴露在物理局域网里意味着同一个网络下的其他设备也能访问 VM 上跑的服务安全边界直接变大第三如果局域网里 IP 冲突VM 网络会直接瘫痪影响面不可控。相比之下NAT 模式加端口转发的组合要干净得多。VM 被隔离在私有网段里默认情况下外部设备根本无法触达 VM。宿主机通过端口转发把某个具体端口映射到 VM 的特定端口等于给外部只开了一个小窗口其他服务全部隐藏在 NAT 后面。例如我只想暴露 SSH 的 22 端口就只映射 2222 到 VM 的 22其他端口一概不通这比桥接模式安全得多。2. 端口转发前必备检查SSH/HTTP 服务是否真的在跑2.1 确认 VM 里 SSH 服务状态端口转发配置好后连不上我见过最多的原因不是转发规则写错而是 VM 里的服务压根没起来。所以无论你用什么虚拟机软件第一步永远是确认 VM 内的 SSH 服务在正常运行。在 VM 的终端里执行下面的命令systemctl status sshd如果没有安装 SSH 服务先用包管理器装一下# CentOS/RHEL 系 sudo dnf install -y openssh-server sudo systemctl enable --now sshd # Ubuntu/Debian 系 sudo apt update sudo apt install -y openssh-server sudo systemctl enable --now ssh然后确认 sshd 在监听 22 端口ss -lntp | grep :22如果看到0.0.0.0:22或*:22之类的输出说明 SSH 服务已经对所有网卡开放监听。这里要特别注意如果 sshd 只监听了 127.0.0.1:22那端口转发配了也白配因为流量从宿主机进来会被 SSH 服务拒绝需要改/etc/ssh/sshd_config里的ListenAddress。2.2 确认 HTTP 服务监听地址HTTP 服务同样需要确认监听地址。很多教程默认你已经跑起了 Nginx 或 Apache实际上很多人是用npm run dev起的开发服务器默认只监听 127.0.0.1这种情况下端口转发就是不通的。用下面的命令检查监听端口ss -lntp | grep :80如果看到127.0.0.1:80说明只监听回环地址需要把监听地址改成0.0.0.0:80。不同服务改法不一样Nginx/etc/nginx/nginx.conf里的listen 80;就表示所有地址但如果你写了listen 127.0.0.1:80;要改成listen 80;Apache改/etc/apache2/ports.conf里的Listen 80开发服务器如 Flask、Node.js启动参数里加--host 0.0.0.0或设置HOST0.0.0.0这个检查往往被忽略但它是最常见的“配置正确但不生效”的根因之一。2.3 确认 VM 内部防火墙没有拦截在 Linux 虚拟机里防火墙默认通常是开着的而且很多人装完系统后根本不知道。如果 SSH 和 HTTP 服务都在监听但宿主机还是连不上防火墙就是你第二个排查对象。# 查看当前防火墙状态 sudo systemctl status firewalld # 或 sudo ufw status # 查看已放行的端口 sudo firewall-cmd --list-all如果防火墙开着需要放行相应端口# firewalldCentOS/RHEL sudo firewall-cmd --add-port22/tcp --permanent sudo firewall-cmd --add-port80/tcp --permanent sudo firewall-cmd --reload # ufwUbuntu/Debian sudo ufw allow 22/tcp sudo ufw allow 80/tcp这步做完VM 内部的基本条件才算具备。我个人的习惯是先在 VM 本机用curl http://127.0.0.1测试一次再在 VM 本机用ssh localhost测试一次确保服务本身没问题再去搞端口转发这样排查范围就缩小到网络层。3. VirtualBox 端口转发配置GUI 和命令行两种方式3.1 图形界面配置步骤VirtualBox 默认的 NAT 模式下宿主机没有虚拟网卡所以必须配置端口转发。我先把最常用的 GUI 方式讲清楚这也是新手最不容易出错的路子。打开 VirtualBox 主界面选中目标虚拟机点“设置” - “网络”确认当前网卡连接方式选的是“NAT”。然后点击“高级”展开更多选项找到“端口转发”按钮。点进去之后会看到一个空的规则列表点右上角的加号添加规则。以最常见的 SSH 和 HTTP 转发为例配置如下名称协议主机 IP主机端口子系统 IP子系统端口SSHTCP127.0.0.1222210.0.2.1522HTTPTCP127.0.0.1808010.0.2.1580这里有几个细节值得注意主机 IP 一栏我建议填127.0.0.1而不是留空这样端口只对本机开放安全性更好。留空表示监听所有网卡接口如果你用的是笔记本电脑同一局域网下的其他人也可能访问到这个端口有安全隐患。子系统 IP 在默认 NAT 模式下基本固定是10.0.2.15这个地址是 VirtualBox 内置的 NAT 网关分配的固定地址不太会变。主机端口和子系统端口可以不一样这是端口转发的核心优势。比如 VM 里已经有东西占用 22 端口你想在宿主机上换个入口就可以用 2222 映射 22。配置完成后点确定然后启动虚拟机。如果 VM 已经启动需要重启虚拟机或禁用再启用网卡转发规则才会生效。3.2 VBoxManage 命令行配置方法如果虚拟机不止一台或者需要批量自动化部署GUI 方式就不太合适了。VirtualBox 提供了 VBoxManage 命令行工具可以精确管理端口转发规则。先查看当前的转发规则VBoxManage showvminfo 你的虚拟机名称 | grep -i NIC 1新增一条 SSH 转发规则命令如下VBoxManage modifyvm 你的虚拟机名称 \ --natpf1 SSH,tcp,127.0.0.1,2222,10.0.2.15,22这里natpf1中的1表示第一块网卡如果你的 VM 用的是第二块网卡做 NAT就改成natpf2。规则格式是名称,协议,主机IP,主机端口,子系统IP,子系统端口注意字段之间是英文逗号不要打错。再加一条 HTTP 转发规则VBoxManage modifyvm 你的虚拟机名称 \ --natpf1 HTTP,tcp,127.0.0.1,8080,10.0.2.15,80删除规则用--natpf1 delete 规则名VBoxManage modifyvm 你的虚拟机名称 --natpf1 delete SSH命令行方式的好处是方便写进脚本里我自己的开发环境就是这么管理的一个脚本自动创建 VM、配置网卡、添加转发规则、启动系统全程不用打开 VirtualBox 图形界面。建议在规则名称上用有含义的前缀比如dev-ssh、prod-http不然规则多了管理起来很头疼。3.3 配置后如何验证配置完成后在宿主机上执行一次 SSH 连接测试ssh -p 2222 root127.0.0.1HTTP 服务直接在浏览器里访问http://127.0.0.1:8080。如果页面能正常返回说明转发链路已经通了。要注意的是VirtualBox 的端口转发是在 NAT 引擎层面完成的它和 VM 内部 IP 是否变化没关系只要 VM 用的是默认 NAT10.0.2.15这个地址就是稳定的。这一点比 VMware 的 NAT 模式省心因为不需要关心 VM 的 DHCP 是否重新分配了地址。4. VMware 下宿主机直接访问与端口安全4.1 VMware NAT 模式默认的可达性VMware Workstation 的 NAT 模式和 VirtualBox 不一样宿主机天然就能访问 VM 的 IP。我之前用 VMware 装 CentOS 虚拟机宿主机可以直接ssh root192.168.154.128完全不需要配置端口转发。这背后的原因是 VMware 创建了 VMnet8 虚拟网卡宿主机拥有该网段的一个 IP因此与 VM 之间处于同一虚拟局域网。从效率上看VMware 这种设计确实更方便省去了端口转发配置的步骤。但它也有一个隐藏问题很多人没意识到宿主机能访问 VM意味着 VM 里跑的服务比如 SSH 的 22 端口、Nginx 的 80 端口只要监听了0.0.0.0宿主机上所有用户进程也都能访问。如果你在 VM 里起了个没设密码的数据库服务宿主机上一不小心就能连上这在实际开发环境里是有风险的。4.2 哪些场景下 VMware 也需要端口转发虽然 VMware 默认可达但有些场景下端口转发仍然是有意义的。场景一局域网其他机器要访问 VM 服务。NAT 模式下除了宿主机之外局域网其他设备都无法直接访问 VM 的 IP。如果临时想让同事连一下你的 VM可以用 VMware 的端口转发功能把 VM 的 SSH 端口映射到宿主机某端口然后告诉同事ssh -p 2222 user你的宿主机IP。场景二宿主机上需要固定端口访问多个 VM。假设你有三台 VM各自运行在不同 IP 上。直接用 IP 访问没问题但如果希望统一通过宿主机的 2222/2223/2224 端口分别进入三台 VM端口转发就是最干净的方案。场景三VM 的 IP 是 DHCP 分配的经常会变。通过端口转发绑定固定端口就不用每次 DHCP 变化后去查新 IP 了。VMware 配置端口转发的路径是编辑 - 虚拟网络编辑器选中 VMnet8NAT 模式点击“NAT 设置”然后在端口转发区域点添加。这里同样需要填宿主机端口、VM 的 IP 和端口。4.3 宿主机防火墙要放行的端口无论用哪种方式暴露端口宿主机防火墙始终是一个绕不开的环节。Windows 宿主机上如果 SSH 到虚拟机对应的宿主端口没反应多半是防火墙默认拦截了入站连接。以 Windows Defender 防火墙为例需要为指定端口添加入站规则# 以管理员身份运行 PowerShell netsh advfirewall firewall add rule nameVM-SSH-2222 dirin actionallow protocolTCP localport2222 netsh advfirewall firewall add rule nameVM-HTTP-8080 dirin actionallow protocolTCP localport8080如果你只在宿主机本机访问端口转发配置里主机 IP 填127.0.0.1就不会触发 Windows 防火墙的入站规则因为这个流量走的是回环接口。但如果你希望局域网其他机器也能通过宿主机端口访问 VM就必须添加上述防火墙规则。Linux 宿主机的情况类似放行端口用sudo firewall-cmd --add-port2222/tcp --permanent sudo firewall-cmd --add-port8080/tcp --permanent sudo firewall-cmd --reload这里有一个我踩过的坑VirtualBox 的端口转发是 NAT 引擎内部处理的不经过宿主机协议栈的入站路径所以 Windows 防火墙一般不会拦。但 VMware 的端口转发流量会经过宿主机的网络栈防火墙规则就必须配置正确。两种软件的差异容易让人混淆。5. Windows 宿主机不依赖虚拟化软件的直接端口代理方案5.1 netsh interface portproxy 使用详解除了在虚拟机软件里配置端口转发Windows 宿主机本身还提供了一个通用的端口代理功能netsh interface portproxy。它可以在宿主机层面把某个端口的流量直接转发到任意 IP 的任意端口不依赖你用的是 VMware 还是 VirtualBox。这个方案的前提是宿主机必须能直接访问目标 VM 的 IP。所以它适用于 VMware 的 NAT 模式宿主机可达 VM也适用于 VirtualBox 的仅主机模式或桥接模式但不适用于 VirtualBox 默认 NAT因为宿主机根本 ping 不通 10.0.2.15。用法很简单以管理员身份打开 PowerShell 或 CMD# 添加端口转发规则宿主机 2222 端口 - VM 的 22 端口 netsh interface portproxy add v4tov4 listenport2222 listenaddress127.0.0.1 connectport22 connectaddress192.168.154.128查看当前所有转发规则netsh interface portproxy show all删除某条规则netsh interface portproxy delete v4tov4 listenport2222 listenaddress127.0.0.1这个方案最大的好处是和虚拟机软件解耦。不管 VM 用的是 VMware 还是 VirtualBox 的桥接模式只要宿主机能直连 VM IP就能用同一套方式做端口代理。对于我这种同时跑多台虚拟机、多种虚拟化软件的人来说非常方便配置统一写在一个地方。5.2 防火墙放行与持久化设置配置完 netsh portproxy 后如果外部机器非本机要访问这个端口还需要在防火墙里放行对应端口方法和上一节讲的一样。如果是本机访问127.0.0.1:2222则不需要额外防火墙规则。需要提醒的是netsh portproxy 的规则是持久化的重启宿主机后依然存在。这个特性有好有坏好处是配置一次不用重复设置坏处是一段时间后你可能忘了自己配过哪些规则导致端口毫无预兆地被代理到某台 VM 上。建议每次配置完都用netsh interface portproxy show all查看一下当前规则心里有数。另外如果你把listenaddress设为0.0.0.0等于把 VM 的端口暴露给了局域网所有人除非确实需要否则建议只监听127.0.0.1。对安全敏感的场景还可以配合 Windows 防火墙的远程地址限制只允许特定 IP 访问。5.3 这个方案的适用与不适用场景用 netsh portproxy 做端口转发我建议这样用适用于以下场景VM 使用 VMware 的 NAT 模式宿主机已经能直连 VM IPVM 使用桥接模式或仅主机模式宿主机能访问 VM想把多台 VM 的同一服务端口比如都是 22映射到宿主机不同端口统一管理宿主机是 Windows Server没有安装完整图形界面的虚拟机管理工具不适用于以下场景VirtualBox 默认 NAT 模式未配置端口转发时宿主机不能直连 VM IP需要转发 UDP 服务netsh portproxy 只支持 TCP需要更细粒度的 ACL 控制这种情况建议直接用防火墙规则结合端口转发另外有两点要注意第一netsh portproxy 本身不支持 UDP如果你需要转发 DNS53/UDP之类的 UDP 服务就不能用这个方案得回到虚拟机软件自带的端口转发能力第二从 Windows 10 1709 之后的版本 netsh portproxy 仍然可用但如果系统环境受限也可以用 PowerShell 的New-NetNatStaticMapping来做 NAT 映射不过配置复杂一些一般用不到。6. 实战示例把 VM 的 SSH 和 HTTP 都暴露到宿主机6.1 一个完整的演示场景下面我结合一个实际场景走完整流程。假设我在 Windows 宿主机上用 VirtualBox 跑了一个 CentOS 7 虚拟机需求是在宿主机上通过ssh -p 2222 root127.0.0.1登录虚拟机在宿主机上通过浏览器访问http://127.0.0.1:8080看到虚拟机里 Nginx 的默认页面步骤一在 VM 里确认服务。检查 sshd 和 nginx 都在监听并且监听地址为 0.0.0.0。步骤二在 VirtualBox 里添加端口转发规则。按照前面3.1的表格添加 SSH 和 HTTP 两条规则。步骤三验证连接。宿主机执行ssh -p 2222 root127.0.0.1 curl http://127.0.0.1:8080这两条命令都成功了转发配置才算真正完成。6.2 SSH 密钥登录配置联动端口转发配好后每次ssh -p 2222 root127.0.0.1还要输入密码有点繁琐。我建议顺手把密钥登录配置上这样后续用 VSCode、Xshell、FinalShell 等工具连接都方便。在宿主机上生成密钥如果还没有的话ssh-keygen -t ed25519 -C local-vm-access然后拷贝公钥到 VMssh-copy-id -p 2222 root127.0.0.1以后就能直接免密登录了。这里有个小技巧在~/.ssh/config里给这个连接配个别名比如Host vm-dev HostName 127.0.0.1 Port 2222 User root IdentityFile ~/.ssh/id_ed25519配置之后直接用ssh vm-dev就能连上不需要再记端口和 IP。VSCode 的 Remote-SSH 插件也能直接识别这个配置在远程开发时自动走端口转发体验和连本地服务器一样顺畅。6.3 HTTP 反向代理联动场景如果只是简单访问 VM 里跑的一个 Nginx 页面端口转发够了。但如果你在 VM 里跑了好几个 Web 服务想在宿主机上用不同域名或路径访问那就需要配合反向代理来做了。假设 VM 里跑着两个服务Nginx 监听 80服务的是一个静态站点一个 Node.js 应用监听 3000服务的是一套 API端口转发可以这样配名称协议主机 IP主机端口子系统 IP子系统端口webTCP127.0.0.18010.0.2.1580apiTCP127.0.0.1300010.0.2.153000然后在宿主机上跑一个 Nginx 或 Caddy把http://dev.local反向代理到127.0.0.1:80把http://api.local反向代理到127.0.0.1:3000。这样在宿主机上维护多个 VM 服务站点就非常清晰和用 Docker 跑容器的体验很接近。我用这套方案在本地搭过一套前后端分离的开发环境前端站点跑在 VM 的 80 端口后端 API 跑在 VM 的 3000 端口宿主机上统一通过dev.local和api.local访问开发调试效率比直接敲 IP 加端口高很多。7. 常见问题排查与避坑记录7.1 能 ping 通但连不上 SSH这个问题在 VMware NAT 模式下很典型。宿主机可以 ping 通 VM 的 IP但 SSH 连接就是超时或拒绝。排查思路往下走第一确认 sshd 是否监听ss -lntp | grep :22如果只输出127.0.0.1:22说明 SSH 只监听回环地址需要在/etc/ssh/sshd_config里改成ListenAddress 0.0.0.0。第二确认 VM 防火墙firewall-cmd --list-all看 22 端口是否放行。这个步骤经常被忽略因为 ping 用的是 ICMP 协议SSH 用的是 TCP防火墙完全可以放行 ICMP 但拦截 22 端口。第三如果用的是 VMware检查 VMnet8 网段和 VM 实际的 IP 是否一致。有时候 VM 的 DHCP 分配换了个网段宿主机 ping 通的可能是另一台设备。7.2 VirtualBox 配置了转发但宿主机还是连不上VirtualBox 端口转发不生效先检查是不是填错了子系统 IP。默认 NAT 模式下VM 的 IP 固定是10.0.2.15不要填10.0.2.128之类你在 VM 里查到的地址。还有一点端口转发规则添加后如果 VM 处于运行状态需要重启 VM 或把网卡停用再启用才能生效。如果你在 VirtualBox 主界面配置完规则发现没生效先重启 VM 试一次这能解决大约一半的“规则不生效”问题。如果确认规则没错、VM 也重启了就在宿主机上用telnet 127.0.0.1 2222测试端口是否可达。如果 telnet 输出Connection refused说明端口没有监听问题在宿主机侧如果超时问题可能在防火墙或 VirtualBox 的 NAT 引擎。7.3 端口冲突导致服务不可访问宿主机上如果已经有一个程序占用了 2222 端口SSH 转发规则就不生效。排查方法netstat -ano | findstr :2222看到输出里有一条 PID去任务管理器里找到对应进程大概率是之前跑过的服务没关掉。解决办法是换一个宿主机端口比如 22222。还有一种情况是 VirtualBox 保存的转发规则和你手动测试的端口不一致。用VBoxManage showvminfo查看全部规则确认自己修改的是不是当前运行的 VM。7.4 重启后规则丢失或失效VirtualBox 的 NAT 转发规则通常不会因为重启而丢失。但如果 VM 用了默认 NAT 之外的网络配置或者你在 N 块网卡之间切换了网络模式转发规则可能会绑定到特定的网卡索引导致重启后失效。VMware 的端口转发规则存储在虚拟网络编辑器配置中通常也是持久化的。但要注意VM 的 IP 如果是 DHCP 分配的DHCP 续租后 IP 可能变化端口转发规则里指定的 VM IP 如果还是旧地址转发自然就不通了。所以建议把 VM 的 IP 在系统里设置成静态的或者至少给 VM 保留一个 DHCP 固定租约。7.5 排查命令速查表检查项命令期望结果SSH 服务状态systemctl status sshd显示 active (running)SSH 监听地址ss -lntp | grep :22监听 0.0.0.0 或 *HTTP 监听地址ss -lntp | grep :80监听 0.0.0.0VM 防火墙状态sudo firewall-cmd --list-all22/80 端口已放行宿主机端口占用netstat -ano | findstr :2222无输出或对应转发进程VirtualBox 转发规则VBoxManage showvminfo VM名可见配置的 natpf 规则Windows 端口代理规则netsh interface portproxy show all可见对应映射记录这张表是我每次排查虚拟机网络问题都会过一遍的清单照着走基本能定位 90% 的问题。我遇到最多的情况还是服务本身没监听 0.0.0.0 或者防火墙没放行端口转发规则本身反而很少有配置错误的。8. 端口转发方案选型与安全建议8.1 不同虚拟化场景下的方案选型做了这么多对比我把不同场景下最推荐的方案整理一下宿主机是 Windows虚拟机是 VirtualBox直接用 VirtualBox 内置的端口转发注意主机 IP 填 127.0.0.1不要在虚拟机里折腾静态 IP。宿主机是 Windows虚拟机是 VMware Workstation默认情况下直接用 VM 的 IP 即可访问不需要额外配置。如果需要统一端口或对外暴露再用 VMware 的端口转发或 netsh portproxy。宿主机是 Linux虚拟机是 KVM/QEMU端口转发可以通过iptables或firewalld的 DNAT 规则完成比图形界面操作更稳定。需要使用 UDP 服务VirtualBox 和 VMware 的端口转发都支持 UDPnetsh portproxy 不支持选型时注意。8.2 安全基线建议端口转发本质上是把 VM 里的服务暴露给宿主机乃至局域网其他设备安全配置不能少。第一转发到宿主机的端口尽量选择高位端口比如 2222、8080 等不要直接用 22、80 这类容易被扫描的端口。虽然这样做防不了定向攻击但能减少自动扫描工具的命中概率。第二不要把所有服务都转发出来。我用虚拟机开发时最常听到的一个问题是“我把 VM 的 3306/6379 都转发出来了方便宿主机操作数据库有问题吗”问题很大。数据库端口只应该在确有需求时临时映射用完立刻删掉。一个简单的原则只转发当前需要使用的端口不用的规则马上清理。第三宿主机防火墙务必配置精准。如果是本机使用监听 127.0.0.1 就够了如果必须让局域网访问再用防火墙限制允许访问的源 IP。9. 我的实测记录与补充心得最后聊一些我在实际操作中积累的细节这些内容你在官方文档里不一定能看到。第一VirtualBox 的端口转发规则改完后如果一直不生效先看 VM 的网卡类型。默认的 Intel PRO/1000 MT 桌面网卡通常在 NAT 转发下没问题但如果你手动改成过 virtio 网卡某些情况下 VirtualBox 的端口转发引擎可能不会正确识别。遇到这种情况把网卡类型改回默认或者换到主网卡上配置 NAT 转发。第二在 VirtualBox 里配端口转发时如果填了主机 IP 为某个具体地址比如局域网 IP但宿主机的 IP 后来变了比如从有线切到 WiFi转发规则就会失效。所以除非明确需要主机 IP 栏留空或填 127.0.0.1 是最稳的。第三我建议把 VM 的系统时间同步打开。这个看起来和端口转发无关但 SSH 登录时如果时间偏差过大密钥认证可能异常比如某些场景下证书校验失败排查起来非常浪费时间。NAT 模式下 VM 默认会通过虚拟网关做时间同步但如果你手动关掉了记得重新开启。第四用~/.ssh/config管理多台 VM 的 SSH 连接比记忆 IP 和端口高效得多。自从我养成了这个习惯实际上再也没打开过虚拟机图形界面去看 IP所有开发都通过终端直接完成。第五关于 VSCode 远程开发如果你的宿主机上 VSCode 通过端口转发连 VM 时遇到代理相关的问题先检查 VSCode 的remote.SSH.port配置是否和实际转发端口一致。另外Remote-SSH 会默认走~/.ssh/config确保配置没问题后再用 Remote Explorer 重试连接。这类问题大多是配置路径不对和端口转发本身关系不大。这些经验都是我在实际开发环境里一条条试出来的。很多人卡在虚拟机的 SSH/HTTP 访问上说白了就是没搞清 NAT 网络的结构和服务监听的关系。把这两点理清楚端口转发就是一个很简单的规则配置问题。