V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
dynos01
V2EX  ›  分享创造

做了一个 Rust 的代理库(SOCKS5 等),想寻求些建议

  •  
  •   dynos01 · 2023-03-14 17:02:56 +08:00 · 1674 次点击
    这是一个创建于 655 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同时在 Rust 官方论坛发了贴 https://users.rust-lang.org/t/built-a-proxy-crate-looking-for-suggestions/90862/1,内容是一样的。

    刚刚用 Rust 不久,前些阵子需要在程序中用到代理,查了一趟发现没有一个通用的代理库,那就干脆自己糊一个练手了。现在刚刚做了一个看起来能用的版本,想来寻求一些意见建议。

    库名叫 proxie,链接在此 GitHub docs.rs。当前还没来得及写文档,文档是 Cargo 生成的。基本用法如下:

    use tokio::{io::{AsyncWriteExt, BufReader, AsyncBufReadExt}};
    use futures::future;
    use proxie::{SOCKS5Proxy, tokio::AsyncProxy};
    
    #[tokio::main]
    async fn main() {
        let n_thread = 10;
        let mut handles = vec![];
    
        for _ in 0..n_thread {
            handles.push(tokio::spawn(async {
                let request = format!("GET / HTTP/1.1\r\n\r\n");
    
                let server = SOCKS5Proxy::new("127.0.0.1", 1080, None);
                let mut stream = server.connect("example.com:80").await.unwrap();
    
                //let mut stream = TcpStream::connect("example.com:80").await.unwrap();
                stream.write_all(request.as_bytes()).await.unwrap();
                stream.flush().await.unwrap();
    
                let mut reader = BufReader::new(&mut stream);
                let mut buffer = String::new();
    
                loop {
                    reader.read_line(&mut buffer).await.unwrap();
    
                    if buffer.ends_with("\r\n\r\n") {
                        break;
                    }
                }
    
                print!("{}", buffer);
            }));
        }
    
        future::join_all(handles).await;
    }
    

    或者带认证的话

    ...
    use proxie::{SOCKS5Proxy, tokio::AsyncProxy, Auth};
    ...
    let server = SOCKS5Proxy::new("127.0.0.1", 1080, Auth::new("user", "pass"));
    ...
    

    总之基本上就是在 TcpStream 上套了一层壳。除此之外还有 async-std 版本和同步的 std::net 版本,也支持 HTTP 代理。用法都是一样的。具体的运行时用 features 打开:

    proxie = { version = "0.0.2", features = ["enable_tokio"] }
    //Available features: "enable_tokio", "enable_async_std" and "enable_sync".
    

    此外是接下来的计划:

    • 完善文档
    • SOCKS5 UDP 支持
    • HTTPS 代理和 SOCKS4a 代理(低优先级,好像很少有人用)
    • 完善套的壳,把各个 TcpStream 上所有的方法都实现了,实现无痛接入
    • 单元测试

    现在比较关心的地方是这套面向用户的接口是否合理?如果可能的话还是希望尽快稳定 API 以后就不改了。感觉好像还行,听听大佬们建议。

    差不多就是这样了,提前感谢一切意见建议!如果有人也在寻找类似的库的话欢迎来帮忙测试一下!

    5 条回复    2023-03-14 20:43:50 +08:00
    xieren58
        1
    xieren58  
       2023-03-14 17:08:04 +08:00
    不错不错...
    molezznet
        2
    molezznet  
       2023-03-14 17:22:00 +08:00
    就是想流畅的用个网络 搜搜资料 发发推
    在用 rust tuic ……
    rekulas
        3
    rekulas  
       2023-03-14 17:23:18 +08:00
    可以考虑支持前置代理
    dynos01
        4
    dynos01  
    OP
       2023-03-14 17:33:44 +08:00 via iPhone
    @molezz765 这个可能跟我的库目标不太一样…不过试试配置国内源,会快很多

    @rekulas 这个可以有!想了下链式代理也不难实现,记下来了。感谢!
    chuanqirenwu
        5
    chuanqirenwu  
       2023-03-14 20:43:50 +08:00
    有没有类似 proxier 这样的替代品?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1812 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:22 · PVG 00:22 · LAX 08:22 · JFK 11:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.