Bird
Raised Fist0
Linux CLIscripting~5 mins

SSH tunneling (port forwarding) in Linux CLI - Commands & Configuration

Choose your learning style10 modes available
Introduction
Sometimes you need to securely access a service on a remote computer that is not directly reachable. SSH tunneling lets you create a secure path through your SSH connection to forward network traffic from your local machine to the remote service.
When you want to access a database on a remote server that is blocked by a firewall.
When you need to securely browse a website through a remote server.
When you want to connect to a remote desktop or application that only listens on localhost of the remote machine.
When you want to encrypt traffic between your local machine and a remote service without changing the service itself.
When you need to bypass network restrictions by forwarding ports through an SSH server.
Commands
This command creates an SSH tunnel that forwards your local port 8080 to port 80 on the remote server example.com. You can then access the remote web server by opening http://localhost:8080 on your local machine.
Terminal
ssh -L 8080:localhost:80 user@example.com
Expected OutputExpected
user@example.com's password:
→
-L - Specifies local port forwarding in the format local_port:remote_host:remote_port
This command tests the SSH tunnel by sending an HTTP request to the local forwarded port 8080, which is tunneled to the remote server's port 80.
Terminal
curl http://localhost:8080
Expected OutputExpected
<!DOCTYPE html> <html> <head><title>Example Domain</title></head> <body> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents.</p> </body> </html>
This command sets up remote port forwarding. It forwards port 9090 on the remote server to port 3000 on your local machine. This allows users on the remote server to access your local service running on port 3000.
Terminal
ssh -R 9090:localhost:3000 user@example.com
Expected OutputExpected
user@example.com's password:
→
-R - Specifies remote port forwarding in the format remote_port:local_host:local_port
This command creates a local port forwarding tunnel for MySQL (port 3306) without opening a remote shell (-N). It forwards your local port 3306 to the remote server's port 3306, useful for database connections.
Terminal
ssh -N -L 3306:localhost:3306 user@example.com
Expected OutputExpected
No output (command runs silently)
→
-N - Do not execute remote commands, useful for port forwarding only
→
-L - Local port forwarding
Key Concept

If you remember nothing else from SSH tunneling, remember: port forwarding securely sends local or remote traffic through an encrypted SSH connection to access services behind firewalls or on localhost.

Common Mistakes
Using the wrong port numbers or hostnames in the forwarding syntax.
The tunnel will not connect to the intended service, causing connection failures.
Double-check the local port, remote host, and remote port values to match the service you want to access.
Not using the -N flag when only port forwarding is needed.
An unnecessary remote shell session opens, which may be confusing or unwanted.
Use -N to prevent opening a remote shell when you only want to forward ports.
Trying to forward ports that are already in use on the local or remote machine.
The SSH command will fail with an error about the port being busy.
Choose free ports on both local and remote sides before setting up the tunnel.
Summary
Use ssh -L to forward a local port to a remote service through SSH.
Use ssh -R to forward a remote port to a local service through SSH.
Use the -N flag to create tunnels without opening a remote shell session.

Practice

(1/5)
1. What does the SSH command ssh -L 8080:localhost:80 user@remote do?
easy
A. Creates a VPN connection between your machine and the remote server
B. Forwards remote port 8080 to your local port 80
C. Forwards your local port 8080 to port 80 on the remote server's localhost
D. Copies files from port 8080 on remote to port 80 locally

Solution

  1. Step 1: Understand the -L option in SSH

    The -L option sets up local port forwarding, mapping a local port to a remote address and port.
  2. Step 2: Analyze the command ports and hosts

    Local port 8080 is forwarded to port 80 on the remote server's localhost, allowing local access to remote web service.
  3. Final Answer:

    Forwards your local port 8080 to port 80 on the remote server's localhost -> Option C
  4. Quick Check:

    ssh -L local_port:remote_host:remote_port = local to remote [OK]
Hint: Remember -L means local port to remote host:port [OK]
Common Mistakes:
  • Confusing -L with -R (remote forwarding)
  • Mixing up local and remote ports
  • Thinking it copies files instead of forwarding ports
