Encrypted Proxy Tunnel
When HTTP is all you've got.
Route SOCKS5 and HTTP(S) proxy traffic through plain HTTP, end-to-end encrypted with ChaCha20-Poly1305. Built for environments that serve HTTP but block direct TCP.
Works behind:
Architecture
Features
Dual-Protocol Listener
SOCKS5 and HTTP proxy on the same port, auto-detected from the first byte.
End-to-End Encryption
ChaCha20-Poly1305 AEAD with per-message random nonce, Argon2id key derivation.
Connection Multiplexing
Many local connections share a single SSE stream to the server.
Custom Header Injection
Cookie-authenticated reverse proxies like Cloud Shell and Codespaces.
Hot Reload
Poll config.toml every 3s and swap password, headers, and routing via ArcSwap — no restart.
Resilient Reconnect
15s SSE keepalive and 30s client read timeout auto-recover from server restarts and dropped links.
Encrypted File Transfer
push and pull files or directories over the tunnel, streamed as zstd-compressed tar archives.
Remote Shell
Open an interactive PTY session over the tunnel with full terminal resize and exit-code relay.
Installation
Homebrew
brew install aeroxy/tap/tunnixFrom Source
cargo install --git https://github.com/aeroxy/tunnixQuick Start
Start the server
tunnix server \
--listen 0.0.0.0:8080 \
--password "your-secret"Connect the client
tunnix client \
--server https://your-host \
--password "your-secret" \
--local-addr 127.0.0.1:7890Use it
Configure your application to use the proxy.
curl --socks5 127.0.0.1:7890 https://ifconfig.meTransfer files
requires --allow-transferPush and pull over the encrypted tunnel (v0.4.0+).
tunnix push ./build --server https://your-host --password "your-secret"
tunnix pull /var/log/app.log --server https://your-host --password "your-secret"Changelog
Recent releases
- ›push / pull file transfer over the tunnel
- ›Streaming zstd-compressed tar archives
- ›Global config discovery via XDG path
- ›tunnix remote-exec interactive PTY sessions
- ›Exec / Resize / ExitStatus protocol messages
- ›SSE init race condition hardened
- ›Message::Reset for graceful restart recovery
- ›15s SSE keepalive + 30s client read timeout
- ›Concurrency fix: no mutex across async sends
Stack