A.I, Data and Software Engineering

How to Setup SSH Tunneling in Mac OS (or Ubuntu)


When working with Jupyter notebooks on AWS, I want to interact with it directly in my browsers. In order to do so, we may need to create an SSH tunnel from our laptop to the remote server. If you are using a Macbook, you can easily do so using the default Terminal application available in the Mac OS. Yes, we do not have to install any other application for doing so, as we do in Windows.

If you are a Windows user, I would recommend using Mobaxterm/Putty application for doing this.

What is SSH Tunneling?

An SSH tunnel or SSH port forwarding is a mechanism to establish a secure connection between a client machine and a server.

Let’s take a simple example to understand this. If we have a database server, let’s say MySQL running on a remote server with some IP address XXX.XXX.XXX.XXX and for which the port 3306. In this case, if you want to access the DB server from your local machine, you won’t be able to do it. In such a scenario, we set up an SSH tunnel with the remote server, to securely connect to the local network of the remote server to access the 3306 port on the remote server.

Let’s take another example If we are using AWS service and we have two servers one is a DB server and another is the SSH server on which the Web Server is running. For security, the DB server is never exposed to the internet. It is kept on the local network, which will be accessible via the SSH server.

Now, if you want to do something on the DB server, you won’t be able to do it directly. But because the DB server is accessible via the SSH server, we can set up an SSH tunnel with the SSH server to reach the DB server.

I hope the two examples are clear, and now you know, why SSH tunnelling is needed. So let’s see how we can do this.

Using MacOS/Ubuntu Terminal

We can use the ssh command to set up an SSH tunnel with a remote server, considering the SSH port which is port number 22 is open for the remote server.

If our remote server name is my-remote-server.host and the SSH user is st-user, and on the same server, a DB service let’s say MySQL is installed which is accessible via localhost:3306 on the remote server.

setup ssh tunnel in macos

Then to connect to the DB server, we can run the following command to set up an SSH tunnel:

ssh -L 8888: st-user@my-remote-server.host



8888: This is the local port that we will open for the SSH tunnel on the local machine. Here you can give any port number after 1024 because, until the 1024 port number, all ports are privilege ports. This is the IP for the localhost running on the remote server. This is also the destination we aim to reach via the SSH server.

3306: This is the destination port, assigned to the MySQL server on the remote SSH server.

and then st-user@my-remote-server.host is the username and the IP address/URI for the SSH server.

Once you do this, you will be prompted to enter the password for the user st-user, so enter the password and hit Enter, and the SSH tunnel will be created. Now, you will be able to access the MySQL server using address from your local machine.

Using a .pem (or Cer) file

If your remote server is an EC2 instance on AWS and you have a .pem file as the SSH key, run the following command:

ssh -L 8888: -i <path-of-pem-file> st-user@my-remote-server.host


In this case, you will not be asked for the password, as authentication will be done using your SSH key.

This was the case where the DB server was running on the local host of the remote server. In case, you are using a Jupyter notebook like me, you can type the command as follows:

ssh -L 8888: -i <path-of-pem-file> ubuntu@your-ec2-address

Next, let’s see how to connect to a separate DB server via a remote server.

Connect to Destination server via Remote Server:

If our DB server is my-db-server.host on which port 3306 is available for connection on the private network access to the remote SSH server my-remote-server.host, as shown in the picture below.

setup ssh tunnel in macos or ubuntu

Then we can run the following command:

ssh -L 8888:my-db-server.host:3306 st-user@my-remote-server.host


Note: If SSH connection is enabled on a different port other than port 22, then we can specify the port number in the above command using -p [PORT_NUMBER] argument. So, for example, we have 2200 port for SSH enabled on our remote server, then the command would be:

ssh -L 8888:my-db-server.host:3306 -p 2200 st-user@my-remote-server.host



I hope this article helped you in understanding what SSH tunnelling is and how we can set it up. Do share in the comments below if you have any questions.

Add comment


A.I, Data and Software Engineering

PetaMinds focuses on developing the coolest topics in data science, A.I, and programming, and make them so digestible for everyone to learn and create amazing applications in a short time.