你是Socket,我是HTTP Proxy
你想知道的HTTP Proxy
我们所说的HTTP Proxy,本质就是基于HTTP的代理服务(此处Proxy仅仅就是“代理”的英文说法)。可以说目前所有程序都是支持HTTP代理的,很多高级编程语言像golang,对本机HTTP代理配置的读取就非常方便,所谓“编程友好”。
我对HTTP代理的最初印象,就是刚参加工作的时候,如果想上公网,就需要在浏览器端配置HTTP代理。当时就觉得很神奇,问了团队里的大神,他说,通过那个代理地址,本机HTTP请求会发到一个能访问外网的服务器上,然后将HTTP请求的结果通过代理再返回给本机。我说,好cool啊,就饶有兴致地自己研究起来,知道了PAC,即Proxy auto-config,意为代理自动配置。PAC文件,本质上是一段JavaScript代码,里面包含了最重要的方法叫 FindProxyForURL,通过这个方法,分析本机的HTTP请求,是否需要走代理(请求公司内网地址不需要走代理),以及提供一个合适的代理服务器地址(如果你在中国,PAC可以给你走一个China的代理,这样速度更快)。下图为PAC截图:
简单易用的HTTP代理,也有它明显的缺点,来看看HTTP的本质。
HTTP本身是一种协议,处于7层OSI的应用层,所谓协议,指的是同一层的交换所遵循的约定(引用自《图解TCP/IP》)。HTTP协议是基于TCP连接的,主要解决如何包装数据。HTTP连接(请求)是短时连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉。
这样的属性,导致HTTP代理可能是不稳定的。而且,由于没有任何加密 ,HTTP发出的请求,都是暴露在公网上的,居心不良的玩家和组织完全可以截获并重置你的请求。
所以简单部署的HTTP代理,是不安全不可靠的。如果喜欢HTTP代理,建议使用GoAgent,这款老牌代理工具,使用谷歌服务器代理,速度快,较稳定,并且对用户请求进行了安全的封装。曾经的不方便之处就是访问HTTPS网站,会出现无法访问的问题,因为HTTPS请求需要配合证书才能正确打开,现在GoAgent工具包里默认提供了常用网站证书,大多数情况下使用顺滑。
你想知道的Socket
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),所谓接口,指的是不同层之间交换所遵循的约定。通过Socket,才能使用TCP/IP协议。与HTTP连接不同,Socket连接是长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉,但是由于各种环境因素可能会使连接断开。
我对Socket的最初印象,就是在大学时期上的第一堂JAVA上机课,主题是通过创建client socket和server socket,实现一对一的聊天程序,由于Socket支持TCP和UDP两种不同的协议,所以如果你创建的Socket连接是基于UDP协议的,那你的聊天程序是不可靠的(当时的我想法是,这样的不靠谱的协议,谁会用啊)。
单Socket而言,估计用nodejs的同学会比较熟悉著名的socket.io。而在科学上网领域,就不得不提基于Socket的ShadowSocks工具。这里的Socks不是简单的Socket缩写,事实上Socks是一种协议(写为SOCKS更适合),设计者把几组经典的Socket编程模型,定义成SOCKS协议,目的是拥有高权限的用户访问一般用户无法访问的外部资源。听起来,这个协议设计初衷就充满了想要“科学上网”的意味。
目前常用的SOCKS协议是SOCKS5,IETF里的代号为RFC1928,1996年被确认。虽说已服役10年,但是其普及率还是不及HTTP,很多应用程序还没有原生支持SOCKS5。
说回ShadowSocks,它最初是由Clowwindy在github上开源(有兴趣的同学可以去瞻仰下大神的头像)。关于它的运行原理,引述wikipedia上的描述:
在服务器端部署完成后,用户需要按照指定的密码、加密方式和端口使用客户端软件与其连接。在成功连接到服务器后,客户端会在用户的电脑上构建一个本地Socks5代理。浏览网络时,网络流量会被分到本地socks5代理,客户端将其加密之后发送到服务器,服务器以同样的加密方式将流量回传给客户端,以此实现代理上网。
本质上,ShadowSocks就是使用SSH隧道技术配合SOCKS5协议,实现了加密通信,而SSH的本质就是建立加密的Socket连接。可惜,正如上文提到的,不是所有程序都支持SOCKS协议,可能就无法完美享受ShadowSocks带来的便利了。
当然,在伟大的程序员眼里,这些从来不是个事儿。上帝说要有光,于是乎,有了proxychains和privoxy。
proxychains是一个命令行工具
- 在MAC下通过
homebrew install proxychains-ng
即可完成安装。 - 安装完成后,进行简单的配置,修改
/usr/local/etc/proxychains.conf
文件,一般是最后两行,下图是我的配置:
- 配置完成后,使用方式也很简单,如:
proxychains4 wget https://www.twitter.com
proxychains4 git clone https://github.com/rofl0r/proxychains-ng
它的工作原理是hook 了目标程度的 sockets 相关的操作,让目标程序的 Sockets 数据走 SOCKS/HTTP 代理。详细解释,可以看看这篇文章。
privoxy是个可以创建代理链的工具
当初想要测试一个用golang写的小程序,需要访问墙外资源,用proxychains不好使,因为这个程序里没有对SOCKS协议做相关支持,但是有对本机HTTP代理配置的读取。所以想着,有没有一种软件可以将SOCKS协议转成HTTP代理,于是乎就找到了privoxy。
- 它提供一种“SOCKS转发”机制,即:
Privoxy 面向用户提供HTTP代理入口,然后把自己收到的 HTTP 请求转给另一个 SOCKS 代理;如果需要的话,还可以由这个 SOCKS 代理再转给另一个 HTTP 代理
。详细解释,可以看这篇文章。我把这种机制称之为代理链。 - privoxy在MAC上安装同样可以通过
homebrew install privoxy
(提供的可能不是最新稳定版本,可以到这个官网地址找到最新版本) - 修改
/usr/local/etc/privoxy/config
配置文件,跟proxychains类似,也是在文件最后,添加类似:
listen-address 0.0.0.0:8118 # 本地提供的HTTP代理入口 forward-socks5 / 127.0.0.1:1234 # SOCKS代理入口
然后就可以使用export http_proxy;https_proxy
传统方式,为本机添加HTTP代理入口,建议在终端里添加相关alias命令缩写,随用随开启。如:
参考链接
- http://itindex.net/detail/47119-socket-http
- https://github.com/rofl0r/proxychains-ng
- http://wrfly.kfd.me/SOCKS%E4%BB%A3%E7%90%86%E5%92%8CHTTP%E4%BB%A3%E7%90%86%E7%9A%84%E5%8C%BA%E5%88%AB/
- http://chinadigitaltimes.net/chinese/2016/01/shadowsocks-%E7%9A%84%E7%BF%BB%E5%A2%99%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%A4%E7%AF%87%EF%BC%89/
- https://cokebar.info/archives/236