Forward SSH traffic through a middle machine
Place this in your .ssh/config
file on hostA (see man 5 ssh_config for details):
# .ssh/config on hostA:
Host hostC
ProxyCommand ssh hostB -W %h:%p
Now the following command will automatically tunnel through hostB
hostA:~$ ssh hostC
You may like to add options like -oCiphers=arcfour
and -oClearAllForwardings=yes
to speed things up, since wrapping ssh
inside ssh
is computationally more expensive and the extra effort and the wrapper doesn't need to be as secure when it's tunneling already-encrypted traffic.
If you are using OpenSSH earlier than 5.3, the -W
option is not available. In this case you can implement the above using netcat (nc
):
ProxyCommand ssh hostB nc %h %p # or netcat or whatever you have on hostB
Edit: This is the wrong approach. See ephemient's answer instead. This answer will work, but is potentially less secure and definitely less awesome.
It sounds like you want a solution like the following:
ssh -L localhost:22:machinec:22 machineb
This will get you a shell on machineb
. Leave this alone; minimize the terminal window.
Now, whenever you make an ssh connection to localhost
, you will actually be connected to machinec
through machineb
. When you're done with the tunnel, just close the terminal in which you ran the above command.
Note that you'll need superuser privileges to run the command.
For interactive shell you can use this simple command:
ssh -J <user>@<hostB> <user>@<hostC>
The -J options is for jump.
Sounds like you want a shell alias on A that causes ssh to occur on C
- I assume that on A, you can type ssh me@b "ssh me@c hostname" and get back "C"
- Make an alias sshc which expands sshc foo into ssh me@b "ssh me@c foo"
- For exact syntax of creating the alias, consult superuser.com