要让虚拟机通过域名被外网访问,核心链路是“公网IP或内网穿透 + 域名解析 + 端口转发 + 防火墙放行”四步。 配好这四条链路,别人在浏览器里输入你的域名,就能直达虚拟机里跑的服务。
虚拟机域名配置外网访问的核心前提
先搞清楚一个概念:虚拟机本身没有物理网卡,它借用宿主机的网络资源上网,外网访问虚拟机,本质上是把外部流量引导到宿主机,再由宿主机转交给虚拟机的某个端口,跳过了这个逻辑,后面所有配置都是白搭。
外网访问虚拟机需要公网IP吗
分两种情况看:
- 有公网IP:直接做端口映射,把路由器或宿主机的端口转发到虚拟机的内网地址。
- 没有公网IP:只能借助内网穿透工具,比如frp、ngrok、花生壳,通过一台有公网IP的中转服务器把流量引进来。
国内家庭宽带绝大多数分配的是内网IP,电信、联通这类运营商近年逐步回收了公网IPv4地址。多数情况下,你需要先确认宽带运营商是否分配了公网IP,打客服电话问“我的宽带是不是公网IP”即可,或者登录路由器后台看WAN口IP,和百度搜出来的IP一致就是公网。
VMware、Hyper-V与VirtualBox的虚拟网络模式差别
不同虚拟机平台的网络模式,直接影响域名配置的路径,行业共识认为:NAT模式适合单机调试,桥接模式适合直接暴露给局域网,而外网访问通常需要额外做端口映射。
| 平台 | 推荐网络模式 | 外网访问方式 |
|---|---|---|
| VMware Workstation | NAT | 宿主机端口转发到VMnet8 |
| Hyper-V | 外部虚拟交换机 | 虚拟机直接获取局域网IP,再走路由器端口映射 |
| VirtualBox | NAT或桥接 | NAT需配置端口转发规则,桥接则走路由器映射 |
如果你在用VMware,菜单栏打开“编辑 → 虚拟网络编辑器”,选中VMnet8(NAT模式),点击“NAT设置”,在里面添加端口转发规则,比如宿主机监听80端口,转发到虚拟机内网IP的80端口,这样外网访问宿主机IP:80就等于访问虚拟机。

有公网IP时虚拟机怎么设置域名
有了公网IP,域名配置就变成两个动作:域名解析指向公网IP,端口映射指向虚拟机。
域名解析到公网IP的操作路径
购买域名后,在DNS服务商的控制台添加一条A记录:
- 主机记录填
www,记录值填你的公网IP,TTL默认即可。 - 如果想让根域名也生效,再添一条主机记录为的A记录。
- 等解析生效,本地打开命令提示符,输入
ping www.你的域名.com,返回的IP和你的公网IP一致就说明解析成功了。
公网IP是动态的也没关系,用DDNS替代普通A记录,国内常见方案是路由器自带DDNS功能,配合花生壳或公云,域名固定不变,IP变了自动更新。
路由器端口映射是虚拟机连通的命门
这一步出错最多,登录路由器管理页,找到“端口映射”或“虚拟服务器”选项,添加一条规则:
- 外部端口:填80或8080(取决于你准备用哪个端口访问)。
- 内部IP:填虚拟机的内网IP。
- 内部端口:填虚拟机服务实际监听的端口。
家里的光猫如果是拨号模式,需要先让光猫改为桥接模式,否则路由器做的端口映射会失效,这一步建议直接联系宽带装维师傅远程改,自己在光猫后台瞎改容易把网络搞断。
没有公网IP时虚拟机域名方案
没公网IP,虚拟机域名配置外网访问就得换条路,frp是目前用得最多的开源内网穿透工具,配置逻辑清晰,适合自己租一台带公网IP的轻量云服务器做中转。
frp内网穿透的搭建步骤
服务端(云服务器)配置frps.toml:
bindPort = 7000是frp的通信端口。auth里设置一个token,相当于密码。
客户端(宿主机或虚拟机里)配置frpc.toml:
serverAddr = "你的云服务器IP" serverPort = 7000 auth.token = "你设置的token" [[proxies]] name = "web" type = "tcp" localIP = "虚拟机内网IP" localPort = 80 remotePort = 8080
启动客户端后,外网访问

