8 个版本
使用旧的 Rust 2015
0.2.5 | 2018 年 3 月 4 日 |
---|---|
0.2.3 | 2018 年 2 月 18 日 |
0.1.3 | 2018 年 2 月 18 日 |
#1314 in 异步
16KB
279 行
socksv5_future
Socks5 协议由以下步骤组成的握手过程
- 客户端建立与 socks5 服务器的 TCP 连接
- 客户端发送包含支持的认证方法列表的认证请求。
- 服务器选择一个适当的认证方法并将其发送回客户端。
- 客户端发送 socks5 请求,其中主要包含目标地址和端口
- 服务器建立与目标地址的连接并回答客户端的请求
这是两个 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)
依赖项
~6MB
~93K SLoC