起因
在蚯蚓构思之初,我在网上集中搜集过socks代理的知识,发现网上的很多资料都把 “Socks代理”和”socket端口转发”混为一谈。于是我决定写这样一篇文章,来辨析一下它们之间的异同。
Socket端口转发
lcx.exe 就是一个基于 socket 套接字实现的端口转发工具,它是从 linux 下的htran 工具移植到windows平台的。
一条正常的socket隧道必具备两端,一侧为服务端,它会监听一个端口等待客户端连接;
另一侧为客户端,通过传入服务端的ip和端口,才能主动连接到服务器。
而端口转发工具(lcx.exe/htran)的工作原理其实是将两条 socket 隧道对接起来,打造一条可“异步双向通讯”的转接隧道。由于合法的socket隧道有两种接口分别对应服务端和客户端,根据数学中的排列组合可计算出端口转发供具有4种工作状态,它们是:
1.“客户端” 接 “客户端”
2.“客户端” 接 “服务端”
3.“服务端” 接 “客户端”
4.“服务端” 接 “服务端”
又由于端口转发为“异步双向通讯”隧道,隧道转接不分先后,所以状态2和状态3 是相同的,合并之后,便分别对应了lcx的三种工作模式,如下所示:
1、slave “客户端” 接 “客户端”
2、tran “服务端” 接 “客户端”
3、listen “服务端” 接 “服务端”
于是便可理解lcx工具的三种命令参数的格式为何是以下的样子了:
–listen ConnectPort TransmitPort
–tran ConnectPort TransmitHost TransmitPort
–slave ConnectHost ConnectPort TransmitHost TransmitPort
Socks代理
Socks 代理从名字中的“代理”二字就可以了解它的功能核心:那就是帮他人完成socket访问网络。
有过翻墙经历的同学大概知道浏览器(IE/Chrome/FireFox等)有设置socks代理的配置项,可用来访问网络的能力。当我们通过代理服务器访问一个网址时,socks服务器其实是起到了一个中间人的身份,他分别与两方(浏览器/被访问的网站)通讯然后将获取到的结果告知另一方。
在使用代理服务的过程中我们会发现,只要配置好socks代理后,就不再需要指定被访问目标,直接在浏览器的地址栏输入地址就能访问任意网站。这是由于socks代理中有一个交互协议,当我们准备访问一个网站并敲击回车时,浏览器会先发送一个被访问目标的基本信息(URL和服务端口)给socks服务端,socks服务端解析了这个信息后,会代替浏览器去访问目标网站,并将访问结果回复给浏览器端。这便是socks代理的工作原理了。
通过这段对socks代理的描述,可知socks代理其实可理解为一个增强版的 lcx -tran 它在服务端监听一个服务端口(ConnectPort),当有新的连接请求时会从socks协议中解析出访问目标的URL(TransmitHost)的目标端口(TransmitPort),再开始执行lcx -tran 的具体功能。
两者的异同
1.socket端口转发无需通讯协议支持,而socks代理需要socks协议支持。
2.socket端口转发有三种工作方式,而socks代理仅有一种工作方式。
3.如果说socks是帮他人访问网络(一对多),那么端口转发就是帮他人访问主机的某个端口(一对一)。
一句话总结:
这篇笔记从“socket端口转发”和 “socks代理” 两者的工作原理出发,介绍了两者的区别。