你的云服务器IP:8080,流量就会通过frp隧道转发到虚拟机的80端口,然后把域名解析到云服务器的公网IP,虚拟机的域名访问就通了。
相比有公网IP的方案,frp多了一层中转,延迟会高些,但胜在不依赖运营商分配公网IP,搬迁机房、换宽带都不用重配域名,市面上也有ZeroTier和Tailscale这类组网工具,它们适合小范围固定设备访问,和域名搭配使用时,公网访问稳定性不如frp。
防火墙与安全组配置,让域名能通但访问不卡
端口映射做完还不行,防火墙和安全组会把流量拦在门外,这是虚拟机域名配置外网访问里最容易踩坑的一环。
Windows虚拟机防火墙放行端口
在Windows虚拟机里,用管理员权限打开PowerShell,执行:
netsh advfirewall firewall add rule name="web-http" dir=in action=allow protocol=TCP localport=80
这条命令放行80端口,如果服务跑在8080,把localport改成对应数字,执行完后,外网请求才能穿透Windows防火墙。
云服务器安全组的入口规则
如果你用的是云服务器做frp中转,登录云控制台找到“安全组”或“防火墙”,添加入方向规则:
- 协议:TCP。
- 端口:7000和8080(或你实际用的端口)。
- 来源:0.0.0.0/0,表示允许所有IP访问。
安全组没有放行时,即使frp服务端正常运行,外部连接也会超时。云厂商控制台的安全组优先级高于服务器系统防火墙,这个特性经常让人排查半天找不到原因。
域名备案与HTTPS的进阶问题
虚拟机上跑的如果是网站类服务,域名不只是解析和端口的问题,还要过备案和HTTPS这两关。
国内服务器域名备案是硬门槛
据工信部规定,域名解析到国内机房(包括云服务器)的IP时,必须先完成ICP备案,未备案的域名指向国内服务器,HTTP请求会被服务商拦截,解决方法:
- 服务器在境外的,可以绕过备案,但延迟偏高。
- 服务器在国内的,通过云厂商的备案系统提交资料,通常10-20个工作日。

HTTPS证书申请与自动续期
域名能通过HTTP访问后,就应该上HTTPS,用Let's Encrypt的免费证书,90天有效期,配合acme.sh脚本自动续期,在虚拟机里执行:
curl https://get.acme.sh | sh acme.sh --issue -d 你的域名 --nginx
续期由cron定时任务自动完成。HTTPS不仅加密传输,还能避免运营商在HTTP页面里插广告,HTTP/2和HTTP/3的强制要求也都建立在HTTPS之上,这一步早晚要补齐。
虚拟机与云服务器设置域名的区别
很多朋友把本机虚拟机和云服务器混为一谈,实际上两者设置域名的路径完全不同:
- 云服务器自带公网IP,域名解析后直接指向即可,不需要考虑路由器端口映射。
- 本机虚拟机有没有公网IP决定方案走向,有IP走端口映射,没IP走内网穿透。
- 云服务器有现成的安全组控制台,本机虚拟机需要手动配置宿主机和虚拟机的双层防火墙。
这个区别在选择方案时很关键,如果只是学习测试,用本机虚拟机加frp成本最低;如果是正式业务,云服务器加域名备案的链路更省心。
虚拟机域名外网访问常见问题解答
域名解析到公网IP之后,外网还是打不开虚拟机?
先排查三个位置:路由器端口映射是否指向虚拟机内网IP,宿主机的防火墙是否放行对应端口,虚拟机系统防火墙是否放行对应端口,多数情况下是其中一环被忽略了。
虚拟机里的网站绑定域名后,本地能访问但手机4G打不开?
手机用4G网络访问,走的是运营商出口,和你在同一局域网用WiFi访问走的路由完全不同,手机打不开说明端口映射或防火墙配置对公网无效,重点检查路由器WAN口是否有公网IP,以及端口映射规则是否绑定在正确的接口上。
用内网穿透访问虚拟机每次域名端口都不一样,怎么固定?
frp可以配置自定义域名,在frpc.toml的[[proxies]]里加上customDomains = ["你的域名"],然后给云服务器上的Nginx配一条反向代理,把域名指向frp监听端口,这样域名就固定了,不需要每次记住一串随机端口。