Pipy 实现 SOCKS 代理

上篇我们介绍了服务网格 osm-edge 出口网关使用的 HTTP 隧道,其处理方式与另一种代理有点类似,就是今天要介绍的 SOCKS 代理。二者的主要差别简单来说就是前者使用 HTTP CONNECT 告知代理目的地址,而后者则是通过 SOCKS 协议。值得一提的是,SOCKS 也是出口网关的可选协议之一。

SOCKS 是一种网络传输协议,是 Socket Secure 的缩写,主要用于客户端与外网服务器之间通讯的中间传递。根据 OSI 模型,SOCKS 是会话层的协议,位于表示层与传输层之间。

SOCKS 协议的最新版本是 SOCKS5,在 SOCKS4 的基础上增加了 UDP、认证 和 IPv6 的支持。因此,后面提到的 SOCKS 都是使用最广泛的 SOCKS5。

先看一下 SOCKS 代理的工作流程。

b9003b6ec899d8190e941fab5669b6ac.png
socks-proxy-process
  1. 1. 协商阶段:客户端与代理建立连接,并进行协商,包括协议版本、认证的方式等等。

  2. 2. 连接阶段:客户端告知代理要连接的目的地址和端口(SOCKS 报文),代理使用报文中的地址和端口与服务端创建连接,并将结果作为状态返回给客户端。

  3. 3. 数据传输阶段:客户端向代理发送数据,代理将数据发送到服务端;然后将服务端返回的数据返回给客户端。

Demo

fd5da69f36a0e4804f5ea784ba3fd5d4.png
socks-proxy-demo

还是使用上篇中的例子,在防火墙后有个 TCP 服务端,由于监听在 127.0.0.1:8081 还能在本地访问。同样,使用 Pipy 来模拟这个服务。

pipy()

  .listen('127.0.0.1:8081')
  .replaceData(
    () => new Data('Hi, TCP!\n')
  )

接下来,在服务端一侧建立一个 SOCKS 代理。

96890e3f7edd1d09e9728f0bc1dea68f.png
socks-proxy

PipyJS 编码

我们的代理监听在 8000 端口,使用 acceptSOCKS 过滤器[1] 来处理 SOCKS 协议报文,从报文中获取目的地址和端口,然后使用该地址和端口创建到服务端的连接。

pipy({
  _host: null,
  _port: null,
})
  //socks
  .listen(8000)
  .acceptSOCKS(
    (host, port) => (
      _host = host,
      _port = port,
      true // return true to accept the session
    )
  ).to(
    $ => $.connect(
      () => `${_host}:${_port}`
    )
  )

测试

在主机 192.168.1.110 上运行我们的代理以及服务端,客户端 curl 运行在主机 192.168.1.11 上。使用下面的命令进行测试:

curl -x socks5://192.168.1.110:8000 telnet://127.0.0.1:8081
6bcf9d0e56ea4615afd6b4808df028ec.gif
test-socks-proxy
引用链接

[1] acceptSOCKS 过滤器: https://flomesh.io/pipy/docs/zh/reference/api/Configuration/acceptSOCKS

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值