访问虚拟机web服务器的核心配置流程是:确认虚拟机的网络模式与IP地址、在虚拟机内完成Web服务监听设置、关闭或放行宿主机防火墙对应端口,最后在宿主机浏览器中通过IP或域名访问。整个过程比大多数人想象中更简单,难点通常集中在网络模式和防火墙这两个环节,下面按照实际排查操作的路径,把每一步配置拆开讲清楚。
访问虚拟机web服务器配置前,先确认这三件事
在动手配置或排查问题之前,先把虚拟机的基本状态搞清楚,很多访问失败根本不是配置有问题,而是基础没有对齐。
- 确认Web服务已经在虚拟机内部正常运行,在虚拟机里打开浏览器,访问
http://localhost或http://127.0.0.1,能打开说明服务本身没问题。 - 确认虚拟机的网络模式,这是影响外部设备能否访问的关键,常见有NAT模式、桥接模式、仅主机模式。
- 确认宿主机的IP与虚拟机IP在同一个网络平面,如果网络模式选错,后面一切配置都是徒劳。
三种网络模式对访问虚拟机web服务器配置的影响
虚拟机的网络模式决定了宿主机和其他电脑能通过什么路径找到它。
桥接模式:虚拟机与宿主机局域网内的其他设备平级,拥有独立IP(如192.168.x.x),最推荐用于Web服务场景,这种模式下,局域网内任何设备都能直接通过虚拟机IP访问。
NAT模式:虚拟机通过宿主机上网,外部设备看不到虚拟机,必须配置端口转发才能访问Web服务,如果你的虚拟机IP是10.x.x.x或192.168.x.x但无法从宿主机以外的设备访问,大概率就是这个模式。
仅主机模式:只能宿主机和虚拟机互访,局域网内其他设备访问不了,适合测试环境,正式共享Web服务时不建议用。
直接用ipconfig(Windows虚拟机)或ifconfig(Linux虚拟机)命令就能看到当前IP段,对比一下就知道自己属于哪种模式了。
虚拟机web服务器配置的核心操作步骤
以最常见的LAMP环境(Linux + Apache + MySQL + PHP)和Windows环境为例,步骤差异不大,核心是同类操作。
第一步:配置虚拟机内Web服务器绑定地址
Web服务默认监听地址通常是0.0.0或0.0.1,如果是0.0.1,外部请求会被拒绝,必须改成0.0.0。
nginx修改nginx.conf中的listen字段:
listen 80 default_server;
listen [::]:80 default_server;
Apache修改ports.conf和站点配置:
Listen 0.0.0.0:80
改完必须重启Web服务让配置生效,否则稍后测试时访问仍然失败。
第二步:在虚拟机内测试本地访问
这一步容易被跳过,但它是判断配置是否生效的最快方法,在虚拟机内执行:
curl http://localhost
如果返回HTML内容说明服务正常,返回connection refused说明服务没启动或端口没监听,先处理内部问题,再往下排查。
第三步:配置虚拟机防火墙和宿主机防火墙
行业共识认为Linux防火墙和Windows防火墙是访问失败的主要来源之一。
Linux虚拟机执行:
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload # CentOS
ufw allow 80/tcp # Ubuntu
Windows虚拟机在“防火墙高级设置”中添加入站规则,放行TCP 80端口,如果Web服务使用8080等自定义端口,记得对应放行。
第四步:从宿主机浏览器验证访问
完成上述步骤后,在宿主机浏览器输入http://虚拟机IP,如果打不开,先ping虚拟机IP确认网络连通性,能通但打不开页面,回到第二步和第三步继续检查。
虚拟机端口映射配置:NAT模式下的“外网通道”
如果你的虚拟机用的是NAT模式,宿主机访问虚拟机里的Web服务,需要配置端口映射,这一步是很多人的知识盲区,配置完成后不仅宿主机能访问,连手机或局域网其他电脑也能通过宿主机IP访问。
VMware的NAT端口转发配置
- 打开VMware Workstation,菜单栏点击“编辑”→“虚拟网络编辑器”。
- 选择VMnet8(NAT模式的默认虚拟网卡),点击“NAT设置”。
- 点击“添加”,设置主机端口、虚拟机IP和虚拟机端口。
注意映射方向把宿主机的某个空闲端口(比如8080)映射到虚拟机的80端口,配置完成后,在宿主机浏览器输入http://宿主机IP:8080访问。
VirtualBox的NAT端口转发配置
- 选中目标虚拟机,点击“设置”→“网络”。
- 选择连接方式为NAT,点击“高级”→“端口转发”。
- 添加规则,名称随意,协议TCP,主机端口8080,子系统端口8080,IP和端口填写虚拟机地址和Web服务端口。
这套虚拟机端口映射配置完成后,虚拟机不需要额外网络配置,外部一切请求都走宿主机转发通道,安全性更高,但代价是只能通过端口区分不同服务。
排查访问虚拟机Web服务器失败的常见位置
多数情况下,按照以上流程走完,宿主机就能顺利访问,如果还不行,按下面顺序逐层排查。
IP地址冲突或不在同一网段
虚拟机IP是192.168.x.x,宿主机IP是10.x.x.x,无论如何都访问不成功,让虚拟机与宿主机处于同一网段,或者选择桥接模式让路由器分配IP。
Web服务进程未监听预期端口
在虚拟机里执行:
netstat -tlnp | grep 80
如果显示0.0.1:80说明监听地址不对,需要回到配置步骤修改为0.0.0:80,显示0.0.0:80说明监听正常,排掉一个环节。
云服务器和虚拟机的区别
如果你的“虚拟机”其实是一台简米云、酷番云或华为云的服务器,那么除了本机防火墙,还必须在云平台控制台的安全组额外放行80端口的入方向规则,这类平台自带一层安全策略,仅系统内部放行还不够。
服务配置文件中存在站点路径错误
Web服务本身没问题,但配置的站点路径指向了一个不存在的目录,访问时出现403或404页面,检查nginx或Apache的DocumentRoot对应路径是否真实存在,目录权限是否为可读取,建议直接指到/var/www/html这类标准目录。
访问虚拟机Web服务器的安全注意事项
Web服务暴露给更多设备访问的同时,安全风险也随之增加,刚才为了测试方便,防火墙规则能放开,但正式使用不要裸奔。
- 修改默认SSH端口,防止暴力破解。
- Web服务使用非root用户运行,降低权限提升风险。
- 如果对外发布服务,优先使用
https而不是http。 - 拒绝root账户远程登录(
PermitRootLogin no)。 - 定期检查访问日志,观察正常之外的异常请求。
局域网和公网访问场景的差异化配置
虚拟机Web服务尝试从公网访问,目前常被误认为跟局域网相同,实际上两者差异很大,很多人在公网访问失败时反复在虚拟机里调试,方向就错了。
局域网访问场景,有一个虚拟机IP就够,关闭SELinux并放行防火墙端口就能通。
公网访问场景除虚拟机内部配置外,还依赖以下三件事:
- 宿主机是公网IP且路由器有公网端口,或者使用了内网穿透工具。
- 路由器做了端口映射(常称为虚拟服务器设置),把公网端口转发到宿主机IP。
- 云服务器的话,安全组规则已经放行对应端口。
很多小区的宽带因为运营商分配的是大内网IP,不具备公网IP条件,无论虚拟机和宿主机怎么配置,外部网络都访问不了虚拟机,这种情况使用内网穿透服务(如frp、ngrok)是更现实的方案。
实战案例:一台Ubuntu虚拟机从零到可访问的完整流程
用一个最常见的场景把所有步骤串联起来,宿主机是Windows 10,虚拟机是Ubuntu 22.04 LTS,Web服务器为nginx,目标是宿主机浏览器输入http://192.168.88.130直接打开默认页面。
- VMware中创建Ubuntu虚拟机,网络模式选桥接。
- 在Ubuntu中执行
ip addr确认IP为192.168.88.130,且和宿主机同一局域网。 - 安装nginx:
sudo apt install nginx -y。 - 编辑
/etc/nginx/nginx.conf,确认默认站点监听80。 - 启动服务:
sudo systemctl enable nginx && sudo systemctl start nginx。 - 在Ubuntu内执行
curl http://localhost确认返回页面内容。 - 配置防火墙:
sudo ufw allow 80/tcp,并在宿主机防火墙入站规则中放行TCP 80端口。 - 宿主机浏览器访问
http://192.168.88.130,看到nginx欢迎页即是成功。
如果这步顺利,后续部署Web应用只需将项目文件放至nginx默认文档目录,例如/var/www/html,并调整nginx配置中的root指向即可。
如何访问虚拟机的web服务器配置?Q&A
虚拟机IP地址经常变化导致访问失效怎么办?
在虚拟机设置中为网络接口配置一个静态IP地址,通过编辑/etc/netplan/.yaml(Ubuntu)或/etc/sysconfig/network-scripts/ifcfg-(CentOS)指定固定IP,也可以在路由器的DHCP设置中将虚拟机MAC地址绑定一个IP,效果等同。
虚拟机中的Web服务从外部访问速度很慢是什么原因?
多为MTU问题或宿主机网卡性能不佳,将虚拟机网络适配器类型改为VMXNET3(VMware)或半虚拟化网卡(VirtualBox),改用桥接模式绕过NAT转发开销,丢失率问题可通过ping -f -l 1472检查MTU计算求得合适的值。
桥接模式下外部还是访问不到虚拟机Web服务?
先确认虚拟机和宿主机能否Ping通,不通则检查网卡桥接绑定是否正确,如果Ping通但HTTP端口不通,在虚拟机和宿主机上分别查看netstat -tlnp确认端口正在监听,如果是CentOS执行getenforce确认SELinux为Enforcing状态的话需要添加对应规则,否则不会放行。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/771106.html

