PricingFAQ
Log inSign Up

Mastering SSH Port Forwarding: Local, Remote, and Dynamic Modes

Tutorials

18 Aug 2025

Mastering SSH Port Forwarding: Local, Remote, and Dynamic Modes

SSH port forwarding makes it possible for devices on an untrusted or insecure network to communicate without exposing themselves to security risks. It’s a vital technique for professionals who manage remote databases, operate distributed systems, or implement security measures.

This detailed guide covers the three main forms of SSH port forwarding—local, remote, and dynamic—providing step-by-step setup instructions, real-world examples, and troubleshooting advice. You’ll learn how to securely reach remote services, bypass restrictive firewalls, and protect sensitive data while it’s in transit. Each section includes practical demonstrations and notes on common mistakes, helping you confidently apply these methods in your own environment.

What is SSH Port Forwarding?

Secure Shell (SSH) port forwarding—also known as SSH tunneling—is a method of securely routing network traffic through an encrypted SSH connection. It establishes a protected tunnel between two computers, enabling safe data transmission even over unsecured networks such as public Wi-Fi or the open internet.

You can think of SSH port forwarding as a private, guarded passageway for your data. Just like a physical tunnel shields travelers from outside hazards, SSH tunneling safeguards your network traffic from interception or malicious interference.

There are three primary types of SSH port forwarding, each designed for different needs:

  • Local Port Forwarding (ssh -L) – Routes traffic from your local machine to a remote server. Ideal for accessing remote services as if they were running locally.
  • Remote Port Forwarding (ssh -R) – Routes traffic from a remote server to your local machine. Useful for making local services available to remote networks.
  • Dynamic Port Forwarding (ssh -D) – Creates a SOCKS proxy that can forward different types of traffic through the SSH connection. Perfect for secure browsing or accessing multiple remote services.

Next, we’ll break down each type, explore where they’re most effective, and show you exactly how to set them up.

Local Port Forwarding (ssh -L)

Local port forwarding establishes a secure, encrypted tunnel between your local machine and a remote server. It’s a versatile technique that allows you to route specific local traffic through SSH for security and access purposes.

How It Works

When you configure local port forwarding, you bind a port on your computer to a target host and port on a remote server. Any data sent to that local port is encrypted and transmitted through the SSH tunnel, then delivered to the remote destination. This ensures that all communication remains private and protected from interception.

Key Benefits

  • Bypassing Firewalls – Access services that may be blocked by a firewall while still keeping the connection secure.
  • Secure Database Connections – Encrypt all data transfers when working with remote databases, safeguarding sensitive information.
  • Remote Web Application Access – Open and use web apps hosted on remote servers as if they were running locally.
  • Development & Testing – Allow developers to interact with remote services locally, making debugging and testing more efficient.

Security Features

Because the traffic is carried over an SSH connection:

  • All transmitted data is encrypted.
  • Both ends of the connection are authenticated.
  • The tunnel blocks unauthorized access.
  • The risk of eavesdropping or tampering is eliminated.

These protections make local port forwarding a must-have for secure remote access and development workflows.

Syntax

ssh -L local_port:destination_host:destination_port username@ssh_server


Example

Suppose you’re developing an application locally but your PostgreSQL database is hosted remotely at remote-db.com on the default port 5432. You can securely connect to it using:

ssh -L 5433:localhost:5432 user@remote-db.com

Now, any connection to localhost:5433 will be securely forwarded to the remote database via the SSH tunnel. Your local application will see the database as if it’s running on your own machine, while all communication remains encrypted.

Common Pitfall: Confusing local and destination ports. For instance, if connecting to a remote MySQL server on port 3306, be sure your SSH command specifies the correct remote port to avoid failed connections.

Remote Port Forwarding (ssh -R)

Remote port forwarding sets up a secure tunnel that sends traffic from a remote server back to your local machine. It’s an effective way to make local services accessible to external users or systems without compromising security. This approach is particularly useful in situations such as:

  • Local Development Testing – Share your local development environment with remote teammates or clients for real-time feedback and testing.
  • NAT / Firewall Bypass – Allow external access when your local machine is behind NAT or a strict firewall that blocks direct inbound connections.
  • Remote Access to Local Services – Provide secure entry to services like local web servers, databases, or development tools.
  • Temporary Service Exposure – Quickly open up a local service for short-term use without changing network settings or firewall rules.

All communication is routed through an encrypted SSH tunnel, ensuring data between the remote server and your local system is secure from interception or unauthorized access.

Syntax

