Skip to main content

Auto-forward SSH ports

Project description

SSH Auto Port Forwarder

Automatically detect and forward ports from a remote SSH server to your local machine. Similar to VS Code's port forwarding feature, but fully automatic.

Dashboard

Features

  • Interactive TUI dashboard - View and manage tunnels in real-time
  • Automatically discovers listening ports on the remote server
  • Shows process names for each forwarded port
  • Forwards ports to your local machine via SSH tunneling
  • Handles port conflicts by finding alternative local ports
  • Auto-detects new ports and starts forwarding
  • Auto-detects closed ports and stops forwarding
  • Reads connection details from your SSH config
  • Skips well-known ports (< 1000) by default
  • Configurable max auto-forward port (default: 10000)

Installation

With uv (recommended):

uvx ssh-auto-forward hetzner

Install with pip:

pip install ssh-auto-forward

Install locally:

cd portforwards
uv sync

Running

Dashboard mode (default):

ssh-auto-forward hetzner

CLI mode (headless):

ssh-auto-forward hetzner --cli

With uvx (no installation):

uvx ssh-auto-forward hetzner

Dashboard Controls

Key Action
X / Enter Toggle port (open if closed, close if opened)
O Open URL in browser (for forwarded ports)
R Refresh port list
L Toggle log panel
Q Quit

Options

-v, --verbose              Enable verbose logging
-i, --interval SECS        Scan interval in seconds (default: 5)
-p, --port-range MIN:MAX   Local port range for remapping (default: 3000:10000)
-s, --skip PORTS           Comma-separated ports to skip (default: all ports < 1000)
-c, --config PATH          Path to SSH config file
-m, --max-auto-port PORT   Maximum port to auto-forward (default: 10000)
--include-configs          Include ports already forwarded via SSH config LocalForward
--cli                      Run in CLI mode instead of dashboard
--version                  Show version and exit

Examples

# Dashboard mode (default)
ssh-auto-forward hetzner

# CLI mode
ssh-auto-forward hetzner --cli

# Scan every 3 seconds
ssh-auto-forward hetzner -i 3

# Use specific port range
ssh-auto-forward hetzner -p 4000:9000

# Skip specific ports
ssh-auto-forward hetzner -s 22,80,443

# Verbose mode
ssh-auto-forward hetzner -v

# Only auto-forward ports up to 5000 (higher ports shown but not auto-forwarded)
ssh-auto-forward hetzner -m 5000

# Include ports already forwarded via SSH config LocalForward
ssh-auto-forward hetzner --include-configs

Performance

Throughput is 150-190 MB/s for large file transfers (45-70% of native ssh -L). HTML page latency is 2-3 ms median at up to 10 req/s with zero failures. The overhead comes from paramiko (Python) vs OpenSSH (C) - negligible for interactive use like web browsing.

See benchmarks/ for full methodology and results.

How it works

  1. Connects to your remote server using your SSH config
  2. Runs ss -tlnp on the remote to find listening ports
  3. Creates SSH tunnels for each discovered port
  4. Continuously monitors for new/closed ports
  5. Handles port conflicts on your local machine

SSH Config Integration

The tool reads your SSH config file (~/.ssh/config) for connection details. It also respects LocalForward directives:

Host myserver
    HostName example.com
    User myuser
    LocalForward 8080 localhost:8080  # This port is excluded by default
    LocalForward 3000 localhost:3000

By default, ports that are already forwarded via LocalForward are excluded from the dashboard list since they're handled by SSH itself. Use --include-configs to show them.

Status messages

✓ Connected!
✓ Forwarding port 2999 (python3)
✓ Forwarding port 7681 (ttyd)
✓ Forwarding remote port 19840 -> local port 3000 (node)
✗ Remote port 2999 is no longer listening, stopping tunnel

Testing

Start a test server on your remote machine:

ssh hetzner "python3 -m http.server 9999 --bind 127.0.0.1 &"

Then run ssh-auto-forward hetzner and access it locally:

curl http://localhost:9999/

Stopping

  • Dashboard: Press Q
  • CLI mode: Press Ctrl+C

Requirements

  • Python 3.10+
  • paramiko
  • textual (for TUI dashboard)
  • Remote server must have ss or netstat command available

Tests

Unit tests (run locally, no SSH required):

uv run pytest tests/ -v

Integration tests (Docker, default):

uv run pytest tests_integration/ -v

This starts a Docker container with SSH server and tests against it.

Integration tests (real SSH server):

SSH_AUTO_FORWARD_TEST_HOST=your-server uv run pytest tests_integration/ -v

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ssh_auto_forward-0.0.3.tar.gz (66.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ssh_auto_forward-0.0.3-py3-none-any.whl (25.3 kB view details)

Uploaded Python 3

File details

Details for the file ssh_auto_forward-0.0.3.tar.gz.

File metadata

  • Download URL: ssh_auto_forward-0.0.3.tar.gz
  • Upload date:
  • Size: 66.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for ssh_auto_forward-0.0.3.tar.gz
Algorithm Hash digest
SHA256 50d6906ad1d114220a10d51f2755bbf9c636517715f8b61750d5e11a8e9c58b6
MD5 655a348319229694fe3e3039825d842f
BLAKE2b-256 c40515f31104c0ff8ab82fee636511a52f71f8f336a0954db0b01004bb8751e3

See more details on using hashes here.

File details

Details for the file ssh_auto_forward-0.0.3-py3-none-any.whl.

File metadata

File hashes

Hashes for ssh_auto_forward-0.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 0a1a2209ca4821590f28bb2d91ef5c51a53bfd61425b16b39d5c108c462c75a7
MD5 103cbbe53c5a7407ce4b3f184be3f542
BLAKE2b-256 cc9bbc63653fa7e6c516e670024b3894dd67e69690478e671d5e890752baffb9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page