虚拟机web穿透的核心思路只有一条:把虚拟机里某个端口,通过主机或中转服务器“借道”映射到公网,让外网请求顺着这条道直达虚拟机内网服务,内网端口映射的关键不在于“端口”本身,而在于你的网络模型是NAT、桥接还是无公网IP。
虚拟机web穿透外网访问,先分清三种网络模式
很多朋友买了云服务器,装好虚拟机,却发现外网死活访问不了,问题多半出在开局第一步网络模式没选对,做穿透之前,先明确虚拟机在主机里扮演什么角色。
- NAT模式:虚拟机躲在主机后面,共享主机的IP和网关,这个模式最适合做端口映射,因为所有流量都经过主机。
- 桥接模式:虚拟机直接和主机并列在局域网里,有自己的局域网IP,这个模式穿透依赖防火墙规则,不依赖主机转发。
- 仅主机模式:虚拟机和主机之间有一个私密网络,默认不对外,这个模式基本要绕不少弯路,不适合web穿透。
行业共识认为,n 台以上虚拟机同时需要外网访问时,NAT模式 + 主机端口映射的方案是运维成本最低的,原因很简单:你只需要在主机上维护N张映射表,而不是给每台虚拟机单独配一套网络。
要记住的根本逻辑是:外网访问虚拟机,本质上访问的是“主机上某个端口”,再由主机把流量转给虚拟机里的服务,谁来做这个“转交人”,取决于你的网络模式。
下面这张表能帮你快速判断:
| 网络模式 | 虚拟机是否独立IP | 穿透是否需要额外中转 | 适用场景 |
|---|---|---|---|
| NAT | 否,共享主机IP | 不需要,直接映射 | 最常用,适合大多数web服务 |
| 桥接 | 是,局域网独立IP | 视情况,可能需要 | 虚拟机需要脱离主机单独被访问 |
| 仅主机 | 否,独立私有段 | 需要额外跳板 | 特殊测试场景,不建议做web穿透 |
内网端口映射怎么配置?真机到虚拟机两步走
以VMware Workstation为例,这是大多数个人开发者搭建虚拟机web环境的首选,假设你装了台CentOS虚拟机,里面跑着Nginx监听80端口,你要让外网访问这台虚拟机,操作路径很简单:
编辑 → 虚拟机网络编辑器 → 选择NAT模式 → NAT设置 → 添加端口映射。
在NAT设置面板里,你会看到几个字段:
- 主机端口:外网访问时使用的端口,比如8080
- 虚拟机IP地址:比如192.168.xxx.xxx,注意别填错
- 虚拟机端口:虚拟机内部服务的真实端口,比如80
填完之后,外网用户访问 你的主机公网IP:8080,流量就会自动转进虚拟机里,整个过程不需要在虚拟机内部做任何改动,NAT机制帮你把转发做了。
如果你用的是VirtualBox,路径也类似:虚拟机设置 → 网络 → 网卡 → 端口转发,点添加规则,把主机端口和子系统端口绑定起来。
主机防火墙别漏了
很多人的映射配完之后外网还是不通,排查一圈发现是主机防火墙把端口拦了,Windows和Linux主机的防火墙都要在映射之前先放行对应端口。
Linux主机用iptables或firewalld:
firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload
Windows主机的操作路径:控制面板 → Windows Defender防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口,然后填上你映射出去的端口号。
虚拟机内部防火墙也别忘
这一步经常被遗漏,虚拟机内部的防火墙也可能拦截来自主机的流量,在CentOS里确认一下:
systemctl status firewalld # 如果开着,就放行对应端口 firewall-cmd --permanent --add-port=80/tcp firewall-cmd --reload
两边都通了,穿透才算真正建立。
没有公网IP怎么做web穿透?frp内网穿透实战
场景变了:你用的是家里的宽带,没有固定公网IP,或者IP是运营商动态分配的,这种情况下,虚拟机web穿透就不能靠简单的端口映射了,你需要一台有公网IP的服务器做中转。
这就要用到内网穿透工具了,比较常用的有frp、nps、ngrok,其中frp因为配置简单、社区活跃度高,是个人开发者用得最多的一个
。
假设你有一台云服务器(公网IP假设为 2.3.4)作为中转,你家里的虚拟机跑着web服务:
第一步,在云服务器上配置frps(服务端),新建配置文件 frps.toml:
bindPort = 7000
启动服务端后,云服务器会监听7000端口等待内网设备连接。
第二步,在虚拟机所在的主机里配置frpc(客户端),配置文件 frpc.toml 里加一段:
serverAddr = "1.2.3.4"
serverPort = 7000
[[proxies]]
name = "web-penetrate"
type = "tcp"
localIP = "192.168.xxx.xxx"
localPort = 80
remotePort = 8080
这段配置的意思是:当外网访问云服务器的8080端口时,frp服务端会把流量交给内网的frpc客户端,再由frpc转给虚拟机的80端口。
第三步,启动frpc执行穿透,运行 ./frpc -c frpc.toml,看到连接成功的日志就说明隧道已建立。
这种方式和前面NAT映射最大的区别在于:传统的端口映射依赖主机做转发,而frp这类工具是把一台公网服务器当成“传话筒”,让内网虚拟机借它的IP出去,据统计,家里没公网IP的开发者,90%以上都在用这类方案。
内网穿透工具的选型对比
| 工具 | 传输模式 | 配置复杂度 | 稳定度口碑 | 适用人群 |
|---|---|---|---|---|
| frp | TCP/UDP/HTTP | 中 | 高 | 有云服务器的人 |
| nps | TCP/UDP/HTTP | 中 | 高 | 团队协作场景 |
| ngrok | HTTP/TCP | 低 | 中 | 快速测试用 |
| cpolar | HTTP/TCP | 低 | 中 | 不想自己搭服务的人 |
穿透后域名访问怎么弄
端口转发都弄好了,外网用IP访问是没问题的,但IP不好记,还会变化,比较好的做法是用域名+子域名转发。
frp支持HTTP协议类型的代理,配合你自己的域名很方便:
[[proxies]]
name = "myweb"
type = "http"
localIP = "192.168.xxx.xxx"
localPort = 80
customDomains = ["web.example.com"]
然后在云服务器对应的域名解析里,把
web.example.com 解析到云服务器IP,访问这个域名就能自动穿透到虚拟机里了。
外网访问内网服务器时的常见掉坑点
做穿透过程中大概率会遇到各种小问题,下面几个高频故障,排查完能省不少时间。
虚拟机的IP变了怎么办
虚拟机默认用DHCP获取IP,重启后可能换IP,导致之前配置的映射失效,建议在虚拟机内部把IP固定下来:
# CentOS 网络配置文件中设置静态IP nmcli con mod ens33 ipv4.addresses 192.168.xxx.xxx/24 nmcli con up ens33
或者直接在虚拟机网络设置里绑定固定IP。
路由器还有一层NAT
你在家做穿透时,主机连的是家里的路由器,路由器本身也有一层NAT,如果用的是桥接模式,需要去路由器里再做一次端口映射,否则外网请求根本到不了你的主机,这种情况就比NAT模式多出一层配置,容易把人绕晕。
运营商封了80端口
国内运营商对大流量住宅宽带的80端口有较大限制,如果你外网访问还是要用80端口,多数情况下访问不通,解决办法是换个高位端口(比如8080、8000),或者走HTTPS的443端口尝试一下。
常见问题:公网IP和端口映射的关系
没有公网IP就一定做不了穿透吗?
不是,没有公网IP,可以用frp、nps这类内网穿透工具,依赖一台有公网IP的服务器把流量中转进去,这种方式在初期配置上会多花10到20分钟,但稳定性同样不错。
NAT模式和桥接模式哪个更适合做端口映射?
如果想要配置简单、省心,NAT模式明显更合适,只需在虚拟网络编辑器里加一条映射规则,桥接模式在某些特殊场景下更灵活(比如虚拟机想直接接收来自局域网的组播广播),但映射链路更长,踩坑概率更高,多数情况下,普通web服务用NAT映射就完全够用。
虚拟机web穿透说穿了就是把流量引导这件事做好:分清网络模式、配好端口映射、放行防火墙、选对穿透工具,把这四步走完,外网访问虚拟机的目标基本就达成了,遇到问题先回到网络模式这一层排查,再去检查映射和防火墙,多数故障半小时内能定位到原因。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/628058.html





