2 releases
0.1.2 | Sep 25, 2024 |
---|---|
0.1.1 | Sep 12, 2024 |
0.1.0 |
|
#1695 in Network programming
209 downloads per month
Used in sockstest
66KB
1K
SLoC
SOCKS Client Library
This Rust library provides a SOCKS client implementation supporting SOCKS4, SOCKS4a, and SOCKS5 protocols. It allows users to connect, bind, and associate UDP through a SOCKS proxy.
Features
-
SOCKS4, SOCKS4a, and SOCKS5 Support: The library supports all three versions of the SOCKS protocol, allowing for a wide range of proxy compatibility.
-
TCP Connect and Bind: Users can establish TCP connections and bind to specific addresses through the proxy.
-
UDP Associate: The library supports UDP association, enabling UDP traffic to be routed through the SOCKS proxy.
-
Authentication: Supports username/password authentication for SOCKS5.
-
Asynchronous: Built using
tokio
for asynchronous I/O operations, making it suitable for high-performance applications.
Installation
Add the following to your Cargo.toml
file:
[dependencies]
libsocks_client = "0.1.2"
Usage
Creating a SOCKS Client
You can create a SOCKS client using the SocksClientBuilder
. Here’s an example of creating a SOCKS5 client:
use libsocks_client::SocksClientBuilder;
#[tokio::main]
async fn main() {
let mut client = SocksClientBuilder::new("127.0.0.1", 1080)
.socks5()
.username("user")
.password("pass")
.build_tcp_client();
let mut stream = client.connect("220.181.38.150", 80).await.unwrap();
// Use the stream to send and receive data
}
Connecting to a Target Address
To connect to a target address through the SOCKS proxy use local dns lookup:
const HTTP_REQUEST: &str = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n";
let mut stream = client.connect("www.baidu.com", 80).await?;
stream.write_all(&HTTP_REQUEST.as_bytes()).await?;
let mut buf = vec![0; 1024];
let mut response_buffer = vec![];
loop {
let n = stream.read(&mut buf).await?;
if n == 0 {
break;
}
response_buffer.extend(&buf[..n]);
}
println!("Response: {}", String::from_utf8_lossy(&response_buffer));
To connect to a target domain through the SOCKS proxy use remote dns lookup:
const HTTP_REQUEST: &str = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n";
let mut stream = client.connect_hostname("www.baidu.com", 80).await?;
stream.write_all(&HTTP_REQUEST.as_bytes()).await?;
let mut buf = vec![0; 1024];
let mut response_buffer = vec![];
loop {
let n = stream.read(&mut buf).await?;
if n == 0 {
break;
}
response_buffer.extend(&buf[..n]);
}
println!("Response: {}", String::from_utf8_lossy(&response_buffer));
Binding to a Target Address
To bind to a target address through the SOCKS proxy:
client.bind("0.0.0.0", 80).await.unwrap();
let addr = client.get_proxy_bind_addr().unwrap();
//notify server to connect to this addr
//...
//accept server connection
let mut stream = client.accept().await.unwrap();
Associating a UDP Socket
To associate a UDP socket through the SOCKS proxy:
client.udp_associate("0.0.0.0", 0).await.unwrap();
let udp = client.get_udp_socket("0.0.0.0:0").await.unwrap();
udp.send_udp_data(b"Hello", "example.com:80").await.unwrap();
let (addr, data) = udp.recv_udp_data(5).await.unwrap();
Examples
The library includes several examples in the tests
module of the lib.rs
file. You can run these tests to see the library in action:
cargo test
Contributing
Contributions are welcome! Please feel free to submit a pull request or open an issue if you encounter any problems or have suggestions for improvements.
License
This project is licensed under the MIT License. See the LICENSE file for more details.
Dependencies
~2.6–8.5MB
~75K SLoC