Настройка 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
. На одном устройстве можно запустить несколько клиентов, только не забывайте о правильной маршрутизации между соединениями.
Заключение
Соединение между клиентом и сервером установлено. Осталось только доработать конфигурацию сервера под ваши задачи.
Полезные ссылки
Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.
Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.