ssh -R remote_port:local_host:local_port username@remote_ssh_server


Example

Imagine you want to enable remote debugging of an application running locally on port 9000, making it accessible through a remote server at remote-ssh.com. You could use:

ssh -R 9000:localhost:9000 user@remote-ssh.com

Now, any traffic directed to port 9000 on the remote server will be securely forwarded through the SSH tunnel to your local machine’s port 9000. Applications or services connecting to the remote server on that port will transparently communicate with your local service.

Important Configuration Requirement

To use remote port forwarding, the remote SSH server must be configured to accept incoming connections:

1. Edit the SSH server configuration file /etc/ssh/sshd_config and enable:

GatewayPorts yes

2. Restart the SSH service to apply changes:

sudo systemctl restart sshd

Without this setting, the forwarded port on the remote server will only be accessible from localhost, limiting remote port forwarding to local connections on the server itself.

Dynamic Port Forwarding (ssh -D)

Dynamic port forwarding creates a SOCKS proxy that routes network traffic through a secure SSH tunnel, effectively masking your identity and encrypting your connection. It launches a local SOCKS proxy server on your machine, which sends all configured traffic through the SSH connection to a remote server. The remote server then makes the actual requests to the internet on your behalf.

This approach is especially useful for:

  • Secure Browsing – Encrypting all your web traffic when using public or untrusted networks.
  • Bypassing Network Restrictions – Accessing sites or services blocked by your current network.
  • Privacy Protection – Concealing your real IP address by routing traffic through the remote server.
  • Application-Level Proxying – Allowing specific apps to securely route their traffic via the SOCKS proxy.

Unlike local or remote port forwarding, dynamic port forwarding can handle multiple types of traffic and protocols, not just a single port. It operates at the application layer, making it compatible with most software that supports SOCKS proxies.

Syntax

ssh -D local_port username@ssh_server


Example

To create a secure proxy tunnel, you can run:

ssh -D 8080 user@secure-server.com

This starts a SOCKS proxy on localhost:8080. Any application configured to use this proxy will have its traffic encrypted and routed through the SSH tunnel to the remote server.

Configuring Applications to Use the SOCKS Proxy

Firefox:

  • Go to Settings > Network Settings.
  • Select Manual proxy configuration.
  • Enter 127.0.0.1 in the SOCKS Host field.
  • Enter 8080 in the Port field.
  • Select SOCKS v5 as the proxy type.

Chrome / Edge:

  • Install a SOCKS proxy extension such as Proxy SwitchyOmega.
  • Create a new proxy profile.
  • Set the proxy server to 127.0.0.1:8080.
  • Select SOCKS5 as the protocol.

System-wide (Linux/macOS):

export http_proxy="socks5://127.0.0.1:8080"
export https_proxy="socks5://127.0.0.1:8080"

This setup is ideal for secure browsing over unsecured networks, as all traffic is encrypted end-to-end. You can confirm it’s working by checking your IP address before and after enabling the proxy.

Configuring SSH Port Forwarding in the SSH Config File

Instead of typing the full SSH port forwarding command every time, you can store the configuration in your SSH config file (~/.ssh/config). This is especially useful for connections you use regularly, as it makes them quicker and easier to initiate.

Example:

Host db-forward
    HostName remote-db.com
    User user
    LocalForward 5433 localhost:5432

With this setup, you can connect by simply running:

ssh db-forward

This will automatically establish a local port forwarding tunnel from localhost:5433 to localhost:5432 on remote-db.com using the specified user account—no need to retype the entire command each time.

SSH Port Forwarding for Multiple Ports

You can forward more than one port in a single SSH session by including multiple -L (local) or -R (remote) options in the same command. This allows you to set up several port forwarding tunnels at once, which is handy when you need access to multiple services on the same server without opening separate SSH connections.

Example: Forwarding both a web server port (80) and a database port (5432) from a remote host to your local machine:

ssh -L 8080:localhost:80 -L 5432:localhost:5432 user@server.com


In this example:

  • localhost:8080 on your machine forwards to the remote server’s port 80 (web server).
  • localhost:5432 on your machine forwards to the remote server’s port 5432 (database).

All traffic is still encrypted through the single SSH tunnel, keeping connections secure while reducing the need for multiple sessions.

Common Issues and Troubleshooting

Even with correct syntax, SSH port forwarding can fail due to configuration problems, conflicts, or misunderstandings. Below are some frequent issues and how to address them.

1. Confusing Directions (Local vs. Remote)

