很多情况下,某墙都是劫持了dns,让用户的请求走向其他服务器来阻止访问
举个例子!
这是一个简化后的互联网请求过程,由 客户端、DNS服务器、网站 组成
A | 行为 | B |
Client | _请求NodeLoc的服务器IP_> | DNS Server |
Client | <_返回NodeLoc的服务器IP_ | DNS Server |
Client | _带上HOST请求NodeLoc_> | NodeLoc Server |
Client | <_NodeLoc - 自由地讨论互联网资源_ | NodeLoc Server |
那么为什么某墙能墙呢?让我们先了解怎么dns劫持NodeLoc(封号斗罗)
各位可能已经发现了,只需要修改 DNS Server 返回的 Nodeloc IP地址,使其请求到其他网站,某墙就是这么做的:
A | 行为 | B |
Client | _请求NodeLoc的服务器IP_> | DNS Server |
Client | <_返回NodeLoc ???的服务器IP【某墙:返回其他服务器】_ | DNS Server |
Client | _带上HOST请求NodeLoc_> | ??? Server |
Client | <_?你谁啊?_ | ??? Server |
这就是劫持的原理,要劫持NodeLoc,你需要控制权威dns服务器,可以通过网络入侵和物理入侵
现在就是来讲方法:
既然dns服务器返回的可能不可信,那么我们能不能拿到NodeLoc的IP直接访问,跳过某墙?答案是可以!
第一个就是改hosts,不过现在没什么浏览器会看hosts了,所以参数法!
Chromium 等浏览器提供了 --host-rules
,用于给开发者自定义 hosts,每个规则使用逗号分隔,使用MAP 域名 对象
转发到一个对象,但是这个对象不是ip,怎么办呢?
有一个叫--host-resolver-rules
的,和前面一样也只需要逗号分隔,格式是MAP 对象 IP
这个时候肯定恍然大悟,这不就是DNS解析吗?
是的,然后我们把它组合
--host-rules="MAP cdn.nodeloc.cc NodeLocCDN" --host-resolver-rules="MAP NodeLocCDN 188.114.97.1"
但是这个时候,问题来了,Nodeloc是https啊!这样子浏览器会阻止访问!但是Chromium也提供了屏蔽证书错误的选项(但是这样子浏览器左上角的“锁”还会提示“不安全”):
--test-type --ignore-certificate-errors
最后我们就得到使用 SNI 转发的参数:
--host-rules="MAP cdn.nodeloc.cc NodeLocCDN" --host-resolver-rules="MAP NodeLocCDN 188.114.97.1" --test-type --ignore-certificate-errors
然后只需要在启动的时候追加上去,就可以“裸连”了,还合法合规
由于笔者的Nodeloc没有被墙,没法测试,所以可能有误,还请指出
需要注意的是:--ignore-certificate-errors
有一定的风险!不要一直使用!