You need to connect to a machine behind NAT with no public IP and inbound traffic blocked.
The usual answers are VPN or ngrok-style tunnels, but both require setup on the target.
reverse_ssh has the target connect back to your server, then you connect using standard ssh. SCP, SFTP, port forwarding β all of it works.
Architecture
Normal SSH requires you to reach the target (needs a public IP or shared network):
| |
reverse_ssh flips it:
| |
The target only needs outbound connectivity. Firewalls almost never block outbound traffic.
Setting Up the Server
The fastest path is Docker:
| |
EXTERNAL_ADDRESS: your server’s public address β clients use this to connect backSEED_AUTHORIZED_KEYS: your SSH public key for accessing the management console
Verify it’s running:
| |
Deploying a Client
On the target machine:
| |
Or generate a ready-to-run command from the RSSH console:
| |
Connecting to a Target
Once a client connects, list it in the console:
| |
Connect using standard SSH jump host syntax:
| |
SCP and SFTP
Everything runs over standard SSH protocol, so SCP and SFTP work without any changes:
| |
Port Forwarding
| |
Punching Through Restrictive Firewalls: Multiple Transports
If the target environment only allows specific outbound traffic, RSSH supports multiple transports:
| |
The server can listen on multiple transports simultaneously. Clients choose whatever they can reach.
Persistent Connection
Auto-reconnect on boot with systemd:
| |
Use Cases
- Remote access to NAT’d devices: home NAS, IoT devices, office intranet machines
- Lab management: a fleet of VMs all connecting back to one console
- Authorized penetration testing: the tool is designed for this workflow
- Cross-firewall development: cloud CI machines reaching back to a local dev environment
Security Notes
- Lock down
authorized_keyson the server β only trusted operators should reach the console - Client binaries hardcode the server fingerprint, preventing MITM
- Back up
data/keys/β regenerating server keys breaks all deployed clients - Don’t use this on systems you don’t have authorization for
Summary
reverse_ssh’s core value: use the SSH tools you already know to work with reverse connections. Once a target is connected, everything is standard SSH β -J jump host handles the rest.
Multiple transports mean it works even in restrictive environments. HTTP polling gets out of almost any network that has internet access at all.
