Я пытаюсь настроить удаленный доступ к моему домашнему компьютеру через 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
решает проблему красиво. Надеюсь, эта информация поможет другим быстро решить эту проблему.