手机打不开页面:检查监听地址
在 localhost 上应答的页面可能只绑定了回环地址。先读取套接字地址,再看防火墙规则和手机实际使用的 URL。
笔记本在 localhost 上提供页面,手机接入同一个 VPN,而手机浏览器报告无法访问该站点。隧道本身还没有问题,因为隧道只负责投递数据包。绑定到回环接口的开发服务器从不接受发往其他地址的连接,所以第一个要看的地方是监听套接字,而不是 VPN。
按顺序检查套接字、绑定设置、防火墙规则和 URL。
套接字回答的是更窄的问题
创建在 127.0.0.1 上的监听器只接受本机流量,拒绝一切从其他地址到达的连接。绑定在通配地址上的监听器会在所有本地接口上接受连接,包括 VPN 接口,这比多数开发环境所需的范围更宽。绑定到某一个特定 VPN 地址的监听器是最窄的可用选择,而且只有在该地址存在时才有效。
由此产生两个命名陷阱。在手机浏览器里,localhost 指的是手机,而不是笔记本。通配地址是绑定值,不是要输入 URL 的东西。用其中任何一个去测试的人,报告的故障其实与网络无关。
IPv6 带来第三种情况,因为套接字能否同时接受 IPv4 和 IPv6 取决于容易被忽略的选项。读取列表中的地址族。某个地址族的通配条目并不描述另一个地址族。
读取监听地址
在改动配置之前先检查套接字。本地地址、端口和所属进程共同说明服务器究竟能否从 VPN 访问。
Get-NetTCPConnection -State Listen -LocalPort 8080 | Select-Object LocalAddress,LocalPort,OwningProcess Get-Process -Id (Get-NetTCPConnection -State Listen -LocalPort 8080).OwningProcess ipconfig | Select-String -Pattern 'IPv4' Get-NetFirewallRule -DisplayName '*8080*' | Format-Table DisplayName,Enabled,Profile,Direction,Action
本地地址为 127.0.0.1 时问题就清楚了:改防火墙没有用,因为应用根本没有在 VPN 接口上监听。通配地址或 VPN 地址说明套接字没问题,接下来看下一道边界。
也要确认所属进程,因为常见端口上无关的服务会让列表看起来正确,而目标服务器其实从未启动。要匹配可执行文件路径,而不仅是名称。上一次运行残留的旧进程是常见的冒名者。
通过应用修改绑定
使用框架文档中说明的监听地址选项并重启进程。如果笔记本拥有私有地址 10.77.0.1,手机的 URL 就变成 http://10.77.0.1:8080/,而该地址必须经 VPN 路由;配置的其他部分不变。
不要为了强制绑定而给 Windows 添加任意地址或改动网关。那些改动会一直留到调试结束之后,并让下一个人吃惊。在 VPN 地址存在之前启动的服务器也可能绑定失败,所以对临时接口来说启动顺序很重要。给它重试,或者在隧道建立之后再启动。开机时的绑定失败,第二天早上看起来和防火墙问题一模一样。
对于 HTTPS,要保持服务主机名和证书校验不变。在裸地址上出现证书警告是命名问题,不是点一下就能跳过的步骤,私有 DNS 必须与你选择的监听器一致。
只开一条规则,而不是整个网络
一旦套接字在 VPN 地址上接受连接,防火墙决定请求能否到达。把规则限定到这个应用、这个协议、这个本地端口和被授权的远程来源,并确认 VPN 适配器上哪个配置文件处于活动状态。
使用 Windows 实际看到的源地址,包括网关所做的任何转换,因为按原始客户端地址写的规则不会匹配转换后的地址。
页面能加载并显示应用错误就是进展:HTTP 拒绝与没有 TCP 连接是不同的故障,接下来的排查属于应用自身的访问策略,而不是网络。
最后从目标手机请求页面,并确认被排除的设备仍然无法访问。能工作但规则放行一切的监听器并不是同样的结果。