Использование OpenVPN с systemd

24

Итак, я искал в Интернете решения этой проблемы, но ответы для меня, похоже, не работают. Надеюсь, кто-нибудь сможет мне помочь. Я только пытаюсь настроить клиент OpenVPN.

Я бегу, CrunchBang Linux 3.2.0-4-amd64 Debian 3.2.60-1+deb7u1 x86_64 GNU/Linuxи я просто переключился на использованиеsystemd . Переключение прошло достаточно гладко, но теперь я не могу заставить свой клиент OpenVPN запускаться с использованием systemd. Я пытался следовать этим учебникам по настройке, но ничего не работает.

Я могу вызвать туннель из командной строки openvpn /etc/openvpn/vpn.conf. Так что я знаю, что файл конфигурации хорош, он работал с sysvinit просто отлично, поэтому я не удивлен. Затем я пытаюсь просто сделать статус с systemctl status openvpn@vpn.serviceрезультатом:

$ sudo systemctl status openvpn@vpn.service
  openvpn@vpn.service
Loaded: error (Reason: No such file or directory)
Active: inactive (dead)

Я понял, что мне нужно сделать некоторые настройки для служб. Я хочу быть предложено ввести пароль , так что я после этого руководства для создания openvpn@.serviceин /etc/systemd/system/. Но перезапуск службы OpenVPN по-прежнему не запрашивает пароль.

$ sudo service openvpn restart
[ ok ] Restarting openvpn (via systemctl): openvpn.service.

В учебниках по Fedora описаны этапы создания символических ссылок, но не следует создавать файлы .service в пошаговых руководствах.

Какой кусок мне не хватает? Нужно ли создавать openvpn@vpn.service? Если так, то где именно я это размещу? Я чувствую, что это не должно быть таким сложным, но я не могу найти решение, которое работает для меня. Я рад предоставить любую дополнительную информацию, которая необходима.

Решение

-rw-r--r--  1 root root   319 Aug  7 10:42 openvpn@.service

[Unit]
Description=OpenVPN connection to %i
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn

[Install]
WantedBy=multi-user.target
openvpn@.service (END)

Symlink:

lrwxrwxrwx  1 root root   36 Aug  7 10:47 openvpn@vpn.service -> /lib/systemd/system/openvpn@.service

Запрашивать пароль

Теперь все работает, за исключением запроса пароля для подключения. Я пытался это решение . Я немного подправил файл сверху и добавил скрипт Expect. как в примере. Работать как шарм! Мои файлы ниже.

Модифицированные строки из выше /lib/systemd/system/openvpn@.service

ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --management localhost 5559 --management-query-passwords --management-forget-disconnect --config /etc/openvpn/%i.conf
ExecStartPost=/usr/bin/expect /lib/systemd/system/openvpn_pw.exp

Ожидайте сценарий /lib/systemd/system/openvpn_pw.exp. Обязательно сделайте следующее:

  • chmod +x по сценарию.
  • Были telnetустановлены

Код ожидаемого скрипта:

#!/usr/bin/expect
set pass [exec /bin/systemd-ask-password "Please insert Private Key password: "]

spawn telnet 127.0.0.1 5559
expect "Enter Private Key Password:"
send "password 'Private Key' $pass\r"
expect "SUCCESS: 'Private Key' password entered, but not yet verified"
send "exit\r"
expect eof

Следует отметить, что вышеуказанное решение действительно регистрирует ваш пароль, введенный в виде открытого текста, в следующих журналах /var/log/syslogи/var/log/daemon.log

RoraΖ
источник
Как выглядит openvpn@.serviceфайл?
Кристиан Чиупиту
Обновлено сообщение с текущей ошибкой
RoraΖ
Загляните в /var/log/ enjsyslog,daemon.log} и journalctl -b -mузнайте, почему OpenVPN завершился. Одно из этих мест должно содержать реальные сообщения об ошибках. (Или даже journalctl -b -m _EXE=/usr/sbin/openvpnдолжен давать только сообщения OpenVPN).
Дероберт
Да, я туда добирался. У нас проблема с паролем. Я попробую это решение: bbs.archlinux.org/viewtopic.php?id=150440 Спасибо за вашу помощь!
RoraΖ

Ответы:

12

Я думаю, что установка Debian OpenVPN с systemd в настоящее время немного сломана. Чтобы заставить его работать на моих машинах, мне нужно было:

  1. Создайте /etc/systemd/system/openvpn@.service.d (каталог) и поместите в него новый файл со следующим:

    [Ед. изм]
    Требуется = networking.service
    После того, как = networking.service
    Я назвал свой файл local-after-ifup.conf. Это должно закончиться .conf. (Это бит, который сейчас немного сломан.)

  2. Создайте файл в /etc/tmpfiles.d(я назвал мойlocal-openvpn.conf ) с содержанием:

    # Тип Path Mode UID GID Возраст Аргумент
    d / run / openvpn 0755 root root - -
    Это ошибка Debian 741938 (исправлена ​​в 2.3.3-1).

  3. Создайте символическую ссылку в multi-user.target.wants(самый простой способ systemctl enable openvpn@CONF_NAME.service) Например, если у вас есть /etc/openvpn/foo.conf, вы бы использовали openvpn@foo.service.

  4. Если у вас также есть сценарий инициализации SysV в systemd, отключите его. Это ошибка Debian 700888 (исправлена ​​в 2.3.3-1).

