O endereço especificado em -L é usado pelo host remoto (B). Portanto, não é de admirar que você realmente tenha um túnel entre A e B por -L 5000:127.0.0.1:5000 . Quando você está se conectando à porta TCP 5000 em A, a conexão é encaminhada para 127.0.0.1:5000 em B.
Por outro lado -R 5001:127.0.0.1:5001 seria bom porque o endereço é resolvido pelo host local (A) e seu destino é A. Quando você está se conectando à porta TCP 5001 em B, a conexão é encaminhada para 127.0.0.1:5001 em A.
Observe que as duas portas de escuta -L / -R estão vinculadas a localhost por padrão, portanto, elas estão disponíveis somente em A e B, respectivamente. Se você quiser permitir que outros hosts se conectem, adicione a parte bind_address em -L / -R . Apenas adicionar um : à esquerda seria suficiente:
ssh -L :5000:IP_of_C:5000 -R :5001:127.0.0.1:5001 IP_of_B
com essa configuração A conecta-se a 127.0.0.1:5000 e C conecta IP_of_B:5001 .
Se você preferir usar 127.0.0.1 em A e C, será necessário estabelecer uma conexão SSH (praticamente) direta entre A e C, o que é possível com o SSH sobre o tunelamento SSH por ProxyCommand . Coloque o seguinte em ~/.ssh/config :
Host C
ProxyCommand ssh -q -W IP_of_C:22 IP_of_B
Em seguida, conecte-se a C de A com 1-hop ssh :
ssh -L 5000:127.0.0.1:5000 -R 5001:127.0.0.1:5001 C
Desta vez, você não precisa adicionar bind_address part porque 127.0.0.1 é usado para a conexão de túnel em ambas as extremidades.