SSH is an extremely useful tool in that it allows you to do
many things in a secure fashion that you might not otherwise be able to do. One
of the things SSH allows you to do is to set up a reverse encrypted tunnel for
data transfer. Typically, when you initiate an SSH tunnel, you forward a port
on the local machine to a remote machine which can allow you to connect to an insecure
service in a secure way, such as POP3 or IMAP. However, you can also do the
reverse. You can forward a port on the remote machine to the local machine
while still initiating the tunnel from the local machine.

This is useful if you have a service on the remote end that
you want to have connected to something on the local machine, but you don’t
wish to open up your firewall or have SSH private keys stored on the remote
machine. By using a reverse tunnel, you maintain all of the control on the
local machine. An example usage for this would be for logging messages; by
setting up a reverse SSH tunnel, you can have a logger on the remote system
send logs to the local system (i.e., syslog-ng).

To set up the reverse tunnel, use:

$ ssh -nNT -R

What this does is initiate a connection to
and forwards TCP port 1100 on to TCP port 1100 on The “-n” option tells ssh to associate standard input with /dev/null, “-N” tells
ssh to just set up the tunnel and not to prepare a command stream, and “-T”
tells ssh not to allocate a pseudo-tty
on the remote system. These options are useful because all that is desired is
the tunnel and no actual commands will be sent through the tunnel, unlike a
normal SSH login session. The “-R” option tells ssh to set up the tunnel as a reverse tunnel.

Now, if anything connects to port 1100 on the remote system, it
will be transparently forwarded to port 1100 on the local system.

Delivered each Tuesday, TechRepublic’s free Linux NetNote provides tips, articles, and other resources to help you hone your Linux skills. Automatically sign up today!