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

autossh не убивает ssh при отключении ссылки

Я запустил автосервис с временем опроса 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. Разве он не должен пытаться перезапустить его, даже если нет никакой надежды на восстановление соединения?

Какую проверку делает автосш? Просто убедитесь, что 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

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

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

Теперь, если вы хотели спросить "Почему autossh не убивает процесс клиента 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 снова.