Вопрос: autossh не убивает ssh при ссылке вниз


Я начал свой autossh с временем опроса 30 с:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

И он работает нормально:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

Но если я физически удалю сетевой кабель, то есть туннель больше не сможет работать, autossh не убивает демона ssh. Зачем? Я понимаю, что autossh ничего не может сделать, если ссылка не работает, но, на мой взгляд, она должна попытаться сделать следующее:

  1. Проверьте дочерний процесс ssh (check on child ...)
  2. Проверьте дальний конец !!! (пинговая операция через туннель)
  3. Поймите, что туннель не работает
  4. Остановить процесс ssh
  5. Попробуйте снова создать туннель
  6. Поймите, что он не работает, и установите (экспоненциально увеличивающийся?) Таймер, чтобы снова проверить

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

Какая проверка делает autossh? Просто убедитесь, что ssh запущен и работает? Разве это не делает какие-либо проверки на дальнем конце?

редактировать

В соответствии с запросом я добавляю соответствующую часть конфигурации ssh:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes

8
2017-09-05 10:41


Источник


как насчет попытки сократить тайм-аут? - Nikolaidis Fotis
Некоторое время мы использовали autossh, но это было слишком ненадежным на flaky-соединениях, в частности, в сочетании с переносом портов. Теперь мы используем OpenVPN и очень довольны им. - Nils Toedtmann
@NikolaidisFotis: тайм-аут в порядке. Это ... тайм-аут. Но это не делает правильная вещь (imho) всякий раз, когда истекает время ожидания, а именно: проверка дальнего конца! - dangonfast
@NilsToedtmann: Спасибо, я попробую. Легко ли реализовать? У вас есть какая-либо ссылка на хорошее руководство? - dangonfast
OpenVPN довольно прост, мы просто «apt-get install'ed it» и начали с конфигураций по умолчанию для сервера или клиента, используя dev tun в обоих случаях remote в конфигурации клиента. Единственный досадный бит - управлять сертификатами. Мы используем CA «easy-rsa», который поставляется с OpenVPN. После того, как у вас есть сертификаты, все остальное легко. - Nils Toedtmann


Ответы:


Но если я физически удалю сетевой кабель, то есть туннель может   не работать больше, autossh не убивает демона ssh. Зачем?

autossh запускается на вашей клиентской машине, поэтому он не может непосредственно убить процесс ssh daemon на сервере. Однако вы можете указать ненулевое значение для ClientAliveInterval в /etc/ssh/sshd_config на сервере (см. man sshd_config) и перезапустите службу sshd на сервере, чтобы применить изменение конфигурации. Затем в случае отключения сети процесс демона ssh будет убит после ClientAliveInterval * ClientAliveCountMax секунд (но не с помощью autossh).

Теперь, если вы хотели спросить «Почему autosh не убивает процесс ssh-клиента?», вы указали -M 0, На странице справки autossh:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit,

Вместо использования autossh для мониторинга соединения вы ожидаете выхода ssh после истечения времени ожидания ServerAliveCountInterval * ServerAliveCountMax секунд. Вы запросили 60 проверок сервера до выхода ssh с 60-секундным интервалом, разделяющим последовательные проверки, поэтому вы будете ждать час до выхода вашего клиента ssh.

Вы также можете рассмотреть возможность использования ExitOnForwardFailure вариант на стороне клиента (см. man ssh_config), так что ssh выйдет, если он не сможет установить туннель, а затем autossh может попытаться снова запустить ssh.


8
2017-10-06 03:44



Спасибо, это имеет смысл. Я действительно имел в виду «клиентский процесс», а не серверный процесс. - dangonfast
И после повторного чтения страницы manus autossh я помню, почему я установил -M 0: использовать порт мониторинга непросто, и это косвенно обескураживает: Во многих отношениях это может быть лучшим решением, чем порт мониторинга - dangonfast