Мой ~ / .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.