SSH Port Forwarding (Tunneling)
SSH (Secure Shell) is a widely used protocol for system administration and file transfer. It provides secure encrypted communication between two hosts over an insecure network. One of the key features of SSH is port forwarding, also known as SSH tunneling, which allows users to create encrypted connections and forward network traffic through SSH sessions. This guide will provide a comprehensive overview of SSH port forwarding, including its types and practical examples.
Prerequisites
- Before you begin using SSH port forwarding, ensure the following prerequisites are met:
Checking SSH Server Configuration
- If using OpenSSH server, ensure AllowTcpForwarding and GatewayPorts options are appropriately configured in sshd_config.
sudo nano /etc/ssh/sshd_config
- Ensure the following lines are present and set to Yes:
AllowTcpForwarding yes GatewayPorts yes
- Restart the SSH server to apply changes.
sudo systemctl restart sshd
Installing SSH Client
- SSH client should be installed on the local computer.
- For Unix-like systems, SSH client is usually pre-installed.
- For Windows, consider using OpenSSH package from MSYS2 or Cygwin, or Putty as an alternative.
Local Port Forwarding
Definition and Usage
- Local port forwarding allows forwarding traffic from a port on the local machine to a destination server via an SSH server.
Examples
Forwarding Database Traffic
ssh -L 4000:127.0.0.1:3306 user@example.com
- This command forwards traffic from port 4000 on the local machine to port 3306 (MySQL) on the remote server.
- After executing this command, you can connect to the database on the local machine using port 4000.
Forwarding Multiple Ports
ssh -L 5901:127.0.0.1:5901 -L 4000:127.0.0.1:3306 user@example.com
- This command forwards traffic from port 5901 (VNC) and port 4000 (MySQL) on the local machine to the respective ports on the remote server.
Note
VNC stands for Virtual Network Computing. It is a graphical desktop sharing system that allows users to remotely control and interact with graphical desktops of computers or servers over a network connection.
Forwarding to Internal Servers
ssh -L 4000:server003.local:3306 user@example.com
- This command forwards traffic from port 4000 on the local machine to port 3306 (MySQL) on a server named server003.local within the internal network.
Remote Port Forwarding
Definition and Usage
- Remote port forwarding forwards traffic from a port on the SSH server to the local machine.
Examples
Sharing Local Web Application
ssh -R 7000:127.0.0.1:8000 user@example.com
- This command forwards traffic from port 7000 on the remote server to port 8000 (web application) on the local machine.
- Users can access the web application hosted on the local machine by visiting http://example.com:7000.
Configuring Remote Access to Local Resources
ssh -R 8080:192.168.100.1:8000 user@example.com
- This command forwards traffic from port 8080 on the remote server to port 8000 (web application) on the local machine at IP 192.168.100.1.
- Allows remote access to a locally hosted web application.
Dynamic Port Forwarding
Definition and Usage
- Dynamic port forwarding creates a SOCKS proxy on the local machine, allowing traffic to be forwarded through the SSH server dynamically.
Configuring Dynamic Port Forwarding
ssh -D 4000 user@example.com
- This command creates a SOCKS proxy on port 4000 on the local machine, using the SSH server as a gateway.
- Applications can be configured to use this proxy for secure communication.
Applications and Settings
- Configure application settings to use SOCKS proxy.
- Consider using browser extensions for easy proxy setup.
Additional Tips and Best Practices
Disabling Shell and Running in Background
- Use -N flag to disable shell when not needed.
- Use -f flag to run SSH in the background.
Considerations for Proxy Usage
- Avoid running HTTP servers on remote machines when using SSH as a proxy.
— Nadir Habib 2024/03/30 21:17