Общая формулировка вопроса: как в этой версии кошерно запускать одновременно openvpn server и openvpn client? В виде автозапускаемых сервисов.
Я таки запустил, после плясок с бубном, но выглядит крайне костыльно, хоть и крайне просто.
А, может быть, надо организовать работу по другой схеме, а у меня глаз замылился.
Имеется:
- Сервер в офисе (та самая 16.04 server), bare metal
- Виртуалка в датацентре, KVM, 18.04 server
Надо:
- Перманентный, автоподнимающийся из любых падений vpn для:
- проброса портов по защищенному туннелю от рабочих станций (из локалки) на сервер в ДЦ. Без необходимости поднимать на каждой из них отдельное vpn подключение.
- иметь альтернативный по протоколу, перманентный шифрованный канал — на случай возможных кунштюков.
- При необходимости, прямое подключение какой-то из рабочих станций до обоих серверов. Например, кого-то из эникеев или программистов.
Таким образом, нужно иметь постоянно работающий vpn-сервер на обоих хостах, одним не обойдешься.
Вгугль предлагает великое множество инструкций, как настроить тривиальную схему сервер-клиент. (Тут мне совета не надо, давно разобрался (для easyrsa 2.0) — а вчера по новой, ибо оно уже 3.0.6.)
И пару конкретных вопросов без ответа (а то, что отвечали, галимое фуфло).
Конкретно про одновременный запуск на одной машине, и конкретно, как сервис, а не ручками в консоли.Первая стадия.Настроил быстренько по инструкции, и оно чудно заработало:
- openvpn server на офисном сервере
- openvpn server на виртуальке в датацентре
Подключаюсь без проблем: с рабочий станции в локалке и домашнего компа; с сервера в офисе к серверу в ДЦ.
Пинги идут в обе стороны.
HTTP серверы также доступны по частным адресам (10.8.0.1:80 офис и 10.9.0.1:80 впс-ка).
Все, вроде, збс.
Вторая стадия — надо запустить на офисном сервере openvpn клиента — перманентно и
попиндикулярно инстансу сервера.
Вот тут вышел затык, ибо оно не хотело ни в какую.
Для начала потратил кучу времени и красноглазия на тесты в виртуалбоксе. Оказалось, что там есть мощные глюки, которых на bare metal нет.
Пытался писать самодельный systemd юнит, и даже практически преуспел, но с одним мелким и непонятным изъяном. А потом обнаружил, что он(и), юниты, уже есть.
Их там аж целых два, и там используется встроенная в системду магия, которую я пока не осилил. (Магия — в программистском смысле, неочевидные действия.)
Курение нарытого показывает, вроде бы, однозначно: при старте сервиса будут прочитаны все файлы /etc/openvpn/*.сonf, и на каждый будет запущен свой инстанс. Однако, системда упорно не хотела видеть оба конфига, и искала только один. Причем, искала его даже после удаления, а второй игнорировала полностью.
Вот где-то тут собака порылся:
$ systemctl cat openvpn@service
# /lib/systemd/system/openvpn@.service
[Unit]
Description=OpenVPN connection to %i
PartOf=openvpn.service
ReloadPropagatedFrom=openvpn.service
Before=systemd-user-sessions.service
Documentation=man:openvpn(8)
Documentation=https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage
Documentation=https://community.openvpn.net/openvpn/wiki/HOWTO
[Service]
PrivateTmp=true
KillMode=mixed
Type=forking
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i
PIDFile=/run/openvpn/%i.pid
ExecReload=/bin/kill -HUP $MAINPID
WorkingDirectory=/etc/openvpn
ProtectSystem=yes
CapabilityBoundingSet=CAP_IPC_LOCK CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_SETGID CAP_SETUID CAP_SYS_CHROOT CAP_DAC_READ_SEARCH CAP
LimitNPROC=10
DeviceAllow=/dev/null rw
DeviceAllow=/dev/net/tun rw
[Install]
WantedBy=multi-user.target
При наличии двух конфигов, server.conf и client.conf, отрабатывался только первый.
Типа такого:
$ pgrep openvpn
12345
А если удалить server.conf, оно при перезапуске продолжало искать server.conf, и только server.conf, и ругалось в логе на фатальную ошибку.
Если же снести пакет полностью (purge) и снова установить, и запустить первый раз с единственным конфигом client.conf — то, если заменить client.conf на server.conf, оно продолжало упорно искать client.conf. В каком-то кэше застревало?.. systemctl daemon-reload не помогало.
А если запускать вручную, все прекрасно работает. Примерно так:
# /usr/sbin/openvpn --daemon --config /etc/openvpn/client.conf
$ pgrep openvpn
12345
67890
В конце концов, удалось запустить и сервер, и клиент. Довольно стабильно, если судить по нескольким десяткам перезапусков типа systemctl stop/start/restart.
Результативные удары в бубен:
- Сделать разные порты на серверах. Хотя, казалось бы...
- Запускать openvpn сервер после клиента, грязным хаком переименовав конфиги в 1server.conf и 2client.conf.