Port forwarding for Windows using PuTTY


The popular free PuTTY ssh client for Windows has almost as many options as the original OpenSSH client for *n*x systems from the OpenBSD Foundation. Among some of its lesser-known capabilities are port forwarding and port translation facilities and this article shows how to use these to open a Jupyter Notebook on a remote Linux system; for the screenshots, the compute server called cfm-ic1.ma.ic.ac.uk which has external SSH access on the "obfuscated" ssh port 10022 is used but any system and any any ssh port (including the default port 22) can be substituted for these.

If you don't already have PuTTY installed on your Windows system, you can download and install if yourself from:

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Launch PuTTY and set up the 'Basic Options for your PuTTY session' as shown below, entering the hostname of the system you want to connect to, the port it uses for ssh (by default this is 22 but is sometimes changed for security reasons) and selecting SSH as the connection type:

basic configuration settings for PuTTY

now click on 'SSH' in the left-hand pane to expand the SSH options as shown below:

PuTTY with SSH options expanded

next click on 'Tunnels' in the left-hand pane and a new window called 'Options controlling SSH port forwarding' appears:

PuTTY with options controlling SSH port forwarding expanded

now check the box 'Local ports accept connections from other hosts' and in the section headed 'Add new forwarded port', add the following settings:

Source port:    8888
Destination:    localhost:8889

click on the 'Add' button and the screen should now look like the one shown below:

PuTTY with options controlling SSH port forwarding added

now you can click on the 'Open' button, log into cfm-ic1 in the usual way and type:

jupyter notebook --no-browser --port=8889

to start jupyter notebook on port 8889 (as well as the usual port 8888) as shown below:

SSH connection established

On some systems, this simple jupyter notebook command may not work and you will get an error message such as:

OSError: [Errno 99] Cannot assign requested address

in that case try adding the

--ip=127.0.0.1

option to your command line so that it becomes

jupyter notebook --no-browser --ip=127.0.0.1 --port=8889

as shown in the screenshot below (this screenshot is actually from a different computer which is exhibiting this issue):

PuTTY with options controlling SSH port forwarding added

Note that on this particular computer, it is requesting an authentication token be entered as part of the URL and invites the user to cut and paste one of two URLs: if you do this, do remember to change the suggested port 8889 to port 8888 since you are using port translation to access this URL.

Finally, the screenshot below shows the result of starting a browser on the Windows system (Firefox in my case) to access the URL:

http://localhost:8888

What is happening is SSH has created a tunnel in parallel to the incoming connection on port 10022 which connects port 8889 on cfm-ic1 to port 8888 on the Windows system. Also, as you can see in some of the screenshots, I have previously saved my session as 'cfm-ic1_tunnel' which avoids typing in all these settings every time I connect. This is optional, of course.

PuTTY with options controlling SSH port forwarding added




Andy Thomas

Research Computing Manager,
Department of Mathematics

last updated: 7.5.2020