wildfire |
|
Темы:
8
Сообщения:
35
Участник с: 23 февраля 2012
|
Здравствуйте, нужен постоянный SSH-туннель, который будет стартовать при запуске компьютера. Создал юнит: WildPC% cat /etc/systemd/system/ssh-tunnel.service [Unit] Description=Compatibility After=network.target [Service] Type=oneshot ExecStart=/usr/bin/ssh -TfN -R 2000:localhost:22 wildfire@*server* [Install] WantedBy=multi-user.target Проверяю: WildPC% sudo systemctl start ssh-tunnel WildPC% Сделал systemctl enable ssh-tunnel, перезагружаюсь, юнит не работает, SSH не может получить доступ к интернету: WildPC% systemctl status ssh-tunnel ssh-tunnel.service - Compatibility Loaded: loaded (/etc/systemd/system/ssh-tunnel.service; enabled) Active: failed (Result: exit-code) since Вс 2014-01-12 21:36:24 MSK; 9min ago Process: 201 ExecStart=/usr/bin/ssh -TfN -R 2000:localhost:22 wildfire@*server* (code=exited, status=255) Main PID: 201 (code=exited, status=255) CGroup: /system.slice/ssh-tunnel.service янв 12 21:36:23 WildPC systemd[1]: Starting Compatibility... янв 12 21:36:24 WildPC ssh[201]: ssh: Could not resolve hostname *server*: Name or service not known янв 12 21:36:24 WildPC systemd[1]: ssh-tunnel.service: main process exited, code=exited, status=255/n/a янв 12 21:36:24 WildPC systemd[1]: Failed to start Compatibility. янв 12 21:36:24 WildPC systemd[1]: Unit ssh-tunnel.service entered failed state. Проблема не в DNS, если указать IP-адресс, он просто не может подключится к нему, т.е. интернета нет. Тот же самый SSHD, у которого тоже указан "After=network.target", отлично запускается и подключается к интернету. В чем проблема? |
Natrio |
|
Темы:
48
Сообщения:
4771
Участник с: 08 января 2011
|
У вас не одна, а сразу две проблемы. Первая проблема в том, что юнит network.target это не волшебная палочка, которая перекидывается при появлении (сети? интернета?), это всего лишь инструмент для настройки зависимостей. Если вы привязываете к network.target запуск программы, требующей доступа именно в интернет, вам сначала нужно сделать так, чтобы network.target считался достигнутым только тогда, когда интернет действительно будет подключён. Ваша ссылка на sshd неоправдана – sshd ни к какому интернету и вообще ни к какой сети при старте не подключается, просто открывает свой порт на прослушивание, и по-умолчанию он это делает на "универсальном адресе" 0.0.0.0 , что не требует предварительного подъёма сети. У себя я безболезненно убрал зависимость от network.target у sshd и ему подобных "серверных" демонов, чтобы ускорить загрузку. Для начала вспомните, какой демон у вас отвечает за подключение именно к интернету. dhcpcd? pppd? Ещё что-нибудь? Вот возьмите его юнит, и допишите в его зависимости требование загрузки ДО network.target Before=network.target Wants=network.target [Service] Type=fork Ваша вторая проблема в том, что желая ПОСТОЯННОГО туннеля через интернет, вы не обеспечили его постоянства. Что произойдёт, если соединение с интернетом будет иногда рваться и восстанавливаться уже после подключения? Скорей всего, ваш туннель упадёт и больше не поднимется, потому что вы не приняли никаких мер для его восстановления и повторных попыток подключения. Команда, которой вы поднимаете туннель, рассчитана на РАЗОВОЕ подключение. Найдите такие опции, которые обеспечат бесконечное переподключение при неудаче или обрыве, либо сделайте скрипт, который будет выполнять эту команду повторно, либо исправьте юнит так, чтобы systemd САМ перезапускал для вас эту команду, насколько я помню, он это умеет. |
kurych |
|
Темы:
0
Сообщения:
1395
Участник с: 06 ноября 2011
|
wildfire, к вышесказанному могу только посоветовать не мучиться, а установить пакет autossh из стандартного репозитория, который выполняет ваши задачи. |
wildfire |
|
Темы:
8
Сообщения:
35
Участник с: 23 февраля 2012
|
За соединение у меня отвечает dhcpcd, я сразу посмотрел его юнит, он стартует перед network.target, поэтому я и выбрал именно его в качестве ориентира. Спасибо за исправление с sshd, только сейчас подумал что ему не нужен интернет. И спасибо за наводку про фоновые демоны. Для стабильности туннеля я сделал keep alive пакеты, и задачу в cron для перезапуска туннеля, если его процесс завершился. Про auto-ssh не знал, сейчас пойду разбираться в нём, решения с cron меня совсем не устраивают. Вывод: network.target не означает подключение к интернету, ибо сами процессы, отвечающие за подключение форкаются. |