ПРИМЕЧАНИЕ: 2.3.3-1 или более поздняя версия еще не в тестировании , хотя она нестабильна.

derobert
источник
Включение systemctl все еще не удается, говоря, что нет такого файла или каталога. Я не вижу никаких сценариев инициализации sysv в / lib / systemd, разве что это systemd-initctl?
RoraΖ
@raz Скрипт SysV будет /etc/init.d/openvpn; systemd по умолчанию запускает те же функции, что и sysv init. Это у openvpn.serviceвас есть; Вы должны отключить его ( systemctl disable). Существует ли файл /lib/systemd/system/openvpn@.serviceв вашей системе?
Дероберт
@raz Если у вас есть этот файл, вы можете попробовать руководствоln -s /lib/systemd/system/openvpn@.service /etc/systemd/system/multi-user.target.wants/openvpn@vpn.service
Дероберт
У меня нет этого файла, но я уверен, что смогу его создать. Я отключил/etc/init.d/openvpn script.
RoraΖ
@raz Я не уверен, что у Crunchbang есть бэкпорт более нового пакета OpenVPN, но если нет, вы можете получить этот скрипт из sources.debian.net/src/openvpn/2.3.3-1/debian/…
Дероберт
8
  1. Поместите все файлы openvpn * .conf в /etc/openvpn/.
  2. Редактировать /etc/default/openvpn. Раскомментируйте это:

    AUTOSTART="all"
    
  3. Беги systemctl daemon-reload.

  4. Беги service openvpn start.
Алексей Алексеев
источник
Я думаю, что они использовали это как решение, потому что теперь в Debian 9 еще хуже, openvpn не перезапускается, если возникает ошибка, которая является очень глупой ... Кто-то знает какое-то решение или обходной путь, я пишу скрипт для проверки, если openvpn все еще работает!
Лучано Андресс Мартини
Это было прекрасно. он будет запускаться и останавливаться, хотя я и назвал это очевидным client.conf, теперь с этим просто запускается мой единственный конфиг. Благодарность!
Митчелл Керри
6

Этот тип файла модуля является созданной службой - более подробная информация доступна здесь

Ниже приведен файл модуля для openvpnCentOS 7:

[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=syslog.target network.target

[Service]
PrivateTmp=true
Type=forking
PIDFile=/var/run/openvpn/%i.pid
ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target

и это проживает как /usr/lib/systemd/system/openvpn@service. Символ %iв файле заменяется строкой после @имени устройства.

Поскольку файл конфигурации находится в /etc/openvpn/myopenvpn.confто время, служба запускается с:

systemctl start openvpn@myopenvpn.service
garethTheRed
источник
/usr/lib/systemd/user/ Ничего другого на /usr/lib/systemdуровне у меня нет .
RoraΖ
Как насчет /lib/systemd/system/? Кажется, в моей системе есть оба идентичных содержимого (и они не являются символическими ссылками!).
garethTheRed
Я только что добавил этот файл, обновил свой пост всем.
RoraΖ
5

Вам нужно создать сервисный файл, включив openvpn@<configuration>.service.

Например, если файл конфигурации - /etc/openvpn/client.confимя службы openvpn@client.service.

Из Arch Wiki

Karlo
источник
$ sudo systemctl enable openvpn@vpn.service [sudo] пароль для пользователя: не удалось выполнить вызов метода: нет такого файла или каталога
RoraΖ
Ваш конфигурационный файл называется «vpn»?
Карло
Да,/etc/openvpn/vpn.conf
RoraΖ
Тоже systemctl start openvpn@vpn.serviceне работает? Это должно сработать ...
Карло
1
Это работает для меня в Raspbian GNU / Linux 8 (Debian Jessie). Благодарность!
Neuhaus
1

Openvpn @ .service значительно развился между Debian 8 и 9. Например, оригинальный пакет для Jessie не работает systemctl reload openvpn@. Чтобы исправить это, версия Stretch вводит 10 новых директив в systemd-файл, включая PIDFile=повторную загрузку.

Для пользователей Stretch, я предлагаю идти на Backport, и если нет возможности сделать это, по крайней мере , получить Systemd-файл из https://packages.debian.org/jessie-backports/openvpn и экстракта debian/openvpn@.serviceв /etc/systemd/system/openvpn@.serviceи наслаждаться лучше функциональность и безопасность.

Яри ​​Туркиа
источник
0

Правильным решением было бы использовать systemd systemd-ask-password/ « Password Agents », который предоставляет системный встроенный способ направлять пароли / парольные фразы к сервисам.

Вам понадобится OpenVPN 2.3.0 или новее, чтобы сделать это.

Элиас Пробст
источник
Это то, что использует сценарий Expect в моем отредактированном посте.
RoraΖ
Извините, пропустил это редактирование.
Элиас Пробст
0

На новой установке Jessie_8.0.0 я сделал:

  1. скопировать старые /etc/openvpn/cluster.conf(плюс *.keyи *.crt) файлы из wheezy
  2. без комментариев AUTOSTART="all"в /etc/default/openvpn- я думаю, что это не имело никакого эффекта
  3. /lib/systemd/system-generators/openvpn-generator cluster
  4. systemctl restart openvpn@cluster.service

Теперь туннель запущен - я посмотрю, что произойдет после перезагрузки, но я не могу перезагрузиться в этот момент

Питер
источник