Адрес, указанный в -L
, используется удаленный хост (B). Поэтому неудивительно, что у вас действительно есть туннель между A и B -L 5000: 127.0.0.1: 5000
. Когда вы подключаетесь к TCP-порту 5000 на A, соединение перенаправляется на 127.0.0.1:5000
на B.
С другой стороны -R 5001: 127.0.0.1: 5001
будет нормально, потому что адрес разрешается локальным хостом (A), а ваш пункт назначения - A. Когда вы подключаетесь к TCP-порту 5001 на B, соединение перенаправляется на 127.0.0.1:5001
на A.
Обратите внимание, что оба порта прослушивания -L
/ -R
по умолчанию привязаны к localhost
, поэтому они доступны только из A и B. соответственно. Если вы хотите разрешить другим хостам подключаться, добавьте часть bind_address
в -L
/ -R
. Достаточно простого добавления ведущего :
:
ssh -L :5000:IP_of_C:5000 -R :5001:127.0.0.1:5001 IP_of_B
с этой настройкой A подключается к 127.0.0.1:5000
, а C подключается к IP_of_B: 5001
.
Если вы предпочитаете использовать 127.0.0.1
на обоих A и C, вам необходимо установить (виртуально) прямое SSH-соединение между A и C, что возможно с SSH через SSH-туннелирование с помощью ProxyCommand
. Поместите следующее в ~ / .ssh / config
:
Host C
ProxyCommand ssh -q -W IP_of_C:22 IP_of_B
Затем подключитесь к C из A с помощью 1-переходного ssh
:
ssh -L 5000:127.0.0.1:5000 -R 5001:127.0.0.1:5001 C
На этот раз вам не нужно добавлять часть bind_address
, потому что 127.0.0.1
используется для туннельного соединения на обоих концах.