网站打不开,何防不一定是止网站被服务器挂了。更多时候,拦截是何防流量在中间被截了。去年有个做外贸的止网站被朋友,站点放在新加坡,拦截国内客户十有八九访问不了,何防他以为是止网站被主机问题,换了三台服务器,拦截最后发现是何防域名解析被污染。这种事很常见,止网站被但很多人第一反应总是拦截往硬件上找原因。
拦截分几种。何防一种是止网站被DNS层面,你输入域名,拦截解析请求还没到你的服务器,就被导去了别的地方。另一种是IP封锁,数据包到了机房门口,直接被丢弃。还有一种是SNI检测,TLS握手时明文暴露了你要访问的域名,中间设备看到关键词就掐断。这三种的应对方式完全不同,搞混了白费力气。
拿一台国内机器和一台海外机器分别ping你的域名,看返回的IP是否一致。如果国内解析出来的IP根本不属于你的服务商,DNS污染没跑了。再用curl -v直接连IP加Host头,能通说明IP本身没被封,问题出在域名解析或SNI检测上。这些排查十分钟能做完,比盲目换服务器高效得多。
我自己的博客遇到过一种情况:IP能ping通,但HTTPS请求一发出去就超时。换成HTTP就正常。这说明中间设备在检测TLS握手里的SNI字段。解决办法不复杂,启用TLS 1.3的ECH(Encrypted Client Hello),把SNI也加密掉。不过ECH需要客户端支持,目前Chrome 119以上才默认开启,所以不是万能药。
单一域名加单一IP,被封只是时间问题。比较实际的做法是准备多个域名,用CNAME轮询或者干脆做域名池。有人用短域名加频繁更换,成本低,但用户体验差。另一个思路是把域名放在不同的DNS服务商,比如同时用Cloudflare和AWS Route 53,国内不同运营商的污染速度不一样,多一个解析入口就多一条活路。
IP方面,共享IP容易被牵连。同一台机器上如果有人跑违规内容,整台机器的IP都可能进黑名单。独立IP贵一些,但干净。选机房也有讲究,某些IP段被重点照顾,换一个C段可能就通了。这不是玄学,是路由策略和黑名单粒度的现实。
如果SNI检测绕不过去,可以考虑把流量伪装成正常HTTPS。比如用WebSocket over TLS,把数据包藏在看起来像普通网页请求的流量里。再进一步,用CDN中转,让用户连的是Cloudflare的IP,回源走加密隧道。Cloudflare的国内访问速度一般,但至少能通。有人用国内CDN加海外源站,效果更好,不过配置麻烦,而且CDN厂商会审查内容。
还有一个偏门做法:用域前置(Domain Fronting)。TLS握手时SNI填一个无害的大厂域名,HTTP Host头填自己的域名。CDN看到SNI放行,回源时按Host头转发。Cloudflare和Google曾经支持,后来陆续关了。现在还能用的不多,而且随时可能失效。
技术手段再强,内容触发关键词照样被拦。文本里的敏感词、图片的MD5、甚至页面标题的特定组合,都可能被中间设备识别。有人把文字转成图片,有人用base64编码,有人把关键词拆成JS动态拼接。这些方法有用,但维护成本高,而且对抗在升级。我的判断是,如果内容本身是拦截目标,技术只能拖延,不能根治。
最后说个实在的:没有一劳永逸的方案。今天能用的方法,下个月可能就失效。保持监测,准备备用通道,别把所有流量压在一个域名一个IP上。网站被拦不是技术问题,是持续对抗。你得比拦截方快一步,或者至少别慢太多。