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

Мультиплексирование SSH зависает, если не завершено корректно

Я пытаюсь настроить удаленный доступ к моему домашнему компьютеру через SSH с мультиплексированием. Вот настройка: со своего ноутбука я подключаюсь к порту модема; этот порт перенаправляется на мой маршрутизатор, который затем перенаправляет его на локальный рабочий стол, и я аутентифицируюсь с помощью своего ключа. Благодаря мультиплексированию я могу открыть другое соединение с домашним компьютером без повторной аутентификации. Все это работает так, как я ожидал.

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

Я могу решить эту проблему, перезапустив домашний ящик (хотя для этого требуется физическое присутствие, что, скорее, противоречит сути). Я также могу избежать возникновения проблемы, если аккуратно отключу SSH-соединение с помощью ssh -O exit $IP -p $PORT.

Учитывая вышеизложенное, у меня есть два вопроса: во-первых, это предполагаемое поведение или я столкнулся с ошибкой? И, во-вторых, как я могу избежать этой проблемы? Спасибо!

(Этот вопрос внешне похож на Конфигурация тайм-аута мультиплексирования SSH, но который вопрос о том, что сервер перезагружается / недоступен, тогда как мой вопрос о перезагрузке клиента без изящной сигнализации об окончании мультиплексированного соединения.)

[РЕДАКТИРОВАТЬ] В соответствии с просьбой в комментарии ниже, вот (не очень полезный) результат попытки подключения к -vv флаг. Я немного отредактировал вывод, заменив свой IP, имя пользователя и порт на $IP, $ USER, and$ PORT` соответственно.

OpenSSH_8.1p1, LibreSSL 3.0.2
debug1: Reading configuration data /home/$USER/.ssh/config
debug1: /home/$USER/.ssh/config line 4: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: resolve_canonicalize: hostname $IP is address
debug1: auto-mux: Trying existing master
debug1: Control socket "/home/$USER/.ssh/$USER@$IP:$PORT" does not exist
debug2: ssh_connect_direct
debug1: Connecting to $IP [$IP] port $PORT.
debug1: connect to address $IP port $PORT: Connection timed out
ssh: connect to host $IP port $PORT: Connection timed out

Когда я не запускаю эту ошибку (и, следовательно, жестяная банка успешно подключиться), вывод с -vv точно так же, за исключением того, что Connection timed out строка заменяется строкой, указывающей debug1: Connection established и соединение затем переходит к обычной аутентификации.

Вот мои основные .ssh/config файл, если он актуален:

Host *
    ControlMaster auto
    ControlPath   ~/.ssh/%r@%h:%p
    ControlPersist yes
    ServerAliveInterval 300
    ServerAliveCountMax 2
    RemoteForward 9999 localhost:22

Покопавшись в этом еще немного (и прочитав превосходно книга SSH Мастерство), Мне удалось решить свою проблему: хотя я установил ServerAliveInterval в моем клиент .ssh/config файл, я не установил ClientAliveInterval в моем сервер sshd_config файл.

В результате сервер не истекал тайм-аут и поддерживал соединение. В сочетании с двойной переадресацией портов, необходимой для навигации по моей домашней сети, это занимало (единственные) порты, которые я открыл, и предотвращало дополнительные подключения.

Добавление ClientAliveInterval 10 линия к моему sshd_config файл (и не забудьте перезапустить службу sshd с sudo pkill -1 sshd решает проблему красиво. Надеюсь, эта информация поможет другим быстро решить эту проблему.