Не корректно работает служба для автоматического поднятия SSH туннеля?
Здравствуйте.
Задача сделать так что бы сервер HA за стал доступен из интернета.
У меня IP серый, но есть арендованный сервер с белым IP.
Само решение проблемы нашел быстро, сейчас могу поднять SSH туннель с помощью такой команды.
autossh -fgNR 2225:localhost:8123 -M 0 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=60" -o "ServerAliveCountMax=5" -o "PubkeyAuthentication=yes" -o "PasswordAuthentication=no" username@123.123.123.123 -p 22
И все работает корректно.
Но не могу настроить службу которая бы автоматически запускала туннель при сбое или перезагрузке.
Пытался настроить так
--------------------------------------
[Unit]
Description=Autossh_HA
After=network.target
[Service]
Environment="AUTOSSH_GATETIME=0"
Environment="AUTOSSH_LOGFILE=/var/log/autossh"
ExecStart=autossh -fgNR 2225:localhost:8123 -M 0 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=60" -o "ServerAliveCountMax=5" -o "PubkeyAuthentication=yes" -o "PasswordAuthentication=no" user@xxx.xxx.xxx.xxx -p 22
TimeOutSec=10
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
---------------------------------------------------
Вот такой статус выдает служба
Вот что в логах
Дополнительно:
У вас в systemd-сервисе autossh запускается от имени root.
Наиболее вероятно, что у вас для пользователя root:
- Используется другой SSH-ключ (или он отсутствует)
- Нет записи отпечатка сервера в known_hosts
нужно как минимум выкинуть ключ f из команды запуска, который несовместим с systemd
- Отлично!
Видимо это не "как минимум", а вообще все что нужно было сделать, служба начала работать.
Можете уточнить почему при вводе команды вручную все работало, а при вызове через службу ключ f мешал?
- NekoGami, ЕМНИП при использовании -f оно форкается и завершается (что хорошо для командной строки — уходит в фон), а systemd ожидает, что основной процесс будет работать пока не упадёт
теоретически можно поиграться с Type, но где-то когда-то читал, что systemd такое не рекомендует - IvanU7n,
Спасибо. - NekoGami, если помогло, отмечайте решением
Ответы:
В [Service] пропиши Type=simple. И ещё, а как работает autossh? Он свой процесс крутит, или форкает новый? Может, ему нужен Type=forking?
А заодно посмотри, может, стоит указать User, от имени которого будет исполняться ssh-туннель.
Если что, journalctl -xe покажет последние логи - поищи там упоминания своего сервиса.
- Установил тип simple(хотя он же вроде по умолчанию и должен таким быть).
А пользователя root.
Ничего не изменилось.journalctl -xe выдает вот такие данные.
- А не кое что изменилось.
Теперь соединение появляется, но быстро исчезает.
Работает примерно 5 секунд потом 10-15 секунд перерыв.P.S.
Все перестало появляться совсем. Несколько минут так нестабильно работал и совсем заглох. - NekoGami, а если таймаут убрать? И ещё, а как работает autossh? Он свой процесс крутит, или форкает новый? Может, ему нужен Type=forking?
Ну и наконец, а зачем autossh и почему нельзя обойтись просто ssh? systemd вполне справится с перезапуском. - Vindicar,
"а если таймаут убрать?"
Если таймаут убрать там возникала ошибка что то о том что слишком быстрые или слишком частые перезапуски."И ещё, а как работает autossh? Он свой процесс крутит, или форкает новый? Может, ему нужен Type=forking?
Ну и наконец, а зачем autossh и почему нельзя обойтись просто ssh? systemd вполне справится с перезапуском."
Не могу ничего конкретного сказать на счет этого. Я вообще с linux мало знаком, а с ssh вообще всего часа 3 назад познакомился. Увидел в статье в интернете что autossh использовали для подобной цели, и решил тоже его использовать.Вообще проблема решена. Оказалось что ключ f нужно было убрать.
Почему то он мешал запуску туннеля через службу, хотя не мешал запуску вручную. - NekoGami, ну цитата из man autossh
-f' causes autossh to drop to the background before running ssh. The -f flag is stripped from arguments passed to ssh. Note that there is a crucial a difference between -f with autossh, and -f with ssh: when used with autossh ssh will be unable to ask for passwords or passphrases. When -f is used, the "starting gate" time (see AUTOSSH_GATETIME) is set to 0.
Единственный способ, которым процесс может "drop to background" - это форкнуть(склонировать с себя) процесс потомок, а потом завершиться самому. Как следствие, systemd видел, что запущенный процесс завершился, и решал "ну ок, служба завершилась, надо перезапускать".
Для таких случаев и нужен Type=forking - но он имеет смысл только если наша служба всегда себя форкает. Если мы можем попросить её не форкаться (в autossh это значит убрать флаг -f), то тогда проще так и сделать, и использовать Type=simple. - Vindicar,
Спасибо за объяснение.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос



Для решения проблемы с некорректной работой службы для автоматического поднятия SSH туннеля, следует выполнить следующие шаги:
1. Проверьте правильность настроек конфигурации SSH туннеля. Убедитесь, что вы правильно указали адрес хоста, порт, логин и пароль.
2. Убедитесь, что ваш SSH сервер доступен из текущей сети. Попробуйте подключиться к серверу вручную с помощью команды ssh через терминал.
3. Проверьте права доступа к файлам и папкам, связанным с настройками SSH туннеля. Убедитесь, что служба имеет достаточные права для чтения и записи в эти файлы.
4. Проверьте логи службы для выявления возможных ошибок или проблем. Обычно логи находятся в определенной папке на сервере.
5. Попробуйте перезапустить службу для автоматического поднятия SSH туннеля. Иногда простой перезапуск может решить проблему.
В случае, если проблема не решается после выполнения вышеперечисленных шагов, рекомендуется обратиться к документации по использованию данной службы или обратиться за помощью к специалистам по работе с SSH туннелями.