把虚拟机网络调通、用反向代理或内网穿透把域名映射到虚拟机端口、再做DNS解析指向对应公网地址。整个过程拆成三块来看并不复杂,关键是把网络模型、端口转发和解析记录这三件事捋顺。
配置前需要先搞清楚的三个基础问题
有些朋友上来就改配置文件,结果域名死活不通,回头检查才发现虚拟机连外网都不行,这一步别急,先把基础环境确认好。
确定虚拟机的网络模式
虚拟机软件里常见的三种网络模式NAT、桥接、仅主机决定了你的域名访问方案。
- NAT模式:虚拟机通过宿主机上网,外部设备看不到虚拟机,域名访问基本走不通,只能做端口转发,访问形式是“宿主机IP+端口”,对域名支持不友好。
- 桥接模式:虚拟机直接接入局域网,和宿主机平级,有自己的IP,家里或者公司局域网内想用域名访问虚拟机,优先选这个模式。
- 仅主机模式:只有宿主机和虚拟机互通,用处比较局限,做测试可以,对外访问不合适。
行业共识认为,面向家宽或办公网部署虚拟机服务,桥接模式是稳妥起点。 不过要注意,桥接模式下虚拟机需要独立IP,IP冲突问题也会随之而来,建议手动固定IP,不要让DHCP飘来飘去。
固定虚拟机的内部IP
既然要拿域名访问,IP地址就不能老变,以VMware虚拟机和Ubuntu系统为例,最简单的做法是直接改DHCP分配规则,让路由器或虚拟机管理平台把同一个IP始终分给这台虚拟机。
命令行方式也很好用,在虚拟机里执行:
nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 223.5.5.5 nmcli connection up "Wired connection 1"
Windows Server虚拟机就在“网络适配器 → IPv4属性”里填写固定IP、掩码和网关,固定之后,后续所有端口映射和反向代理配置都围绕这个IP展开。
准备域名和DNS解析
域名商选择上,国内常见的有简米云、酷番云、华为云;不确定用哪家的话,就看自己服务器或云主机在哪里,就近搭配即可。
这里的核心思路是:域名的A记录指向你路由器的公网IP或云服务器的公网IP,别指向虚拟机IP,虚拟机IP是内网地址,外部解析不到。
虚拟机域名访问还是本机建站?两种方案的取舍
很多人在虚拟机跑网站和直接在宿主机跑服务之间纠结,这两者到底怎么选,其实取决于你的资源分配和隔离要求。
| 对比项 | 虚拟机方案 | 本机方案 |
|---|---|---|
| 资源占用 | 较高,需分配独立CPU和内存 | 较低,直接使用宿主机资源 |
| 环境隔离 | 完全隔离,系统坏了不影响宿主机 | 依赖宿主机的系统稳定性 |
| 部署迁移 | 快照和克隆方便,适合测试多套环境 | 迁移成本高,换个机器要重装环境 |
| 域名访问复杂度 | 需要额外做端口映射或代理 | 直接监听80/443端口即可 |
如果你同时跑三四套站要切换,虚拟机方案绝对更合适,隔离带来的安全性也是本机直接跑比不了的,反过来,单纯就是折腾一个博客或个人项目,本机装Nginx反而省事。
内网映射:把域名指向虚拟机
光有域名和固定IP不够,域名请求进来后,得有人“接住”这个流量再转给虚拟机,两个常用手段是反向代理和端口映射。
用Nginx反向代理同一个IP的多个域名
如果你只有一台物理机或一个公网IP,但想用不同域名访问不同虚拟机,Nginx反向代理是最干净的方案。
在宿主机或一台有公网访问能力的机器上装Nginx,编辑配置文件:
vim /etc/nginx/conf.d/vm-proxy.conf
server {
listen 80;
server_name blog.example.com;
location / {
proxy_pass http://192.168.1.100:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
语法检查后重载配置:
nginx -t systemctl reload nginx
流程逻辑很简单:域名请求到达Nginx,Nginx根据server_name匹配规则,把流量转到对应虚拟机的IP和端口。一个Nginx可以挂十几个server块,对应十几台虚拟机,互不干扰。
家用虚拟机怎么通过域名访问外网
家用宽带大部分没有固定公网IP,甚至没有公网IPv4地址,这时候有两个可选路径:
- 路由器端口映射:如果路由器WAN口拿到的是公网IP(拨号后能在路由器状态页看到公网IP),就用端口映射,登录路由器后台 → 找到“端口映射”或“虚拟服务器” → 添加规则:外部端口填80或8080,内部IP填虚拟机地址,内部端口填虚拟机服务端口,保存后,外网访问“http://域名:端口”就能到达虚拟机。
- 内网穿透工具:没有公网IP就用frp或ngrok,以frp为例,你需要一台有公网IP的云服务器(最便宜的轻量服务器也可以),在云服务器上跑frps,在虚拟机里跑frpc。
frps服务端配置:
[common] bind_port = 7000 vhost_http_port = 8080
frpc客户端配置:
[common] server_addr = 你的云服务器IP server_port = 7000 [web] type = http local_port = 3000 custom_domains = blog.example.com
注意,云服务器安全组要放行7000和8080端口。frp方案跟云服务器厂商关系不大,只要是Linux系统的云服务器就行,国内主流云厂商价格差别主要体现在带宽上,这个量级远低于买一个固定公网IP的成本。
DNS解析这时候把A记录指向云服务器的公网IP,访问“blog.example.com:8080”就能穿透到家中的虚拟机。
DNS设置方法与解析记录的选择
域名解析本身是等域名生效后,域名商后台控制台里点击几下的事,核心在于选择什么记录类型。
A记录与CNAME记录的取舍
- A记录:把域名直接指向IP地址,适合有固定公网IP或云服务器IP的场景,解析速度快,没有额外跳转。
- CNAME记录:把域名指向另一个域名,适合用内网穿透工具时、由穿透服务商提供别名的情况,换IP时不用改解析。
家用宽带场景,如果用了DDNS(动态域名解析),A记录对应的就是DDNS提供的动态域名解析结果,部分路由器自带DDNS功能,和花生壳、简米云DDNS配合使用,能解决公网IP变动的麻烦。
解析生效时间与TTL
TTL值默认600秒就可以,改动解析记录后,正常情况下几分钟到几小时内全球生效。国内访问的域名建议使用国内DNS服务器,解析速度更快,境外DNS在特殊网络环境下反而容易出现解析慢的问题。
安全加固与常见坑位处理
域名能访问只是第一步,虚拟机暴露到公网之后,安全配置也要跟上。
端口别全裸奔
用Nginx反代的时候,只需要对外放行80和443端口,虚拟机的SSH(22端口)、数据库(3306/5432)端口不要直接暴露到公网,用防火墙规则限制访问来源IP。
以Ubuntu的UFW为例:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw allow from 你的办公IP to any port 22 sudo ufw enable
运营商封锁端口的应对方案
国内相当一部分地区的家宽运营商封禁了80和443端口,排查办法很简单:虚拟机上的网站用8080端口能访问,但换80端口就不通,基本就是被运营商干了。
对策有很多,选一个最不折腾的
- 改用非标准端口比如8080、8443访问,代价是URL里得带端口号。
- 用HTTPS证书加密并以443端口对外,部分运营商放行了443,但并不是所有地区都放行。
- 借助内网穿透工具的HTTPS功能,以frp为例,在frps端启用HTTPS代理,对外暴露的是HTTPS标准端口,通过自定义域名做转发。
反向代理后访问慢的排查周期
有时候域名通了,但打开网页很慢,多数情况下,问题出在DNS解析的服务器响应速度或者Nginx配置里缺少gzip压缩,打开Nginx的gzip开关:
gzip on; gzip_types text/plain text/css application/json application/javascript;
顺带提一句,后端虚拟机里的数据库连接池配置也会拖慢响应,这个得按各自应用去调,并不全是Nginx的锅。
Q&A:虚拟机的域名访问相关问题
Q:用Nginx反向代理后,虚拟机还需要配置域名吗?
不需要,虚拟机内部的服务监听端口即可,Nginx负责接收域名请求并转发给虚拟机的IP和端口,虚拟机的应用不需要知道自己被哪个域名访问,只要在Nginx的server_name里配置对应域名就行。
Q:内网穿透和路由器端口映射能同时用吗?
能,如果路由器的端口映射已经生效,就不要启用内网穿透工具对同一端口的穿透,否则会冲突,实际使用中,有公网IP就优先走路由器端口映射,没有公网IP才用frp这类穿透工具,两个方案并存的话,注意端口和域名的对应关系,别让两条链路同时监听一个入口。
Q:虚拟机绑定域名访问很慢,换DNS服务商能解决吗?
访问慢不一定是DNS服务商的问题,先看清楚慢在哪个环节用ping命令测试域名解析出来的IP响应时间,如果IP能通但网页加载慢,问题多半在Nginx配置或后端应用,如果ping不通或者解析出来的IP不对,再考虑换DNS服务商,国内用户的常用选择是简米云DNS和酷番云DNSPod,解析速度普遍快于国外服务商。