Юнит не видит интернет при загрузке

Здравствуйте, нужен постоянный 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
(server исправил для форума, в юните он правильный)
Проверяю:
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", отлично запускается и подключается к интернету.
В чем проблема?
У вас не одна, а сразу две проблемы.

Первая проблема в том, что юнит 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
Но этого ещё мало – чтобы network.target сигнализировал о реальном подключении интернета, надо чтобы и этот юнит считался работающим только после реального подключения. Обычно в юнитах для запуска dhcpcd и pppd это делается привязкой к форку подключающего демона в фон
[Service]
Type=fork
и настройке самого демона, чтобы он форкался именно при реальном подключении, это будет опция -w (waitip) для dhcpcd и опция updetach для pppd.

Ваша вторая проблема в том, что желая ПОСТОЯННОГО туннеля через интернет, вы не обеспечили его постоянства. Что произойдёт, если соединение с интернетом будет иногда рваться и восстанавливаться уже после подключения? Скорей всего, ваш туннель упадёт и больше не поднимется, потому что вы не приняли никаких мер для его восстановления и повторных попыток подключения. Команда, которой вы поднимаете туннель, рассчитана на РАЗОВОЕ подключение. Найдите такие опции, которые обеспечат бесконечное переподключение при неудаче или обрыве, либо сделайте скрипт, который будет выполнять эту команду повторно, либо исправьте юнит так, чтобы systemd САМ перезапускал для вас эту команду, насколько я помню, он это умеет.
wildfire, к вышесказанному могу только посоветовать не мучиться, а установить пакет autossh из стандартного репозитория, который выполняет ваши задачи.
За соединение у меня отвечает dhcpcd, я сразу посмотрел его юнит, он стартует перед network.target, поэтому я и выбрал именно его в качестве ориентира. Спасибо за исправление с sshd, только сейчас подумал что ему не нужен интернет. И спасибо за наводку про фоновые демоны.

Для стабильности туннеля я сделал keep alive пакеты, и задачу в cron для перезапуска туннеля, если его процесс завершился. Про auto-ssh не знал, сейчас пойду разбираться в нём, решения с cron меня совсем не устраивают.

Вывод: network.target не означает подключение к интернету, ибо сами процессы, отвечающие за подключение форкаются.
 
Зарегистрироваться или войдите чтобы оставить сообщение.