I have two machines, Client and Server.
Client (who is behind a corporate firewall) opens a reverse SSH tunnel to Server, which has a publicly-accessible IP address, using this command:
ssh -nNT -R0:localhost:2222 [email protected]
In OpenSSH 5.3+, the 0
occurring just after the -R
means "pick an available port" rather than explicitly calling for one. The reason I'm doing this is because I don't want to pick a port that's already in use. In truth, there are actually many Clients out there that need to set up similar tunnels.
The problem at this point is that the server does not know which Client is which. If we want to connect back to one of these Clients (via localhost) then how do we know which port refers to which client?
I'm aware that ssh reports the port number to the command line when used in the above manner. However, I'd also like to use autossh to keep the sessions alive. autossh runs its child process via fork/exec, presumably, so that the output of the actual ssh command is lost in the ether.
Furthermore, I can't think of any other way to get the remote port from Client. Thus, I'm wondering if there is a way to determine this port on Server.
One idea I have is to somehow use /etc/sshrc, which is supposedly a script that runs for every connection. However, I don't know how one would get the pertinent information here (perhaps the PID of the particular sshd process handling that connection?) I'd love some pointers.
Thanks!
If the clients each have different usernames, you can use
netstat
to find out what port that user'ssshd
process is listening on. For example:You could alter the ephemeral port range (
/proc/sys/net/ipv4/ip_local_port_range
for Linux) and then use statically allocated ports outside that range.Wouldn't a VPN be more appropriate? OpenVPN is super simple to configure. Here is a sample config and some links to guide your through the certificate creation process:
Then create a new file
/etc/openvpn/client_server.conf
and put the following in it, changing theSERVER_IP_ADDRESS
as appropriateThen build a key per user who is going to connect, and create the config file in the ccd dir
The IP address MUST be suitable for a /30 subnet (see http://www.subnet-calculator.com/cidr.php), as there is only 2 addresses available (server and client) per connection. So your next available client IP would be 192.168.100.6 and so on.
Then you now have static IPs per connecting user.
Then supply
the [email protected]
file to the end-user and use the following config fileI want the same setup like you, I increased the log level of the SSH server to DEBUG, and it showed in the logs what was the local port of the client
for example:
client command:
ssh -N -R0:127.0.0.1:5522 [email protected]
server log:
there you see the port number
You should be able to extract the relevant information from the output of:
Run as root.
Run this script on the server:
You may or may not need the two sudo's. Remove if you don't.
PS - This is a modified version of a solution I found elsewhere a while back. I think it may have come from StackOverflow, but I can't find the original reference.