#socks5-proxy #async-networking #socks5 #socks-proxy #sock-proxy

socks5-impl

Fundamental abstractions and async read / write functions for SOCKS5 protocol and Relatively low-level asynchronized SOCKS5 server implementation based on tokio

41 releases

Uses new Rust 2024

0.6.2 Mar 17, 2025
0.6.0 Dec 14, 2024
0.5.17 Nov 8, 2024
0.5.14 Jun 21, 2024
0.1.8 Mar 18, 2023

#143 in Network programming

Download history 271/week @ 2024-12-04 683/week @ 2024-12-11 240/week @ 2024-12-18 198/week @ 2024-12-25 543/week @ 2025-01-01 258/week @ 2025-01-08 195/week @ 2025-01-15 423/week @ 2025-01-22 186/week @ 2025-01-29 243/week @ 2025-02-05 473/week @ 2025-02-12 374/week @ 2025-02-19 899/week @ 2025-02-26 2282/week @ 2025-03-05 1727/week @ 2025-03-12 1533/week @ 2025-03-19

6,494 downloads per month
Used in 8 crates (6 directly)

GPL-3.0-or-later

115KB
2.5K SLoC

socks5-impl

Fundamental abstractions and async read / write functions for SOCKS5 protocol and Relatively low-level asynchronized SOCKS5 server implementation based on tokio.

This repo hosts at socks5-impl

Version Documentation License

Features

  • Fully asynchronized
  • Supports all SOCKS5 commands
    • CONNECT
    • BIND
    • ASSOCIATE
  • Customizable authentication
    • No authentication
    • Username / password
    • GSSAPI

Usage

The entry point of this crate is socks5_impl::server::Server.

Check examples for usage examples.

Example

use socks5_impl::protocol::{handshake, Address, AuthMethod, Reply, Request, Response, StreamOperation};

fn main() -> socks5_impl::Result<()> {
    let listener = std::net::TcpListener::bind("127.0.0.1:5000")?;
    let (mut stream, _) = listener.accept()?;

    let request = handshake::Request::retrieve_from_stream(&mut stream)?;

    if request.evaluate_method(AuthMethod::NoAuth) {
        let response = handshake::Response::new(AuthMethod::NoAuth);
        response.write_to_stream(&mut stream)?;
    } else {
        let response = handshake::Response::new(AuthMethod::NoAcceptableMethods);
        response.write_to_stream(&mut stream)?;
        let _ = stream.shutdown(std::net::Shutdown::Both);
        let err = "No available handshake method provided by client";
        return Err(std::io::Error::new(std::io::ErrorKind::Unsupported, err).into());
    }

    let req = match Request::retrieve_from_stream(&mut stream) {
        Ok(req) => req,
        Err(err) => {
            let resp = Response::new(Reply::GeneralFailure, Address::unspecified());
            resp.write_to_stream(&mut stream)?;
            let _ = stream.shutdown(std::net::Shutdown::Both);
            return Err(err.into());
        }
    };

    match req.command {
        _ => {} // process request
    }

    Ok(())
}

License

GNU General Public License v3.0

Dependencies

~0.5–9MB
~82K SLoC