背景
科学上网目的
- 访问被GFW屏蔽的网站
- 需要隐藏真实IP
- 躲避网络监控
- 网络提供商ISP劫持了网络流量,导致无法正常访问某网页
常见科学上网技巧
- 普通HTTP/SOCKS代理
最常见的代理方式,然而这种连接方式未经加密,依然会遭遇连接重置,基本是完全暴露给GFW,已经不适合目前的网络环境 - 变式HTTP/SOCKS代理
目前主流翻墙方式,使用自加协议防止GFW识别阻断,并且可以使用AES等加密方式加密流量来进行代理,比较出名的有goagent和shadowsocks.
现在科学上网基本都靠翻墙,我本人使用的是shadowocks,表现比较稳定。
Shadowsocks
shadowsocks是一个socks5类型的代理,可以方便的进行科学上网
工作流程
1.客户端发出的请求基于Socks5协议跟ss-local端进行通信
2.ss-local和ss-server两端通过多种可选的加密方式进行通讯,经过GFW时时常规的TCP包,没有明显的特征码而且GFW也无法对通信数据进行解密
3.ss-server将受到的加密数据进行解密,还原原来的请求,在发送到用户需要访问的服务,获取影响原路返回
shadowsocks不容易被封杀的原因
- 建立在socks5协议之上,socks5是应用非常广泛的协议,所以无法直接封杀socks5协议
- 使用socks5协议建立连接,没有使用VPN中的服务端身份验证和密钥协商过程,而是在服务端和客户端直接写死密钥和加密算法。所以防火墙很难找到明显的特征,因为这就是个普通的socks协议
- 可以自定义加密方式和密钥,因为加密主要是防止被检测,所以要选择安全系数高的加密方式,推荐使用AES机密。
支持HTTP/HTTPS
如果本地应用只支持HTTP/HTTPS类型代理,可以使用Privoxy
将HTTP转换为SOCKS5
配置privoty
第一步:brew install privoxy
第二步:配置privoxy( /usr/local/etc/privoxy/config)
forward-socks5 / 127.0.0.1:1080 .
brew services start privoxy
第三步:修改命令行默认http/https代理(~/.zshrc)
export http_proxy=http//127.0.0.1:8118
export http_proxy=https//127.0.0.1:8118
source ~/.zshrc
curl google.com
知识扩展
socks与http代理
HTTP代理是在HTTP协议层的代理服务,只能处理HTTP/HTTPS请求,主要满足用户Web浏览网页需求,由于只处理HTTP请求,处理速度极快。
SOCKET代理不解析网络流量,传递数据包而并不关心是何种应用协议,这使得SOCKET代理可以用于多种环境,支持FTP、SMTP、HTTP等,也支持QQ、BT下载等多种应用,典型的有Shadowsocks。通常分为socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。
对于HTTP来说封禁非常简单,因为HTTP是明文的,request中带有目标url或ip地址,这样就很容易被检测到。HTTPS的话虽然通信是加密了,但是在建立连接之前要先给代理服务器发送CONNECT方法,这里也会带上要访问的远端服务器地址,这时如果代理服务器在国外,就会被检测到。
问题
浏览器使用HTTP代理访问屏蔽网站,显示连接被重置
这是GFW检测到HTTP请求中有违禁关键字,直接返回RST包导致。建议使用socks代理。为什么socks协议可以用于代理?
socks位于会话层,不关心应用层具体协议,我的理解是上层数据包裹在socks中,在客户端加密后进行传输至服务端,然后在服务端解密后交给具体上层协议处理使用代理访问与直接访问两种方式,请求上会有什么不同
浏览器直接访问 GET http://www.yahoo.com 的http请求格式为:GET / HTTP/1.1 User-Agent: Quic-Proxy ...
断点查看
而向代理服务器发送的http请求格式为:
GET http://www.yahoo.com HTTP/1.1
User-Agent: Quic-Proxy
...
也就是浏览器想代理服务器发送的http请求URI中包含了scheme和host,目的是为了让代理服务器知道这个代理请求要访问的目标服务器地址。
断点查看