Очень долгое время обходил OpenVPN стороной и использовал Wireguard. Однако OpenVPN имеет больше возможностей. Например, можно использовать TCP соединения. Мой провайдер Ростелеком и он не даёт мне возможности использовать UDP через IPv6, т.к. блокирует все соединения в мою сторону. Решить этот вопрос через техническую поддержку сложно (например, в последний раз у них «сломалось» что-то и они попросили обратиться снова через несколько часов). А переключить Wireguard на TCP технически невозможно. В данном мануале приводится пример простой настройки OpenVPN 2.6. Версия важна, т.к. в 2.6 появился необходимый функционал. В Fedora 38 (актуальная версия на момент написания) уже есть всё необходимое. Для Ubuntu 22.04 LTS и старых версий Fedora можно подключить репозиторий от разработчиков.

Приведённый пример серверной конфигурации можно доработать для совместимости со старыми клиентами OpenVPN, но в данной заметке это не рассматривается.

Настройка сервера

Устанавливаем OpenVPN и переходим в папку /etc/openvpn/server/.

Создадим сертификат и ключ для сервера.

openssl req -x509 -newkey ec:<(openssl ecparam -name secp384r1) -keyout server.key -out server.crt -nodes -sha256 -days 3650 -subj '/CN=server'

В результате будут созданы два файла server.key и server.crt.

Создадим SHA256 отпечаток для нашего сервера

openssl x509 -fingerprint -sha256 -in server.crt -noout

В результате на экран будет выведен отпечаток, который будет иметь вид

sha256 Fingerprint=00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:
00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF

Нас интересует часть, которая расположена после знака равенства. Именно её необходимо будет использовать позднее в конфигурации клиента. Команду можно запускать несколько раз. Всегда будет отображён один и тот же отпечаток.

Создадим конфигурацию сервера в /etc/openvpn/server/server.conf.

# Это файлы, которые были получены ранее
cert server.crt
key server.key
dh none
dev tun
# Указываем, что хотим прослушивать tcp порт по IPv6 
proto tcp6
# Указываем сети, которые будем предоставлять клиенту
server 10.0.0.0 255.255.255.0
server-ipv6 fd12:1234:1234::/64
# Указываем MTU для туннеля
tun-mtu 1400
# Здесь необходимо будет добавить отпечатки клиентов
<peer-fingerprint>
</peer-fingerprint>
# Отправлять уведомление клиентов о быстром переподключении
# при перезапуске сервера
explicit-exit-notify 1
# Отправлять пакет каждые 30 секунд
# Перезапускать при таймауте 150 секунд
keepalive 30 150

Настройка клиента

Аналогично сгенерируем ключи для клиента. Для удобства, не будем использовать отдельные файлы для их хранения, поэтому создавать их можно в любой папке. В качестве CLIENT_NAME просто укажите строку, по которой вы будете идентифицировать клиента.

openssl req -x509 -newkey ec:<(openssl ecparam -name secp384r1) -keyout client.key -out client.crt -nodes -sha256 -days 3650 -subj '/CN=CLINET_NAME'

Создадим файл конфигурации клиента в /etc/openvpn/client/

# Имя или IP адрес сервера для подключения
remote ИМЯ.СЕРВЕРА.net
client
# Использовать случайный порт при подключении 
nobind
# Uncomment the following line if you want to route
# all traffic via the VPN
# redirect-gateway def1 ipv6
# To set a DNS server
# dhcp-option DNS 192.168.234.1
<key>
-----BEGIN PRIVATE KEY-----
[Вставить сюда содержимое файла client.key]
-----END PRIVATE KEY-----
</key>
<cert>
-----BEGIN CERTIFICATE-----
[Вставить сюда содержимое файла client.crt]
-----END CERTIFICATE-----
</cert>
# Здесь необходимо указать отпечаток сервера
peer-fingerprint 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF
# Указываем MTU, которое должно соответствовать MTU на сервере
tun-mtu 1400
dev tun

Получим отпечаток для клиента

openssl x509 -fingerprint -sha256 -noout -in client.conf

Будет получен ответ, аналогичный тому, какой был получен на сервере

sha256 Fingerprint=FF:EE:DD:CC:BB:AA:99:88:77:66:55:44:33:22:11:00:
FF:EE:DD:CC:BB:AA:99:88:77:66:55:44:33:22:11:00

Часть после знака равенства необходимо скопировать в секцию <peer-fingerprint> сервера

<peer-fingerprint>
FF:EE:DD:CC:BB:AA:99:88:77:66:55:44:33:22:11:00:FF:EE:DD:CC:BB:AA:99:88:77:66:55:44:33:22:11:00
</peer-fingperint>

Тестирование конфигураций

Для проверки конфигурации можно просто запустить сервер и клиент из командной строки

openvpn config.conf

Укажите файл конфигурации на сервера, а затем аналогично можно запустить соединение на клиенте. Если всё прошло успешно, то вы получите запущенные сервер и клиент. Можно с помощью другого окна терминала проверить, что все необходимые ресурсы доступны через VPN.

Автозапуск сервера и клиента

В Fedora и Ubuntu автозапуск клиента и сервера осуществляется через systemd. Чтобы запустить сервер, необходимо активировать юнит openvpn-server и указать имя конфигурации

systemctl enable --now openvpn-server@server

В данном варианте будет использована конфигурация из файла /etc/openvpn/server/server.conf. Оно выбирается исходя из значения после символа @. Файл должен иметь расширение .conf.

Аналогично можно активировать автозапуск клиента

systemctl enable --now openvpn-client@fsa

Для клиента файл конфигурации должен находиться в папке /etc/openvpn/client/. В приведённом примере это должен быть файл fsa.conf. На одном устройстве можно запустить несколько клиентов, только не забывайте о правильной маршрутизации между соединениями.

Заключение

Соединение между клиентом и сервером установлено. Осталось только доработать конфигурацию сервера под ваши задачи.

Полезные ссылки

MAN страница на debian.org