How to connect to a pvserver running on a node behind a gateway using a SSH tunnel
When connecting to a HPC to do some post processing, the usual scenario is as follows:
[client] —>can ssh—> [gateway] —>can ssh—> [node]
[client] —>can talk with local_port
—> [gateway] —>can talk with server_port
—> [node]
However, the ParaView client is only able to connect through a standard TCP connection, on a specific host, on a specific port.
This means, that we need to do some port forwarding between the client and the node using a SSH tunnnel. As single command (run in the client terminal):
ssh -L local_port:node:server_port user@gateway ssh user@node /path/to/pvserver --sp=server_port
Let’s disect that command:
local_port
: All packets from the client to this port will be sent through the tunnelnode:server_port
: The packets will be transfered to this host on this port. Please note that the gateway must be able to resolvenode
to an actual ip.user@gateway
: The standard ssh user and host, which is the gateway heressh user@node /path/to/pvserver --sp=server_port
: The command done on the gateway, which connect to the node and runpvserver
which listen on theserver_port
.
You can then simply connect from the client with:
./bin/paraview --server-url=cs://localhost:local_port
This setup supposes that:
- client can talk to gateway on the
local_port
- gateway can talk to node on the
server_port
Sometimes, there is no usable port so it is not possible to set it up like this, in that case:
How to reverse connect to a pvserver running on a node behind a gateway using a SSH tunnel with remote port forwarding
When only ssh connection is supported from the gateway to the node, or from the client to the gateway, then we need to use remote port forwarding.
It usually looks like this:
[client] —>can ssh—> [gateway] —>can ssh—> [node]
[client] <—can talk with local_port
<— [gateway] <—can talk with server_port
<— [node]
So we need to remote forward connection a port on a gateway to the client, the server will then reverse connect on the gateway on this port.
Please note that the ssh server on the gateway MUST have the GatewayPorts yes
instead of the default which is no
in the /etc/ssh/sshd_config
file.
First run ParaView on the client with this command:
./bin/paraview --server-url=csrc://localhost:local_port
Then create the SSH tunnel with remote port forwarding and run the server:
ssh -R server_port:localhost:local_port user@gateway ssh user@node path/to/pvserver --rc --client-host=gateway --sp=server_port
Let’s disect that command:
server_port
: All packets the gateway will receive on that port will be sent through the tunnellocalhost:server_port
: The packets will be transfered to localhost (client) on this port. Please note that the host is resolved by the client here, this is why I uselocalhost
for clarity.user@gateway
: The standard ssh user and host, which is the gateway heressh user@node /path/to/pvserver --rc --client-host=gateway --sp=server_port
: The command done on the gateway, which connect to the node and runpvserver
and reverse connect to the client through the SSH tunnel.
Please note both these usecase can be automated using .pvsc file so that the tunnling is run automatically when the ParaView user wants to connect to a server.