2. Which of the following is the correct syntax to forward local port 3306 to remote port 3306 on host db.example.com using SSH?
easy
A. ssh -L 3306:db.example.com:3306 user@remote
B. ssh -R 3306:db.example.com:3306 user@remote
C. ssh -F 3306:db.example.com:3306 user@remote
D. ssh -P 3306:db.example.com:3306 user@remote

Solution

  1. Step 1: Identify the correct option for local port forwarding

    The -L flag is used for local port forwarding, which forwards a local port to a remote host and port.
  2. Step 2: Check the syntax correctness

    ssh -L 3306:db.example.com:3306 user@remote correctly forwards local port 3306 to remote db.example.com port 3306.
  3. Final Answer:

    ssh -L 3306:db.example.com:3306 user@remote -> Option A
  4. Quick Check:

    -L for local forwarding syntax [OK]
Hint: Use -L for local forwarding, not -R or others [OK]
Common Mistakes:
  • Using -R instead of -L for local forwarding
  • Using invalid flags like -F or -P
  • Swapping local and remote ports
3. What will be the output of the following command if you run ssh -L 9000:localhost:5432 user@remote and then connect your local machine to port 9000?

Assuming PostgreSQL runs on port 5432 on the remote server, what happens?
medium
A. You connect to the remote PostgreSQL database through local port 9000
B. You connect to a local PostgreSQL database on your machine on port 5432
C. The SSH connection fails because port 9000 is blocked
D. You connect to port 9000 on the remote server directly

Solution

  1. Step 1: Understand the port forwarding setup

    The command forwards local port 9000 to remote localhost port 5432, where PostgreSQL runs.
  2. Step 2: Analyze the connection effect

    Connecting locally to port 9000 actually connects through SSH tunnel to remote PostgreSQL on port 5432.
  3. Final Answer:

    You connect to the remote PostgreSQL database through local port 9000 -> Option A
  4. Quick Check:

    Local port 9000 tunnels to remote 5432 [OK]
Hint: Local port connects to remote service via tunnel [OK]
Common Mistakes:
  • Thinking it connects to local PostgreSQL instead
  • Assuming SSH connection fails without checking firewall
  • Confusing local and remote ports
4. You tried to run ssh -L 8080:localhost:80 user@remote but get an error: "bind: Address already in use". What is the most likely cause and fix?
medium
A. Remote port 80 is blocked; use a different remote port
B. Local port 8080 is already used; choose a different local port
C. User authentication failed; check username and password
D. SSH service is not running on remote server

Solution

  1. Step 1: Understand the error message

    "bind: Address already in use" means the local port 8080 is occupied by another process.
  2. Step 2: Fix by changing local port

    Choose a different unused local port (e.g., 8081) to avoid conflict.
  3. Final Answer:

    Local port 8080 is already used; choose a different local port -> Option B
  4. Quick Check:

    Port bind error means local port busy [OK]
Hint: Check if local port is free before forwarding [OK]
Common Mistakes:
  • Assuming remote port or authentication causes bind error
  • Ignoring local port conflicts
  • Not checking running processes using the port
5. You want to securely access a web service running on port 5000 of a remote server at 192.168.1.10, but the server only allows SSH connections. Which command correctly sets up a tunnel so you can open http://localhost:7000 in your browser to access the remote service?
hard
A. ssh -L 5000:localhost:7000 user@192.168.1.10
B. ssh -R 7000:localhost:5000 user@192.168.1.10
C. ssh -L 7000:192.168.1.10:5000 user@localhost
D. ssh -L 7000:localhost:5000 user@192.168.1.10

Solution

  1. Step 1: Identify the correct port forwarding direction

    You want to forward your local port 7000 to remote port 5000 on the server 192.168.1.10.
  2. Step 2: Verify the command syntax

    ssh -L 7000:localhost:5000 user@192.168.1.10 forwards local port 7000 to remote localhost port 5000 correctly.
  3. Final Answer:

    ssh -L 7000:localhost:5000 user@192.168.1.10 -> Option D
  4. Quick Check:

    Local port 7000 tunnels to remote 5000 [OK]
Hint: Local port first, then remote host:port in -L [OK]
Common Mistakes:
  • Using -R instead of -L for local forwarding
  • Swapping local and remote ports
  • Incorrect remote host or user syntax
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard