A desktop proxy management tool with a modern web-based UI for managing HTTP/HTTPS, WebSocket, and Stream (TCP/UDP) reverse proxies.
SSLProxyManager is based on Tauri 2 + Rust, providing a management interface (frontend: Vue 3 + Vite + Element Plus) for configuring and managing:
- HTTP/HTTPS reverse proxy
- WebSocket (WS/WSS) reverse proxy
- Stream (TCP/UDP) Layer 4 proxy
- Static resource hosting
- Access control (LAN/whitelist/blacklist)
- Rate limiting
- Metrics storage and query
- Request logs and historical data
- Runtime status and log viewing
- Dashboard with real-time statistics
-
HTTP/HTTPS Proxy (rules/routes)
- Multiple listen nodes (
listen_addr/listen_addrs) - TLS (certificate/private key)
- Basic Auth (with optional header forwarding)
- Routing: path prefix matching + optional conditions (Host / HTTP methods / request headers)
- Request/response body replacement supports optional
content_typesfiltering (byContent-Type) - Upstream list (with weights)
proxy_pass_pathpath rewriting- Static directory priority (
static_dir) - Header injection (
set_headers) - Follow redirects configuration
- HTTP/2 support (optional)
- Compression (gzip/brotli)
- Multiple listen nodes (
-
WebSocket Proxy (ws_proxy)
- Each WS rule can be independently enabled
- WS global switch
ws_proxy_enabled(when globally disabled, WS listeners will not start) - TLS support (WSS)
- Path-based routing
-
Stream Proxy (TCP/UDP, stream)
listen_portlisten port (TCP or UDP)proxy_passbinds to upstream name- Upstream supports consistent selection by client IP (default
hash_key = "$remote_addr") proxy_connect_timeout/proxy_timeout(string format, e.g.,300s)
-
Access Control
- IP whitelist/blacklist
- LAN access control (allow all LAN)
- Separate controls for HTTP, WS, and Stream proxies
-
Metrics & Monitoring
- Real-time metrics collection
- Historical metrics storage (SQLite)
- Request logs with filtering and query
- Dashboard with statistics and charts
- Real-time log viewer
-
Application Features
- System tray integration
- Auto-start on system boot
- Single instance mode
- Auto-update check
- Internationalization (English/Chinese)
- Dark/Light theme support
- Backend: Rust (Tauri 2), Axum, Tokio, SQLx
- Frontend: Vue 3, Vite, Element Plus, ECharts, Vue I18n
- Key Libraries:
- HTTP/WebSocket: Axum, Hyper, Tokio-Tungstenite
- TLS: Rustls
- Database: SQLite (via SQLx)
- Configuration: TOML
src/: Rust backend codefrontend/: Frontend project (Vite)tauri.conf.json: Tauri configuration (dev/build commands, devUrl, frontendDist, etc.)config.toml: Runtime configuration (can be placed in project root in development mode)config.toml.example: Configuration example
- Node.js + npm
- Rust toolchain (stable)
cd frontend
npm installExecute in the project root directory:
npm run tauri:dev
This command will, according to tauri.conf.json:
- First enter
frontendand executenpm run dev - Then start Tauri and load
http://localhost:5173
Execute in the project root directory:
npm run tauri:build
This command will:
- First enter
frontendand executenpm run build(output:frontend/dist) - Then package with Tauri
The project uses TOML for configuration.
- Development mode (debug): If
config.tomlexists in the project root, it will be read with priority. - Linux production mode: Default location
~/.config/SSLProxyManager/config.toml
It is recommended to refer directly to
config.toml.example.
[[rules]]: Listen nodelisten_addr: Legacy single listen address (kept for backward compatibility)listen_addrs: Preferred multiple listen addresses, e.g.[":8888", ":8889"](if empty, falls back tolisten_addr)ssl_enable: Whether to enable TLScert_file/key_file: Certificate and private key pathsbasic_auth_enable/basic_auth_username/basic_auth_passwordbasic_auth_forward_header: Whether to forward theAuthorizationheader to upstreamroutes: Routes listssl_enable: Whether to enable TLScert_file/key_file: Certificate and private key pathsbasic_auth_enable/basic_auth_username/basic_auth_password
[[rules.routes]]: Routepath: Path prefix matchinghost: Optional host constraint (supports exact match and wildcard like*.example.com)methods: Optional HTTP method constraint (e.g.["GET","POST"])headers: Optional request header constraint (exact match; supports wildcard*in expected value)static_dir: Static directory (optional)proxy_pass_path: Forward path rewriting (optional)exclude_basic_auth: Whether this route skips Basic Auth (optional)follow_redirects: Whether the proxy follows upstream 30x redirects (optional)[rules.routes.set_headers]: Header injection (optional)request_body_replace/response_body_replace: Body replacement rules (optional)content_types: Optional Content-Type filter for this replace rule (comma-separated, e.g.text/html,application/json)
[[rules.routes.upstreams]]: Upstream list (optional)
-
ws_proxy_enabled: WS global switch (defaulttrue)false: WS listeners will not start (even if a ws rule has enabled=true)true: Then each ws rule'senabledtakes effect
-
[[ws_proxy]]: WS listen rule listenabled: Whether to enable this rulelisten_addr: Listen address, e.g.,0.0.0.0:8800ssl_enable: Whether to enable TLS (wss)cert_file/key_file: Certificate and private key paths[[ws_proxy.routes]]path: Path prefixupstream_url: Upstream WS address, e.g.,ws://127.0.0.1:9000
Stream is used for Layer 4 proxy: listen on a TCP/UDP port and forward to upstream.
[stream]enabled: Global switch[[stream.upstreams]]name: Upstream name (referenced byproxy_pass)hash_key: Default$remote_addr(consistently select upstream by client IP)consistent: Currently reserved as a configuration item[[stream.upstreams.servers]]addr:host:portweight/max_fails/fail_timeout: Fields reserved (can be enhanced in future strategies)
[[stream.servers]]enabled: Whether to enablelisten_port: Listen portudp:false=TCP,true=UDPproxy_pass: Reference upstream'snameproxy_connect_timeout: e.g.,300sproxy_timeout: e.g.,600s
You can use the following Nginx stream configuration to understand the correspondence:
stream { upstream sendimage { hash $remote_addr consistent; server 59.xx.xx.xx:8089 max_fails=1 fail_timeout=30s; } server { listen 50002; proxy_pass sendimage; proxy_connect_timeout 300s; proxy_timeout 600s; } }
The equivalent configuration in this project can be found in the [stream] section of config.toml.example.
ws_proxy_enabled: Enable/disable WebSocket proxy globally (defaulttrue)http_access_control_enabled: Enable HTTP access control (defaulttrue)ws_access_control_enabled: Enable WebSocket access control (defaultfalse)stream_access_control_enabled: Enable Stream proxy access control (defaulttrue)allow_all_lan: Allow all LAN IPs (defaulttrue)auto_start: Auto-start proxy service on application launch (defaulttrue)show_realtime_logs: Show real-time logs in UI (defaultfalse)realtime_logs_only_errors: Show only error logs in real-time view (defaultfalse)stream_proxy: Legacy field (use[stream].enabledinstead)max_body_size: Maximum request body size in bytes (default10485760= 10MB)max_response_body_size: Maximum response body size in bytes (default10485760= 10MB)upstream_connect_timeout_ms: Upstream connection timeout in milliseconds (default5000)upstream_read_timeout_ms: Upstream read timeout in milliseconds (default30000)upstream_pool_max_idle: Maximum idle connections in connection pool (default100)upstream_pool_idle_timeout_sec: Idle connection timeout in seconds (default60)enable_http2: Enable HTTP/2 support (defaultfalse)
[[whitelist]]: IP whitelist entriesip: IP address or CIDR notation (e.g.,127.0.0.1or192.168.1.0/24)
[metrics_storage]: Metrics storage configurationenabled: Enable metrics storage (defaulttrue)db_path: SQLite database file path (e.g.,/path/to/metrics.db)
[update]: Auto-update configurationenabled: Enable update checking (defaulttrue)server_url: Update server URL (empty for default)auto_check: Automatically check for updates (defaulttrue)timeout_ms: Update check timeout in milliseconds (default10000)ignore_prerelease: Ignore pre-release versions (defaulttrue)
The application provides a comprehensive web-based management interface:
- Dashboard: Real-time statistics, metrics charts, and service status
- Base Configuration: Global settings and proxy service controls
- HTTP/HTTPS Proxy Config: Configure reverse proxy rules and routes
- WebSocket Proxy Config: Configure WS/WSS proxy rules
- Stream Proxy Config: Configure TCP/UDP Layer 4 proxy
- Access Control: Manage IP whitelist/blacklist
- Metrics Storage: View and manage metrics database
- Request Logs: Query and filter historical request logs
- Log Viewer: Real-time log viewing with filtering
- About: Version information and update checking
-
Q: What port does the frontend development server use?
A: The default port is5173(seedevUrlintauri.conf.json). -
Q: How do I change the frontend dev/build commands?
A: Modifybuild.beforeDevCommand/build.beforeBuildCommandin the root directory'stauri.conf.json. -
Q: Where is the configuration file located?
A: In development mode, ifconfig.tomlexists in the project root, it takes priority. In production (Linux), the default location is~/.config/SSLProxyManager/config.toml. -
Q: How do I enable auto-start on system boot?
A: Setauto_start = trueinconfig.toml, and the application will automatically start the proxy service on launch. -
Q: Can I hide the application to system tray?
A: Yes, clicking the close button will hide the window to the system tray instead of exiting. You can quit from the tray menu. -
Q: How do I view historical metrics?
A: Enable metrics storage in the configuration, then use the "Metrics Storage" tab in the UI to query historical data. -
Q: How do I configure access control?
A: Use the "Access Control" tab to manage IP whitelist/blacklist, or edit[[whitelist]]entries inconfig.toml.
This project is for learning and legal, compliant network proxy/reverse proxy configuration management scenarios only. Use of this software may involve network access control, certificate management, traffic forwarding, and other operations, with potential risks including but not limited to data leakage, service interruption, configuration errors leading to security risks, etc. You are responsible for evaluating and assuming all risks and responsibilities when using this project.
- Legal Compliance: Please ensure your use complies with local laws and regulations and relevant network service terms. It is prohibited to use this project for any unauthorized penetration, attacks, bypassing access controls, data theft, spreading malware, infringing on others' privacy, or any other illegal or unauthorized purposes. Any legal liability, administrative penalties, third-party claims, and related consequences arising from your use of this project for illegal, non-compliant, or unauthorized activities shall be borne by you, and the authors and contributors assume no responsibility.
- No Warranty: This project is provided "as is" without any express or implied warranty (including but not limited to fitness, reliability, accuracy, availability, error-free/defect-free, etc.).
- Limitation of Liability: The authors and contributors assume no responsibility for any direct or indirect losses (including but not limited to profit loss, data loss, business interruption, equipment or system damage, etc.) caused by the use or inability to use this project.
If you do not agree to the above terms, please do not use, distribute, or develop based on this project.
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.