It’s important to understand the difference between local and remote port forwarding:

  • Local (-L) – Creates a tunnel from your local machine to the remote server, letting you access remote services as if they were local.
  • Remote (-R) – Works in the opposite direction, allowing external connections to reach your local services through the SSH tunnel.

Always confirm that your chosen direction matches the task you’re trying to accomplish.

2. Port Conflicts

A port forwarding tunnel will fail if another service is already using the same port. To check and resolve:

See if the port is in use:

sudo lsof -i :

If the port is occupied, choose a different local or remote port.

Verify no other SSH tunnels are using the same port.

3. Permission Denied Errors

If you see “permission denied” or similar errors when setting up port forwarding, check the SSH server configuration:

1. Edit the SSH daemon config file:

sudo nano /etc/ssh/sshd_config

2. Ensure that the following directive is enabled:

AllowTcpForwarding yes

3. Restart the SSH service to apply changes:

sudo systemctl restart sshd

Correct server-side settings are essential, especially when forwarding ports from or to restricted environments.

Security Best Practices

To ensure SSH port forwarding remains secure and minimizes potential risks, follow these recommended practices:

1. Limit Access

Only forward the ports you actually need. Every additional open port increases your potential attack surface.

2. Use Strong Authentication

Always use SSH keys instead of passwords for authentication. Keys offer stronger protection and reduce the risk of brute-force attacks.

3. Monitor Connections

Regularly check for active SSH sessions and forwarded ports:

netstat -tulpn | grep ssh

4. Restrict Forwarding

In your SSH server configuration, limit port forwarding to specific users or IP addresses when possible:

AllowTcpForwarding yes
PermitOpen host:port

5. Use Non-Standard SSH Ports

Consider running your SSH service on a non-default port to reduce automated scanning attempts.

6. Keep Software Updated

Update both your SSH client and server regularly to patch any known vulnerabilities.

7. Monitor Logs

Enable SSH logging and review logs frequently for signs of suspicious activity:

sudo tail -f /var/log/auth.log

Following these practices will help ensure that your SSH tunnels remain both secure and reliable.

Conclusion

Mastering SSH port forwarding is an essential skill for anyone who works with remote systems, as it can dramatically improve both security and efficiency. This versatile feature enables you to securely manage network traffic in a wide range of scenarios—from development and testing to production deployments.

By understanding and applying local, remote, and dynamic forwarding, you equip yourself with powerful tools to protect sensitive data, bypass restrictive firewalls, and optimize your workflow.

The flexibility of SSH port forwarding makes it a cornerstone of modern remote operations. Whether you’re connecting to databases, debugging applications, or securely exposing local services to the outside world, these techniques provide the foundation for safe, streamlined, and reliable connectivity.

Take Your SSH Port Forwarding Skills to the Next Level with a Reliable VPS

Ready to put your new SSH port forwarding knowledge into action?

Get a fast, secure, and affordable VPS from nanohost.org and start building with confidence.

With Nanohost, you’ll get:

High-Performance Servers – Perfect for development, hosting, and secure tunneling.

🌍 Multiple Locations – Choose the region closest to you or your users.

🔒 Enterprise-Grade Security – Keep your data safe with DDoS protection and encrypted connections.

📈 Scalable Resources – Upgrade anytime as your needs grow.

💬 24/7 Expert Support – Real humans, always ready to help.

Whether you’re securing database access, testing applications, or managing production systems, having a reliable VPS is the foundation of a smooth workflow.

👉 Start today at nanohost.org — servers from just $8/month.

linuxtutorialsubuntusshhow-to

Read also

Linux Essentials: Step-by-Step Guides

Linux Essentials: Step-by-Step Guides

Tutorials

Learn the basics of the Linux terminal — what it is, how the shell and command prompt work, and how to run your first commands.

Linux Reboot Command Detailed Tutorial

Linux Reboot Command Detailed Tutorial

Tutorials

Learn how to reboot a Linux system the right way. This guide explains safe reboot methods, common issues, and practical tips for servers, desktops, and automated scripts.

Mastering SSH Port Forwarding: Local, Remote, and Dynamic Modes

Mastering SSH Port Forwarding: Local, Remote, and Dynamic Modes

Tutorials

SSH port forwarding is a secure method for accessing remote services, bypassing firewalls, and protecting sensitive data over untrusted networks. This guide covers the three main types—local, remote, and dynamic—with setup steps, real-world use cases, troubleshooting tips, and examples to help you apply them effectively.

Products

Server in the United StatesServer in the United KingdomServer in NetherlandsServer in SingaporeServer in Poland

NOVPS CLOUD LTD ©2025