Dynamic Port Forwarding (SOCKS Proxy)¶
Overview¶
Dynamic port forwarding creates a SOCKS proxy that routes all traffic through the SSH connection. Unlike local/remote forwarding (single destination), dynamic forwarding works for any destination.
┌──────────────────────────────────────────────────────────────────────────┐
│ Dynamic Port Forwarding (SOCKS) │
│ │
│ Your Machine SSH Server Internet │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ │ │ │ │ │ │
│ │ SOCKS │──────────┤ SSH │──────────┤ Any Site │ │
│ │ :1080 │ SSH │ Server │ Normal │ │ │
│ │ │ Tunnel │ │ Traffic │ │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ Browser → SOCKS proxy → SSH → google.com, github.com, etc. │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Use cases: Browse internet as if from remote server, bypass geo-restrictions, secure browsing on untrusted networks.
Basic Syntax¶
Basic Usage¶
Create SOCKS Proxy¶
Creates a SOCKS5 proxy on localhost:1080.
Tunnel Only¶
Background¶
Browser Configuration¶
Firefox¶
- Settings → Network Settings → Settings
- Manual proxy configuration
- SOCKS Host:
127.0.0.1, Port:1080 - SOCKS v5
- Check "Proxy DNS when using SOCKS v5"
Chrome¶
Chrome uses system proxy, or launch with flags:
System-Wide (macOS)¶
System Preferences → Network → Advanced → Proxies: - Check "SOCKS Proxy" - Server: 127.0.0.1:1080
System-Wide (Linux)¶
export ALL_PROXY=socks5://127.0.0.1:1080
export HTTP_PROXY=socks5://127.0.0.1:1080
export HTTPS_PROXY=socks5://127.0.0.1:1080
DNS Through SOCKS¶
Problem¶
By default, DNS queries might not go through the proxy, leaking your real location.
Browser Solution¶
Firefox: Enable "Proxy DNS when using SOCKS v5"
Chrome: Uses system DNS by default
Command Line Tools¶
# curl (built-in SOCKS support with DNS)
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me
# wget (doesn't support SOCKS natively, use proxychains)
proxychains wget https://example.com
Proxychains¶
Route any program through the SOCKS proxy.
Install¶
Configure¶
# /etc/proxychains4.conf
strict_chain
proxy_dns
tcp_read_time_out 15000
tcp_connect_time_out 8000
[ProxyList]
socks5 127.0.0.1 1080
Usage¶
# Any command
proxychains curl https://ifconfig.me
proxychains nmap -sT -p 80 target.com
proxychains wget https://example.com
SOCKS4 vs SOCKS5¶
| Feature | SOCKS4 | SOCKS5 |
|---|---|---|
| TCP | ✅ | ✅ |
| UDP | ❌ | ✅ |
| IPv6 | ❌ | ✅ |
| Authentication | ❌ | ✅ |
| DNS via proxy | ❌ | ✅ |
SSH creates a SOCKS5 proxy.
SSH Config¶
# ~/.ssh/config
Host proxy
HostName server.example.com
User admin
DynamicForward 1080
Compression yes
Usage:
Multiple Proxies¶
Multiple Servers¶
# Proxy 1
ssh -D 1080 user@server1.example.com
# Proxy 2 (different terminal)
ssh -D 1081 user@server2.example.com
Chain Through Jump Host¶
Common Use Cases¶
Secure Browsing on Public WiFi¶
ssh -D 1080 -C user@home-server.example.com
# Configure browser to use SOCKS proxy
# All traffic encrypted to your home server
Access Geo-Restricted Content¶
# Connect to server in desired country
ssh -D 1080 user@us-server.example.com
# Browse as if from that country
Access Internal Resources¶
Scanning Through Proxy¶
ssh -D 1080 user@server.example.com
# In another terminal
proxychains nmap -sT -Pn -p 80,443 internal-target.com
API Testing from Different IP¶
ssh -D 1080 user@server.example.com
curl --socks5-hostname 127.0.0.1:1080 https://api.example.com/endpoint
Persistent SOCKS Proxy¶
Using autossh¶
autossh -M 0 -f -N -D 1080 \
-o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" \
user@server.example.com
Systemd Service¶
# /etc/systemd/system/socks-proxy.service
[Unit]
Description=SOCKS Proxy via SSH
After=network.target
[Service]
User=youruser
ExecStart=/usr/bin/ssh -N -D 127.0.0.1:1080 \
-o ServerAliveInterval=60 \
-o ExitOnForwardFailure=yes \
user@server.example.com
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
Performance Options¶
Enable Compression¶
Faster Cipher (If CPU-Limited)¶
Verify Proxy is Working¶
Check External IP¶
# Without proxy
curl https://ifconfig.me
# With proxy
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me
Check DNS¶
Troubleshooting¶
Proxy Not Working¶
# Check SSH tunnel is active
ss -tlnp | grep 1080
# Check you can connect to proxy
curl --socks5 127.0.0.1:1080 http://example.com
Slow Performance¶
# Enable compression
ssh -D 1080 -C user@server.example.com
# Check server bandwidth
# Your speed is limited by the SSH server's connection
DNS Leaking¶
# Ensure DNS goes through proxy
# Firefox: Enable "Proxy DNS"
# curl: Use --socks5-hostname not --socks5
Connection Drops¶
# Add keep-alive
ssh -D 1080 -o ServerAliveInterval=60 user@server.example.com
# Use autossh for auto-reconnect
Security Notes¶
- Traffic visible at exit: The SSH server sees unencrypted HTTP traffic
- Server logs: The server can log your browsing
- HTTPS recommended: Use HTTPS sites for end-to-end encryption
- Trust your server: Only use servers you control or trust
- Not a VPN: Only TCP traffic, no system-wide routing
Comparison¶
| Tool | Encryption | All Apps | Easy Setup | Speed |
|---|---|---|---|---|
| SSH SOCKS | ✅ | Manual | ✅ | Good |
| VPN | ✅ | ✅ | Medium | Good |
| Tor | ✅ | Manual | ✅ | Slow |
| Commercial proxy | Varies | Manual | ✅ | Varies |