Pipy 实现 SOCKS 代理
上篇我们介绍了服务网格 osm-edge 出口网关使用的 HTTP 隧道,其处理方式与另一种代理有点类似,就是今天要介绍的 SOCKS 代理。二者的主要差别简单来说就是前者使用 HTTP CONNECT
告知代理目的地址,而后者则是通过 SOCKS 协议。值得一提的是,SOCKS 也是出口网关的可选协议之一。
SOCKS 是一种网络传输协议,是 Socket Secure 的缩写,主要用于客户端与外网服务器之间通讯的中间传递。根据 OSI 模型,SOCKS 是会话层的协议,位于表示层与传输层之间。
SOCKS 协议的最新版本是 SOCKS5,在 SOCKS4 的基础上增加了 UDP、认证 和 IPv6 的支持。因此,后面提到的 SOCKS 都是使用最广泛的 SOCKS5。
先看一下 SOCKS 代理的工作流程。
协商阶段:客户端与代理建立连接,并进行协商,包括协议版本、认证的方式等等。
连接阶段:客户端告知代理要连接的目的地址和端口(SOCKS 报文),代理使用报文中的地址和端口与服务端创建连接,并将结果作为状态返回给客户端。
数据传输阶段:客户端向代理发送数据,代理将数据发送到服务端;然后将服务端返回的数据返回给客户端。
Demo
还是使用上篇中的例子,在防火墙后有个 TCP 服务端,由于监听在 127.0.0.1:8081
还能在本地访问。同样,使用 Pipy 来模拟这个服务。
接下来,在服务端一侧建立一个 SOCKS 代理。
PipyJS 编码
我们的代理监听在 8000
端口,使用 acceptSOCKS
过滤器 来处理 SOCKS 协议报文,从报文中获取目的地址和端口,然后使用该地址和端口创建到服务端的连接。
测试
在主机 192.168.1.110
上运行我们的代理以及服务端,客户端 curl
运行在主机 192.168.1.11
上。使用下面的命令进行测试:
引用链接
[1]
acceptSOCKS
过滤器:
https://flomesh.io/pipy/docs/zh/reference/api/Configuration/acceptSOCKS
版权声明: 本文为 InfoQ 作者【Flomesh】的原创文章。
原文链接:【http://xie.infoq.cn/article/18c9817432536e3a34a164793】。文章转载请联系作者。
评论