GFW
常规的 http 或者是 https 请求被墙(假设它没有被墙)的网站
- 首先你在浏览器里面键入 google.com, 然后回车
- 浏览器发起 DNS 请求获取 google.com 的 IP 地址(因为TCP连接必须要ip地址, 域名只是为了让人好记忆而发明出来的), DNS 服务器查询 google.com 的 IP 地址, 然后返回给浏览器.
- 浏览器拿到了 google.com 的IP地址, 然后向这个 IP 地址发起 TCP 连接, 三次握手之后连接成功.
- 然后到了 HTTP 协议的时间了, 浏览器向 google 的服务器发送 HTTP 请求头(因为此时 TCP 连接已经建立, 可以发送数据了), 请求头其实就是一段字符串.无论是 HTTP 请求还是加密的 HTTPS 请求, 请求头都是不会被加密的.
1
2
3
4
5
6GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
... - google.com 收到请求头, 如果是 HTTPS 请求, 还要交换秘钥什么的, 这个就不解释了, 总之就是 google.com 把数据返回回来了.
在上述过程中墙的作用
- 我们键入 google.com 的时候浏览器需要先发起 DNS 请求查询 google.com 的 IP 地址, 如果拿不到这个 IP 地址, 不就无法和 google.com 的真实 IP 地址通讯了吗, 所以 墙 的初期手段就是污染 DNS, AI, 浏览器任你发送 DNS 请求, 国内的 DNS 服务器就给你返回一个错误的 IP 地址, 什么冰岛的,什么澳大利亚的地址给你, 去访问吧, 浏览器很懵, 有可能这个 IP 地址压根就没有被绑定服务器, 然后服务器不可达. 但是 DNS 请求需要我们的浏览器发起, 既然 DNS 请求能被污染, 如果我自己知道正确的 google.com IP地址, 我来告诉浏览器正确的 IP 地址不就行了吗, 刚开始想要科学上网的人确实是这么做的, 在 window 系统
C:\Windows\System32\drivers\etc该目录下面有一个 hosts 文件, Mac 系统下面的为/etc/hosts, 如果操作系统能在这里获得关于域名的 IP 地址, 就不会向 DNS服务器发起请求了, 所以都赶忙去找 google.com 的真实 IP 地址填在这里来让操作系统不要去其他的 DNS 查询了. 这个时期应该是成功的度过了一段时间吧, 当然我没有经历过, 我想科学上网的时候 google.com 的 IP 地址已经被封了🧐.忘了一件事情, 因为 DNS 服务器在公网上面有很多, 而且都是免费的, 出名的 8.8.8.8 就是谷歌提供的, 你可以自己填写自己的操作系统的 DNS 地址, 应该有一段时期可以把 DNS 服务器修改为 8.8.8.8, 谷歌并不会返回错误的地址, 所以后来 8.8.8.8 也被墙了👽. - 墙 继续升级, 既然你们能搞到真实的 google.com 的 IP 地址, 那我就把所有已知的 google.com 的 IP 地址全部封了, 但是 google.com 的服务器是可以换 IP 地址的, 你可以试一下, 多访问几次 google.com, 有可能是不相同的, 所以只是把已知的 google.com 服务器的 IP 地址封掉并不能完全的阻挡, 所以 墙 从 HTTP 协议入手了, HTTP 协议请求头的发送全部是明文的, 无论是 HTTP, 还是 HTTPS, 请求头全部都是明文的, 请求头里面有 google.com, 这就很尴尬了, 这个域名没有办法隐藏, 墙 很开心, 好了, 所有经过我这里的数据包都要被拆开看看你访问的地址是不是违禁地址, 如果是的就不要继续了, 墙 会模拟 google.com 的服务器给你的电脑发送一个 RST TCP响应, 电脑的TCP协议看到这个响应就会无条件的重置连接, 所以你会看到有时候你能拿到正确的 google.com 的IP地址, 也会看到浏览器提示你连接被重置, 这时候的 RST 的响应可是墙发给你的, 是不是感觉很荣耀😀, 然后 墙 还会模仿客户端给 google.com 的服务器发送 RST 响应, google.com 以为是你发的, 也会无条件的关闭 TCP 连接
SS如何穿墙
有一个代理协议叫做socks5, 可以帮助你穿透防火墙, 由socks5负责传递双方的数据
shadowsocks 把 socks5 拆成了两个部分
client ——-> ssclient ——> ssserver ———> server
client 把数据传递给 ssclient, 这就是你为什么要把 socks5 客户端的地址要填写 ssclient 监听的地址, ssclient 把数据加密, 包括 DNS 请求什么的一切数据全部加密发送给 ssserver(并且 ss 没有握手阶段, 没有明显的数据特征能辨识这个是 ss 流量), ssserver 把数据解密拿到 client 想要访问的域名, 然后发起 DNS 请求获取 IP 地址(这也就是为什么你的 VPS 要放在国外的原因), 然后和这个 IP 地址握手, 然后服务器响应, ssserver 并不负责处理数据, 只是原样把数据加密回传给 ssclient, ssclient 解密数据然后传递给浏览器, 浏览器负责数据的辨识处理(因为 HTTPS 还需要进一步的握手).
服务器的购买以及shadowsocks配置
购买服务器
上面的连接包含搬瓦工的一键配置ss,但是这个自带的太low了好多加密模式它都没有这就造成容易被墙ip 采用下面的连接配置ss 或 ssr
配置shadowsocks server
这个教程中的脚本将各种shadowsocks的版本都集成好了,具体在安装的时候选择即可
感谢您的阅读,本文由
Space-X
版权所有。如若转载,请注明出处:Space-X(https://spaces-x.github.io/2018/07/21/GFW/)