一直好奇为何自己修改hosts文件可以访问不备案的域名,而做了域名指向后就被TCP Reset了,对阿里云服务器来说这两个情况看到的数据包完全是一样的,阿里云是怎么区分这两种情况的。最近问了下阿里云的内部人员,才搞清楚技术细节。
原来阿里云的机房白名单工作原理是在TCP连接建立(TCP的3步握手成功)后对浏览器发出的第一个数据包进行的检测,而且是黑白名单进行检测,不是仅通过白名单进行检测。检测步骤如下:
================================
1、如果不是HTTP协议则放行。
2、如果不包含Host字段则放行。
3、如果Host字段为IP格式则放行。
4、如果Host字段在白名单内则放行。
5、如果Host字段在黑名单内则发送TCP RST。
6、如果Host字段不在黑名单内则去进行域名解析,放行此次连接(怪不得刚做好域名指向的时候是可以访问的,过了几分钟再访问就永远被Reset了)。如果之后域名解析的结果指向了阿里云,则将此域名加入黑名单,否则不加入黑名单(怪不得本地修改hosts文件永远可以访问没有备案的域名)。
由于只对TCP连接后的第一个数据包进行检测,所以想到了个绕过的办法,就是把Host字段放到第二个数据包内。在不通过代理服务器的情况下能想到的方法就是将HTTP请求弄得很大,这样由于超过了MTU的最大值(Internet上最大MTU通常是1500左右),Host字段就很可能跑到第二个数据包内了。这样既绕过了黑白名单检测,Web服务器又能正确响应请求。
通过在未备案域名的主页后添加一长串参数(比如
http://www.XXXXXX.com/?hfhsdhjdjfdkjdjkf.............. ),参数的长度为1600,果然即使做了域名指向访问未备案的域名也永远不会被Reset。
================================
然后我就想到了个既可以让用户直接访问主页不用输入一长串参数或路径,又能将阿里云当服务器访问未备案域名的方法:
================================
1、将网站所有内容放在很深的子目录内,保证路径长度超过1500(比如12个长度为128字节的目录)。
2、开一个新的子域名(比如
web.XXXXXX.com ),指向阿里云。
3、找一个国外的免费空间做跳转,跳转到指向阿里云的子域名和很深的路径(比如
http://web.XXXXXX.com/fhskjdhfksjdhkf/fhskdjfhsjkdfh........... )。
4、将主域名指向那个免费空间,用户访问主域名自动跳转到阿里云。
================================
试验了一下,果然可行!不用HTTPS就能绕过备案。
BTW,阿里云的黑白名单都是对主域名进行的记录,比如访问了
www.XXXXXX.com 后被检测到了域名指向阿里云,那么黑名单内记录的是
XXXXXX.com 而不是
www.XXXXXX.com ,所以之后即使访问
asdf.XXXXXX.com 也会被Reset。黑名单有时效,过了一段时间如果黑名单内的域名没有被访问就会清除黑名单,之后再被访问就再进行域名解析。有时候阿里云的域名解析失败会延迟几个小时进行再次解析,所以有时候(概率很小)域名指向做了几个小时之后才被Reset。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/101469
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.