Сайт FSA
21.04.2023

Настройка OpenVPN

Очень долгое время обходил 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


Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.