我今天尝试通过 WireGuard VPN 隧道访问一些网络资源,发现了一些奇怪的现象。我的 WireGuard 隧道能 ping 通,但是却无法通过它访问网站,traceroute 网站的 IP 却没有问题。
此前在某篇英文博客里了解到,GFW 可以根据 TLS 的流量特征,识别出 TLS 代理中的 TLS 流量,我怀疑 WireGuard 里的 TLS 被识别了。于是我做了以下尝试:
1. 用 curl 通过明文的 HTTP 访问这个网站,结果得到了响应
2. 同样的用 curl 通过 HTTPS 访问,结果停在 TLS Client hello 就没反应了
3. 对于一个会通过 WireGuard 访问的 IP,我用 SSH 访问,没有问题
4. 神奇的是,我访问另一个有 TLS 服务的端口,服务端有 Server hello,但是接下来也没响应了
通过 Wireshark 抓包,对比 1 和 4,发现访问非 443 的端口时,的确能看到服务器发来的 "Hello Retry Request, Change Cipher Spec" 包,但是之后就没回应了。
更奇怪的是,似乎某些网站通过 WireGuard 访问没问题,我刚刚发现 www.ssllabs.com 是通过 WireGuard 访问的,HTTPS 也没问题。
我这次试着用同一个服务器软件开443和另一个端口,这次在这个另外开的端口也没看到Server hello,看来现象4和服务器软件有关。
此前在某篇英文博客里了解到,GFW 可以根据 TLS 的流量特征,识别出 TLS 代理中的 TLS 流量,我怀疑 WireGuard 里的 TLS 被识别了。于是我做了以下尝试:
1. 用 curl 通过明文的 HTTP 访问这个网站,结果得到了响应
2. 同样的用 curl 通过 HTTPS 访问,结果停在 TLS Client hello 就没反应了
3. 对于一个会通过 WireGuard 访问的 IP,我用 SSH 访问,没有问题
4. 神奇的是,我访问另一个有 TLS 服务的端口,服务端有 Server hello,但是接下来也没响应了
通过 Wireshark 抓包,对比 1 和 4,发现访问非 443 的端口时,的确能看到服务器发来的 "Hello Retry Request, Change Cipher Spec" 包,但是之后就没回应了。
更奇怪的是,似乎某些网站通过 WireGuard 访问没问题,我刚刚发现 www.ssllabs.com 是通过 WireGuard 访问的,HTTPS 也没问题。
我这次试着用同一个服务器软件开443和另一个端口,这次在这个另外开的端口也没看到Server hello,看来现象4和服务器软件有关。