#客户端-服务器 #sock #未来 #tokio

socksv5_future

服务器和客户端的 Socks v5 futures

8 个版本

使用旧的 Rust 2015

0.2.5 2018 年 3 月 4 日
0.2.3 2018 年 2 月 18 日
0.1.3 2018 年 2 月 18 日

#1314 in 异步

MIT 许可证

16KB
279

socksv5_future

Socks5 协议由以下步骤组成的握手过程

  1. 客户端建立与 socks5 服务器的 TCP 连接
  2. 客户端发送包含支持的认证方法列表的认证请求。
  3. 服务器选择一个适当的认证方法并将其发送回客户端。
  4. 客户端发送 socks5 请求,其中主要包含目标地址和端口
  5. 服务器建立与目标地址的连接并回答客户端的请求

这是两个 futures 的实现

  • SocksHandshake
  • SocksConnectHandshake

根据 RFC 1928,这不是一个符合 socks5 标准的实现,因为不支持 GSSAPI 认证方法。

SocksHandshake

这是服务器端的实现。它实现了步骤 2 到 4。步骤 5 由这个 future 实现。socks5 请求是 future 结果的一部分。

SocksConnectHandshake

这是客户端的实现。它执行步骤 2-5。

用例 socks5 转发器

客户端的 socks5 请求被原封不动地发送到 socks 代理。以下代码段展示了主要思想(此代码无法编译)

    let mut lp = Core::new().unwrap();
    let handle = lp.handle();
    let addr = "127.0.0.1:8888".parse::<SocketAddr>().unwrap();
    let listener = TcpListener::bind(&addr, &handle2).unwrap();
    let server = listener.incoming().for_each(move |(socket, _addr)| {
        handle.spawn(
            socks_handshake(socket)
                .and_then(move |(source,request)| {
                    let proxy = "xx.xx.xx.xx:8888".parse::<SocketAddr>().unwrap();
                    let connect = TcpStream::connect(&proxy,&handle);
                    connect.and_then(move |dest|{
                        socks_connect_handshake(dest,request)
                    })
                    .and_then(|(stream,req_answer)|{
                        write_all(source,req_answer)
                    })
                    .and_then(|(stream,buf)|{
                        // perform transfer source<->stream
                    });
                })
        );
        Ok(())
    });
    handle.spawn(server)

Build Status

依赖项

~6MB
~93K SLoC