Назад | Перейти на главную страницу

SSH RemoteForward не работает с общим управляющим сокетом

Мой ~ / .ssh / config содержит:

ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p

Host hostname.example
    # TextMate rmate port
    RemoteForward :52698 localhost:52698

Когда я устанавливаю начальное соединение с хостом, он успешно создает главный файл сокета в ~/.ssh-lachlanhunt@hostname.example:22.

Но когда я открываю новый терминал и пытаюсь установить второе соединение, я получаю следующую ошибку:

$ ssh hostname.example
mux_client_forward: forwarding request failed: remote port forwarding failed for listen port 52698
muxclient: master forward request failed
ControlSocket /Users/lachlanhunt/.ssh/socket-lachlanhunt@hostname.example:22 already exists, disabling multiplexing
Warning: remote port forwarding failed for listen port 52698

Но если я закомментирую RemoteForward в строке конфигурации, он может успешно повторно использовать соединение, что ускоряет его. Есть ли способ настроить ssh для поддержки обоих мультиплексных соединений и включения переадресации удаленного порта, чтобы он пытался перенаправить порт только в том случае, если это главное соединение?

Моя система:

Я нашел решение. Я использую раздел Match с host и отрицал exec ключевые слова для проверки имени хоста и существования файла управляющего сокета. Если файл не существует, то это главное соединение, поэтому настройте переадресацию портов. В противном случае это ведомое соединение, и пересылка пропускается.

ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p

Match host hostname1.example.com,hostname2.example.com !exec "[ -e ~/.ssh/socket-%r@%h:%p ]"
    # TextMate rmate port
    RemoteForward :52698 localhost:52698

Вот еще одно решение, которое не зависит от ControlMaster:

Match host hostname1.example.com,hostname2.example.com !exec "nc -zw1 %h 52698"
    RemoteForward :52698 localhost:52698

Это также работает для перенаправления локальных портов и проксирования SOCKS:

Match host hostname1.example.com,hostname2.example.com !exec "nc -zw1 localhost 52698"
    LocalForward 52698 remotehost:52698

Match host hostname3,hostname4 !exec "nc -zw1 localhost 1050"
    DynamicForward 1050

# Test for multiple ports
Match host hostname5 !exec "nc -zw1 localhost 52698 && nc -zw1 localhost 1050"
    LocalForward 52698 remotehost:52698
    DynamicForward 1050

Они работают, проверяя, открыт ли целевой порт. Если нет, он создает желаемое перенаправление портов. netcat - отличный инструмент для быстрого тестирования сети и перенаправления. В -z опция указывает netcat на то, что нужно просто сканировать, слушает ли демон данный порт. -w1 говорит, что вы должны подождать не более одной секунды, если ваши пакеты игнорируются, например. из-за политики брандмауэра DROP.