ssh ControlMaster и Port forwarding

Шел 2017 год. Я уже лет 15 администрировал linux, и как минимум лет 8 это было основной и почти единственной вещью, за которую я получал деньги.

Вчера я узнал о замечательной штуке: опция «ControlMaster» к ssh-клиенту. Эта штука работает примерно так: от ssh-клиента отфоркивается (через вызов clone) процесс, который «встает» между ssh-клиентом и ssh-сервером на удаленной машине. Принимает запрос аутентификации от сервера, перенаправляет его клиенту, получает ответ от клиента, устанавливает соединение и дальше прогоняет весь трафик через себя. Все это делается через создание локального сокета по адресу «ControlPath» из конфига клиента (или по адресу по умолчанию).

Пока что назначение всех этих действия пока не очень понятно наверное, да? Так вот, самое интересное начинается когда вы закрываете соединение с удаленным сервером или хотите установить еще одно соединение из соседнего шела (да, не всегда на целевом сервере есть screen\tmux). Если вы закрываете ssh клиент (нажимаете Ctrl+D или пишете exit в консоли), то соединение «ssh-клиент <=> локальный сокет» закрывается, а соединение «отфоркнутый процесс <=> удаленный сервер» остается висеть. Если после этого вы хотите установить новое соединение с тем же сервером(не важно закрыли вы первное или нет), то клиент ищет сокет с именем нужного сервера (параметр ControlPath), соединяется с ним и вы уже авторизованны. Нет, соединения не «мешают» друг другу, то есть они независимые, но при этом не происходит соединения нового коннекта к ssh-серверу, не запрашивается авторизация и не остаются записи в логах ssh-сервера и тп. Соединение будет висеть «ControlPersist» времени.

Собственно все хорошо, замечательно и удобно, но внимательный читатель может спросить меня «а причем тут порт-форвардинг?», который вместе с этой штукой тоже отлично работает. Отвечаю: у меня иногда бывает задача «сходить на виндовый сервер, который в защищенной сети, но рядом есть машина с доступным ssh». Обычно я делаю что-то типа «ssh SERVER_NAME -L 3389:10.0.0.5:3389» и потом «rdesktop 127.1». Вот и сегодня делаю — захожу, все ок. Поработал, закрываю rdesktop, закрываю ssh, нажимаю стрелку вверх и правлю предыдущую команду, вместо «-L 3389:10.0.0.5:3389» вписываю «-L 3389:10.0.0.6:3389», запускаю rdesktop и попадаю на сервер, с которого только что вышел. Сначала не понял что именно произошло и почему «сервер выглядит не так, как должен», потом вернулся в консольку с ssh-клиентом и заметил

mux_client_forward: forwarding request failed: Port forwarding failed
muxclient: master forward request failed
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 3389

Потом покопался у себя в системе и понял что виновен ControlMaster и заодно покопался в том, как именно работает эта магия.
Зы что-бы закрыть установленное ранее таким образом соединение нужно выполнить на своей машине команду «ssh -O exit <нужный сервер>«, при этом текущие соединения к этому серверу (которые установлены через ControlMaster закроются с сообщением «Shared connection to X closed.»

Зы ssh клиент можно обмануть сделав симлинк с «ожимаемого имени сокета» на другой аналогичный сокет.

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed