# tun2proxy Tunnel TCP traffic through SOCKS5 or HTTP on Linux. **Authentication not yet supported. Error handling incomplete and too restrictive.** ## Build Clone the repository and `cd` into the project folder. Then run the following: ``` cargo build --release ``` ## Setup A standard setup, which would route all traffic from your system through the tunnel interface, could look as follows: ```shell # Define the proxy endpoint. PROXY_IP=1.2.3.4 PROXY_PORT=1080 # Create a tunnel interface named tun0 which your user can bind to, so we don't need to run tun2proxy as root. sudo ip tuntap add name tun0 mode tun user $USER sudo ip link set tun0 up # To prevent a routing loop, we add a route to the proxy server that behaves like the default route. sudo ip route add "$PROXY_IP" $(ip route | grep '^default' | cut -d ' ' -f 2-) # Route all your traffic through tun0 without interfering with the default route. sudo ip route add 128.0.0.0/1 dev tun0 sudo ip route add 0.0.0.0/1 dev tun0 ./target/release/tun2proxy --tun tun0 --proxy socks5 --addr "$PROXY_IP:$PROXY_PORT" ``` Note that if you paste these commands into a shell script, which you then run with `sudo`, you might want to replace `$USER` with `$SUDO_USER`. For DNS to work, you might need an additional tool like [dnsproxy](https://github.com/AdguardTeam/dnsproxy) that is configured to listen on a local UDP port and communicates with the upstream DNS server via TCP. ## CLI (unstable) ``` Tunnel interface to proxy. Usage: tun2proxy [OPTIONS] --tun --proxy --addr Options: -t, --tun Name of the tun interface -p, --proxy What proxy type to run Possible values: - socks5: SOCKS5 server to use - http: HTTP server to use -a, --addr Server address with format ip:port --username Username for authentication --password Password for authentication -h, --help Print help (see a summary with '-h') -V, --version Print version ``` ## TODO - UDP support for SOCKS - Virtual DNS