虚拟机的NAT模式转发是典型的“出口简单、入口复杂”,外网想访问内网虚拟机,核心在于把三个环节打通:虚拟机端口映射必须配好、宿主机防火墙必须放行、路由器必须拿到公网IP并做端口转发;如果最后一步没有公网IP,那就老老实实用内网穿透。
搞清楚NAT模式的网络链路,才知道卡在哪一步
NAT模式下,虚拟机和宿主机共享一个IP地址,比如你在VMware里建了一台CentOS,虚拟机的IP是192.168.88.128,宿主机Windows的IP是192.168.1.10,那么外网访问的流量路径是这样的:
外部设备 → 你的家庭路由器(公网IP) → 宿主机(Windows) → 虚拟机(CentOS的服务端口)
这中间任何一环断了,外网都进不来,大多数人配置失败,不是端口映射写错,就是根本不知道运营商给的是内网IP。
虚拟机端口映射怎么设置,这一步错了后面全白搭
先明确一个概念:NAT模式下,虚拟机对于宿主机来说是一台“隐形设备”,宿主机自己有一套流量转发机制,但默认不主动把外网流量导给虚拟机,你得手动告诉虚拟化软件:某个端口的流量,请转交给虚拟机的某个IP的某个端口。
VMware Workstation的NAT映射配置
打开VMware Workstation,菜单栏点击“编辑” → “虚拟网络编辑器”。
- 选中NAT模式的网卡(通常是VMnet8)。
- 点击右下角NAT设置按钮。
- 在弹出的窗口中,点击添加端口转发规则。
- 主机端口填一个没被占用的端口,比如2222。
- 虚拟机IP地址填你系统的实际IP,比如192.168.88.128。
- 虚拟机端口填22(SSH)或者8080(Web服务),看你需要转发什么。
配置完成后,在本机用 telnet 127.0.0.1 2222 测一下,能通就说明宿主机到虚拟机的转发已经生效。
VirtualBox的端口映射命令
VirtualBox的NAT转发不提供图形界面入口,得用VBoxManage命令行工具,打开终端(Windows用CMD或PowerShell),切换到VirtualBox的安装目录:
VBoxManage modifyvm "你的虚拟机名称" --natpf1 "规则名称,tcp,,2222,,22"
这条命令的意思是:把宿主机的2222端口TCP流量转发到虚拟机的22端口,以此类推,把最后的两个数字改成你需要的端口就行,想删掉规则,用:
VBoxManage modifyvm "你的虚拟机名称" --natpf1 delete "规则名称"
虚拟机端口映射不生效的常见原因
根据多数用户踩过的坑,以下是几个高频故障点:
- 虚拟机IP写死了旧地址:如果你在虚拟机里设置了静态IP,但网卡换了网段,转发规则会指向一个不存在的IP,用
ip addr或ipconfig确认当前实际IP。 - 宿主机端口被占用:比如你转发宿主机80端口,但宿主机自己装了nginx或IIS,端口已经占用了,换一个高位端口,比如8080、8443。
- 虚拟机防火墙拦截:Ubuntu系统默认开着ufw,CentOS默认有firewalld,先临时关闭防火墙测试,能通再放行具体端口:
systemctl stop firewalld # CentOS
systemctl stop ufw # Ubuntu
NAT模式外网访问内网虚拟机,宿主机防火墙是第二道拦路虎
就算虚拟机端口映射配好了,宿主机Windows或Linux的防火墙也可能把所有入站流量挡在门外,上面说的 telnet 127.0.0.1 2222 测试走的是回环地址,绕过了防火墙检查,等外网流量从物理网卡进来,防火墙规则就生效了。
在Windows宿主机上,以管理员身份运行CMD,执行:
netsh advfirewall firewall add rule name="VM_NAT" dir=in action=allow protocol=TCP localport=2222
这条命令的作用是放行TCP入站的2222端口,如果你用的是Linux宿主机,更简单:
iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
做完这一步,再用手机4G网络(关闭WiFi)访问 宿主机局域网IP:2222 测试一下,通了,说明宿主机这一层没问题了。
没有公网IP怎么外网访问虚拟机,内网穿透方案怎么选
这是最现实的一个问题,根据宽带服务商的普遍策略,家庭宽带的公网IPv4地址已经日益稀少,相当一部分地区的用户拿到的是CGNAT(运营商级NAT)后的内网IP,你打电话申请公网IP,客服往往回复没有权限或需要企业专线,这种情况下,路由器端口转发根本无从谈起,因为路由器WAN口IP本身就是私有的。
行业共识认为,在无法获取公网IPv4的前提下,内网穿透是VMware虚拟机外网访问的唯一可靠路径,目前主流方案有三类,各有短板:
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| frp | 有云服务器 | 稳定可控,流量不走第三方 | 需要一台带公网IP的云主机,有运维门槛 |
| cpolar/花生壳 | 个人演示 | 配置简单,下载即用 | 免费版带宽小,部分功能收费 |
| Tailscale/ZeroTier | 多设备互访 | 走P2P通道,延迟低 | 两端都要装客户端,不适合开放给外部用户 |
个人开发者的典型场景是:在家用旧电脑跑了个虚拟机做测试环境,在公司或出差时想连回去看看服务状态,这种情况下,Tailscale是最省心的方案,在宿主机和你的电脑上各装一个客户端,登录同一账号,虚拟机网络选NAT模式,宿主机开启IP转发,之后直接用虚拟机的Tailscale虚拟IP访问就行。
如果是给朋友演示项目,或者让客户临时看个页面,用cpolar这类隧道工具更快,在宿主机安装后,执行一条命令就能映射出公网地址:
cpolar tcp -region=cn 2222
生成一个形如 tcp.cpolar.cn:12345 的公网地址,对方的SSH客户端直接连这个地址就能到达虚拟机的22端口。
光猫拨号还是路由器拨号,决定了路由器端口转发能不能做
前面说的是没有公网IP的情况,如果你确认自己有公网IP,但端口转发还是不生效,那问题多半出在光猫上。
宽带安装时,默认是光猫拨号,路由器WAN口拿到的是光猫分配的私有IP,比如192.168.1.2,你在路由器上做端口映射时,实际上是把规则加在了私有网络内部,外网流量根本到不了路由器这一层。
正确做法是改成路由器拨号:
- 用超级管理员账号登录光猫的配置页面(常见地址192.168.1.1,超级账号一般是telecomadmin,密码因地区而异,网上搜索对应型号的默认密码)。
- 找到“网络” → “宽带设置”,把连接模式从Route改成Bridge。
- 进入你的路由器后台,设置PPPoE拨号,填写宽带账号密码。
改完之后,路由器WAN口地址变成真正的公网IP,然后到“端口映射”或“虚拟服务器”页面,把21115这类端口映射到宿主机的192.168.1.10,再通过VMware NAT把宿主机的21115端口映射到虚拟机的22端口,这一套下来才是完整的链路。
行业人士指出,在光猫改桥接的过程中,IPTV和固话业务可能受到影响,操作前务必拍下光猫原来的配置截图,出了问题能及时还原。
外网访问速度慢或者失败?逐层排查端口转发链路
不管是NAT模式的端口转发,还是内网穿透,你最终都要验证“整条链路是否畅通”,用一张表直接理清排查顺序:
| 排查步骤 | 验证方法 | 常见结论 |
|---|---|---|
| 虚拟机服务监听地址 | 在虚拟机内执行 ss -lntp |
服务必须监听0.0.0.0而非127.0.0.1 |
| 宿主机到虚拟机 | 宿主机执行 telnet 虚拟机IP 22 |
不通则检查VMware NAT规则 |
| 局域网设备到宿主机 | 手机连同一路由器,访问 宿主机IP:2222 |
不通则检查Windows防火墙 |
| 外网到路由器 | 用手机4G访问 公网IP:2222 |
不通则检查路由器端口映射或光猫桥接 |
服务监听地址是很多人忽略的一点,默认情况下,Nginx可能只监听127.0.0.1,MongoDB也可能只绑定localhost,你从虚拟机外访问自然会被拒绝,确认下配置文件,改成 listen 0.0.0.0:8080 或 bind_ip_all = true,然后重启服务。
外网用域名访问虚拟机,DDNS动态解析要提前搞定
家庭宽带的公网IP地址是动态变化的,断电重启光猫IP就变了,你刚才在路由器上配好的端口转发规则用的公网IP是新地址,下次就失效了。
在路由器后台找一下“DDNS”或“动态DNS”功能,通常内置了花生壳、DynDNS或No-IP的客户端,注册一个免费域名,填写账号密码后,路由器会在IP变化时自动更新解析记录,这样你只需要记住域名,不用每次查IP地址。
特别注意:DDNS只是把域名解析到你的公网IP,端口转发规则必须跟着IP段调整,如果路由器重启后WAN口IP变了,去检查一下已有端口映射规则,部分路由器会自动更新,部分需要手动改。
关于虚拟机NAT转发的几个高频问题
为什么外网访问很慢,但局域网内访问飞快?
多数情况下是上行带宽瓶颈,家庭宽带的上行速度通常远小于下行,从外网拉取虚拟机里的资源时,实际流量走公网上行链路,速度取决于你宽带的签约上行速率,和虚拟机网络模式没关系,NAT模式下所有流量经宿主机转发,如果宿主机CPU占用率高,也会造成额外的性能损耗。
虚拟机NAT模式和桥接模式哪个好?
从外网访问的角度来看,桥接模式更直接,虚拟机和宿主机在同一网段,相当于一台独立设备,端口映射只需在路由器上做一次,NAT模式则在虚拟机外多包了一层宿主机转发,排查链路更复杂,但NAT模式的优点是虚拟机IP固定,不会因为路由器DHCP地址池的变化而改变,适合长时间运行的测试环境。
用内网穿透工具映射的地址会被别人扫描吗?
会,任何暴露在公网的端口都会面临持续扫描,这是常态,建议在虚拟机上启用SSH密钥认证、禁用密码登录,或者把端口限制为固定来源IP,穿透工具的免费域名经常变化,也容易成为扫描目标,重要服务还是用frp绑定的自定义域名配合访问控制更稳妥。