我知道这个问题已经被问过很多次了,但我还没有找到任何能真正解决它的方法。
我使用 VPN 访问国际互联网,信息自由是一项基本人权,不幸的是我住在中国,所以我必须使用 VPN 来行使这项权利。
现在 Windows 10 在连接 VPN 时错误地报告“无互联网”,尽管事实上我可以很好地访问任何被阻止的网站(例如www.google.com)。Windows 在 VPN 过去处于活动状态时正确报告了“Internet 访问”,但不知何故现在却没有。
您可能认为这没什么大不了的,但我的 ISP 不断尝试断开我的 VPN,有时他们会成功,而当我实际断开连接时,网络连接状态指示器将无法告诉我。
我当然用谷歌搜索了这个,一些结果建议进行以下注册表编辑并重新启动路由器:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet]
"ActiveDnsProbeContent"="8.8.8.8"
"ActiveDnsProbeContentV6"="2001:4860:4860::8844"
"ActiveDnsProbeHost"="dns.google"
"ActiveDnsProbeHostV6"="dns.google"
"ActiveWebProbeContent"="success"
"ActiveWebProbeContentV6"="success"
"ActiveWebProbeHost"="detectportal.firefox.com"
"ActiveWebProbeHostV6"="detectportal.firefox.com"
"ActiveWebProbePath"="success.txt"
"ActiveWebProbePathV6"="success.txt"
"CaptivePortalTimer"=dword:00000000
"CaptivePortalTimerBackOffIncrementsInSeconds"=dword:00000005
"CaptivePortalTimerMaxInSeconds"=dword:0000001e
"EnableActiveProbing"=dword:00000001
"PassivePollPeriod"=dword:0000000f
"StaleThreshold"=dword:0000001e
"WebTimeout"=dword:00000023
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\ManualProxies]
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\NetworkConnectivityStatusIndicator]
@=""
我试过了,但没有用。
我可以很好地 ping 测试中使用的服务器:
PS C:\Users\Xeni> ping detectportal.firefox.com
Pinging prod.detectportal.prod.cloudops.mozgcp.net [34.107.221.82] with 32 bytes of data:
Reply from 34.107.221.82: bytes=32 time=203ms TTL=120
Reply from 34.107.221.82: bytes=32 time=203ms TTL=120
Reply from 34.107.221.82: bytes=32 time=203ms TTL=120
Reply from 34.107.221.82: bytes=32 time=204ms TTL=120
Ping statistics for 34.107.221.82:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 203ms, Maximum = 204ms, Average = 203ms
PS C:\Users\Xeni> ping 8.8.8.8
Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=203ms TTL=120
Reply from 8.8.8.8: bytes=32 time=203ms TTL=120
Reply from 8.8.8.8: bytes=32 time=203ms TTL=120
Reply from 8.8.8.8: bytes=32 time=200ms TTL=120
Ping statistics for 8.8.8.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 200ms, Maximum = 203ms, Average = 202ms
我已禁用并重新启用网络适配器...
什么都不管用。
但是我知道如果我断开 VPN,NCSI 会立即正确报告我可以访问互联网,我已经成功地重现了很多次而没有失败,但是当然这不是解决方案,原因很明显。
我的设置 -> 网络和互联网 -> 状态 -> 网络状态说:
不能访问网络
您的设备已连接,但您可能无法访问
网络上的任何东西。如果您的数据计划有限,您可以
使此网络成为按流量计费的连接或更改其他
特性。
我该如何解决这个问题?
PS 这些细节无关紧要,但我会在这里添加它们以防有人提到它们:
我的操作系统是 Windows 10 Pro 22H2 x64,我使用的是有线以太网连接,但它们对问题的影响不大;不,dism /online /cleanup-image /restorehealth
绝对sfc scannow
不解决这个问题,所以不重装操作系统;而且我之前已经使用 Snappy Driver Installer 更新了网络驱动程序,并且我已经重新启动了我的电脑......
Windows 网络连接状态指示器 (ncsi) 至少进行 DNS 和 HTTP 测试。您通常可以自己测试这些,看看哪个失败了。默认情况下,它会检查:
nslookup dns.msftncsi.com
对于 DNS(应该解析为131.107.255.255
)Microsoft Connect Test
如果 DNS 失败,您可以通过编辑主机文件强制它成功
也就是说,我相信它依赖于您更改的那些注册表设置。当您遇到问题时,您可能希望将它们重置为默认值或验证它们是否为您提供了对上述测试的正确响应。
如果您的 vpn 涉及网络代理,则 ncsi 会尝试自动检测您的代理设置。如果失败,您可以尝试通过手动设置 winHTTP 代理设置来帮助 ncsi:
我已经确定了问题的根本原因。
显然是ISP劫持了dns.msftncsi.com到100.64.100.1,所以连接VPN时DNS查询会失败,而DNS查询失败就是NCSI误报“No Internet”的原因。
然而,主机文件中的设置
131.107.255.255 dns.msftncsi.com
会导致相反的情况,当我的互联网被我的 ISP 切断时,它会使 NCSI 错误地报告“Internet 访问”。两者都是不需要的,我刚刚找到了一种使其正常工作的方法。
导致DNS查询失败的原因是我的ISP的DNS中毒,所以使用已知安全的DNS会让DNS查询在应该成功的时候成功。
我在控制面板 -> 网络和 Internet -> 网络连接 -> 以太网属性 -> IPv4 属性页面将我的适配器更改为使用 8.8.8.8 DNS,这将绕过 GFW 引起的 DNS 中毒。
但是连接上VPN后NCSI还是会报漏报,通过以下命令解决:
devcon.exe
(如果要试用,需要下载并放到%windir%\system32文件夹下)