Настройка и использование сервера OpenVPN в Linux. Обновление 2023.09.10

В интернете много статей как поднять OpenVpn за 5 минут. Да, действительно сервер OpenVPN можно поднять быстро. Но моя статья показывает, сколько всего остается за кадром, если устанавливать OpenVPN без понимания как он в действительности работает. И стремясь все сделать быстро - вы сможете столкнуться как с проблемой безопасности, так и с тем что не сможете подключить все свои устройства к вашему пятиминутному OpenVpn.

Вы после установки по мануалу "пятиминутного" OpenVPN, прочекайте его конфигурационный файл согласно этому руководству, что же Вы в действительности установили.

Dmytro Yakovenko статья обновлена 2023/09/10

  1. Статья протестирована под Ubuntu 22
  2. Явным образом указано, что в статье используется Easy-RSA версии 2.3.3
  3. Обновлен раздел: Шаг 15: Отзыв клиентских сертификатов crl-verify
  4. Добавлен раздел: Настройка EdgeRouter X (EdgeOS) в качестве OpenVPN клиент

Что такое OpenVPN?

OpenVPN — это приложение для создания безопасного IP-туннеля через единый UDP- или Порты TCP. Что такое TCP / IP порт-порт 1194. Для обеспечения безопасности управляющего канала и потока данных, OpenVPN использует библиотеку OpenSSL (точнее протоколы SSLv3/TLSv1) т.е. доступны все возможности шифрования, аутентификации и сертификации библиотеки OpenSSL (любой шифр, размер ключа). Также может использоваться пакетная авторизация Алгоритм HMAC для OpenVPN, для обеспечения большей безопасности, и аппаратное ускорение для улучшения производительности шифрования.

OpenVPN используется на Solaris, OpenBSD, FreeBSD, NetBSD, GNU/Linux, Apple Mac OS X и Microsoft Windows.

  • OpenVPN предлагает пользователю несколько видов аутентификации:
  1. Предустановленный ключ, — самый простой метод.
  2. Сертификатная Аутентификация, — наиболее гибкий в настройках метод.
  3. С помощью логина и пароля, — может использоваться без создания клиентского сертификата (серверный сертификат все равно нужен).

OpenVPN может использовать статические, предустановленные ключи или обмен динамическими ключами на основе TLS. Он также поддерживает соединения VPN с динамическими удалёнными узлами (DHCP или клиенты dial-up), туннели поверх NAT преобразование сетевых адресов или через полноценный межсетевой экран (например, Руководство по iptables: Настройка и оптимизация фаервола Linux в Linux).

Настройки конфигурационного файла клиента идентичны по синтаксису и написанию как для Linux, так и для Windows.

Приложение OpenVPN распространяется бесплатно, благодаря комьюнити.

Скачать сервер и клиент OpenVPN на странице https://openvpn.net/community-downloads/

В первую очередь нужно арендовать виртуальный сервер VPS/VDS c root-доступом к операционной системе, с постоянным IP- адресом. Если вы собираетесь использовать сервер только в качестве VPN сервера, то вам не нужны дополнительные панели управления, типа ISPmanager, Hestia.

Не все хостинг-провайдеры разрешают использование VPN-серверов, поэтому перед заказом услуги предварительно у техподдержки узнайте разрешают ли они использование VPN сервера.

Рекомендация: если вам нужен доступ доступ к российским сайтам (Яндекс.Директ, Яндекс Почта, Wordstat, Вконтакте, Одноклассники, Mail.ru), то на мой взгляд, стоит выбрать российские сервера, например проверенный Perfect Quality Hosting (PQ). Для тех, кому нужен доступ к заблокированным в Российской Федерации сайтам, нужно арендовать сервер за пределами России, например Список абузоустойчивых хостингов.

Основные компоненты сети OpenVPN и объекты

  • Удостоверяющий центр CA. Выдает сертификаты по запросу узлов сети VPN, подписанные сертификатом удостоверяющего центра. Предоставляет узлам сети VPN свой собственный сертификат для проверки удостоверяющей стороны. Управляет списком отзыва сертификатов CRL.
  • Сервер OpenVPN. ПО сервера OpenVPN создает туннель внутри незащищенной сети, например, Интернета. Этот туннель обеспечивает безопасный зашифрованный трафик между узлами — участниками обмена данными в сети OpenVPN.
  • Клиент OpenVPN. ПО клиента OpenVPN устанавливается на все узлы, которым необходим защищенный канал передачи данный с сервером OpenVPN. При соответствующей настройка сервера OpenVPN возможна защищенная передача данных между клиентами OpenVPN, а не только между клиентами и сервером OpenVPN.
  • Сертификаты (публичные ключи) X.509. Сертификаты X.509 представляют собой публичные ключи, заверенные удостоверяющим центром CA. Они используются для зашифровывания данных. Факт заверения сертификата удостоверяющим центром CA позволяет идентифицировать сторону, передающую зашифрованные данные. Файл запроса на сертификат создается на узлах сети, затем он переносится на узел удостоверяющего центра и там подписывается. Созданный в результате подписанный сертификат переносится обратно на запросивший его узел сети OpenVPN.
  • Приватные ключи. Приватные ключи секретные. Они должны создаваться и храниться на каждом узле сети OpenVPN, предназначены для расшифрования данных и никогда не должны передаваться по сети. Приватные ключи создаются на узлах сети OpenVPN одновременно с файлом запроса на получение сертификата.
  • Список отзыва сертификатов CRL. Содержит список сертификатов, утративших доверие. Он создается и редактируется на узле удостоверяющего центра CA. Чтобы отключить узел от сети, достаточно занести его сертификат в список CRL. После создания и каждого изменения список CRL переносится на серверы OpenVPN.
  • Файл Диффи-Хелмана. Используется, чтобы в случае похищения ключей исключить расшифрование трафика, записанного еще до этого похищения. Создается на сервере OpenVPN.
  • Статический ключ Алгоритм HMAC для OpenVPN.

Безопасность и шифрование в OpenVPN обеспечивается библиотекой Как пользоваться OpenSSL и протоколом транспортного уровня Transport Layer Security (TLS). Вместо OpenSSL в новых версиях OpenVPN можно использовать библиотеку PolarSSL. Протокол TLS представляет собой усовершенствование протокола защищенной передачи данных уровня защищенных сокетов Secure Socket Layers (Что такое SSL сертификат для сайта, почты).

В OpenSSL может использоваться симметричная и ассиметричная криптография.

В первом случае перед началом передачи данных на все узлы сети необходимо поместить одинаковый секретный ключ. При этом возникает проблема безопасной передачи этого ключа через небезопасный Интернет.

Во втором случае у каждого участника обмена данными есть два ключа — публичный (открытый) и приватный (секретный).

Публичный ключ используется для зашифрования данных, а приватный — для расшифрования. В основе шифрования лежит довольно сложная математика. Выбранный в SSL/TLS алгоритм зашифрования публичным ключом обеспечивает возможность расшифрования только с помощью приватного ключа.

Приватный ключ секретный, и должен оставаться в пределах узла, на котором он создан. Публичный ключ должен передаваться участникам обмена данными.

Для безопасной передачи данных необходимо идентифицировать стороны, принимающие участие в обмене данными. В противном случае можно стать жертвой так называемой "атаки посредника" (Man in the Middle, MITM). В ходе такой атаки злоумышленник подключается к каналу передачи данных и прослушивает его. Он также может вмешиваться, удалять или изменять данные.

Чтобы обеспечить аутентификацию (проверку подлинности пользователя) протокол TLS использует инфраструктуру публичных ключей (Public Key Infrastructure, PKI) и асимметричную криптографию.

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

Хотя размер ключа влияет на сложность расшифрования, никакой ключ не дает гарантии полной безопасности данных. Кроме того, существует возможность похищения уже расшифрованных данных и ключей за счет уязвимостей и закладок в операционной системе или прикладном ПО, а также в аппаратном обеспечении серверов и рабочих станций.

Шифрование данных увеличивает трафик и замедляет обмен данными. Чем больше длина ключа, применяемого для шифрования данных, тем труднее будет его подобрать, но и тем заметнее получится замедление обмена данными.

ШАГ 0: Постановка задачи структура сетей под управлением OpenVPN

Изначально статья писалась для Ubuntu 18.04.4 LTS, также она была протестирована под Ubuntu 22 LTS.

Задача:

  1. Настроить сервер OpenVPN на VPS или облаке. Выбор Linux сервера для OpenVPN: Облачная технология от DigitalOcean, Цена виртуального сервера 5 долларов в месяц. Колокейшн (дата-центр) выбран Амстердам, прекрасная связь с Украиной в этом центре.
  2. Создать простую инструкцию для подчиненного сисадмина по управлению сертификатами/ключами: создание, удаление и отзыв сертификатов клиентов OpenVPN

Предоставить доступ удаленным сотрудникам к локальным сетям для работы с бухгалтерским программным обеспечением и для просмотра видеокамер наблюдения. Подключаемые удаленные офисы:

  1. Офис Московский: 4 локальных сети со шлюзом под управлением Debian GNU/Linux 7.11 (wheezy)
  2. Офис Данилевского: 1 локальная сеть шлюз Ubiquiti EdgeOS
  3. Офис Гагарина 1: 1 локальная сеть
  4. Офис Гагарина 2: 1 локальная сеть шлюз MikroTik RB2011UiAS-2HnD-IN

Клиенты:

  1. Мобильные клиенты на Android
  2. Удаленные клиенты Windows 10

Создание нового сертификата пользователя, под правами обычного пользователя (не root).

  • Шаг 1: создание сертификата пользователя
cd ~/openvpn-ca
source vars
./build-key zabbix
  • Шаг 2: создания ovpn файла для программы клиента. Этот файл должен быть передан пользователю, для настройки его клиента
cd ~/client-configs
./make_config.sh zabbix
  • Шаг 3: При необходимости создаем ccd файл, с дополнительными настройками. Например вы хотите клиенту разрешить доступ к локальным сетям за другим клиентом OpenVPN:
cp /etc/openvpn/ccd/base.client /etc/openvpn/ccd/zabbix

Шаблон base.client содержит комментированные строки такого содержания

base.client
$ cat base.client
 
#ifconfig-push 10.8.0.21 10.8.0.22
#push "route 192.168.35.0 255.255.255.0"
#push "route 192.168.22.0 255.255.255.0"
#push "route 10.90.91.0 255.255.255.0"
#iroute 192.168.35.0 255.255.255.0
#iroute 192.168.22.0 255.255.255.0
#iroute 10.90.91.0 255.255.255.0
# all trafic to VPN
#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 208.67.222.222"
#push "dhcp-option DNS 208.67.220.220"

Для отзыва дополнительных сертификатов выполните следующие шаги.

ШАГ 1: ВИДЕО Настройка сетевой конфигурации Ubuntu Linux для OpenVPN: iptables/UFW, ядро Linux

Настройка сетевой конфигурации Linux - сервера для безопасной работы сервера OpenVPN: iptables/UFW, ядро Linux.

Делаем первичную настройку безопасности Ubuntu. Iptables при помощи ufw разрешаем только SSH.

Многим удобнее смотреть, чем читать. Ниже видео версия этого руководства. Настоятельно рекомендую руководство прочитать!

  • Используйте proto udp, потому что он по сравнению с TCP обеспечивает более надежную защиту от DoS-атак и сканирования портов.
  • Используйте Алгоритм HMAC для OpenVPN
  • Запускайте демон OpenVPN сервера от имени непривилегированного пользователя: user nobody group nobody

Необходимо настроить сетевую конфигурацию сервера, чтобы OpenVPN мог корректно перенаправлять трафик. Инструкция применима для операционных систем на базе Linux ядра: Debian, Ubuntu, CentOS и т.д..

Разрешим серверу перенаправлять трафик, настройка производится в файле /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Найдите строку настройки net.ipv4.ip_forward. Удалите “#” из начала строки, чтобы раскомментировать её. Для применения настроек к текущей сессии наберите команду:

sudo sysctl -p

В общем случае для корректной работы сервера OpenVPN вы должны открыть входящий порт для клиентов и включить NAT преобразование сетевых адресов Маскарадинг (Masquerading) преобразование, если вы весь трафик клиента, хотите маршрутизировать через VPN.

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

Firewall iptables: Открываем UDP порт 1194 и разрешаем пакеты приходящие с интерфейса TUN и TAP или tun.

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
or
iptables -A INPUT -i tun+ -j ACCEPT
# для динамического IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Если вы используете надстройку над iptables UFW, выполните нижеприведенные действия.

Найдите публичный интерфейс сети (public network interface). Для этого наберите команду:

ip route | grep default

Публичный интерфейс должен следовать за словом "dev". Зная название интерфейса откроем файл /etc/ufw/before.rules и добавим туда соответствующие настройки:

sudo nano /etc/ufw/before.rules

Это файл содержит настройки UFW, которое применяются перед применением правил UFW. Добавьте в начало файла выделенные красным строки. Это настроит правила, применяемые по умолчанию, к цепочке POSTROUTING в таблице nat.

Не забудьте заменить eth0 в строке -A POSTROUTING на имя интерфейса, найденное нами ранее.
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
#   ufw-before-input
#   ufw-before-output
#   ufw-before-forward
#
 
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0] 
# Allow traffic from OpenVPN client to eth0
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
 
# Don't delete these required lines, otherwise there will be errors
*filter
. . .

Теперь мы должны сообщить UFW, что ему по умолчанию необходимо разрешать перенаправленные пакеты. Для этого откройте файл /etc/default/ufw. Найдите в файле директиву DEFAULT_FORWARD_POLICY. Мы изменим значение с DROP на ACCEPT:

DEFAULT_FORWARD_POLICY="ACCEPT"

Далее настроим сам файрвол для разрешения трафика в OpenVPN.

Если вы не меняли порт и протокол в файле /etc/openvpn/server.conf, вам необходимо разрешить трафик UDP для порта 1194. Если вы изменили эти настройки, введите указанные вами значения.

sudo ufw allow 1194/udp

Теперь деактивируем и активируем UFW для применения внесённых изменений:

sudo ufw disable
sudo ufw enable

Шаг 2: Установка OpenVPN Ubuntu

Сначала установим OpenVPN на наш сервер. OpenVPN доступен в стандартных репозиториях Ubuntu, мы можем использовать apt для его установки. Также мы установим пакет easy-rsa, который позволит нам настроить наш собственный внутренний центр сертификации (certificate authority, CA) для использования с нашей VPN.

Обновим список пакетов сервера и установим необходимые пакеты следующими командами:

sudo apt update
sudo apt full-upgrade
sudo apt install openvpn
 
wget https://github.com/OpenVPN/easy-rsa-old/archive/refs/heads/master.zip

Эта статья написана easy-rsa версии 2.3.3. В современных дистрибутивах в репозиториях версия 3. Версия 3 очень сильно изменена и не подходит для использования в этой статье.

Шаг 3: Создание директории центра сертификации

OpenVPN это виртуальная частная сеть, использующая TLS/SSL. Это означает, что OpenVPN использует сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов (trusted certificates) нам потребуется создать наш собственный центр сертификации.

Первый вариант копирования файлов easy-rsa

cp -r /usr/share/easy-rsa  /etc/openvpn/
cd /etc/openvpn/easy-rsa

Но я буду использовать второй вариант копирования файлов easy-rsa Для начала скопируем шаблонную директорию easy-rsa в нашу домашнюю директорию с помощью команды make-cadir:

make-cadir ~/openvpn-ca

Шаг 4: Настройка переменных EasyRSA и построение CA

Откройте на компьютере CA каталог EasyRSA, для этого перейдем в директорию openvpn-ca для начала настройки центра сертификации:

cd ~/openvpn-ca

В этом каталоге есть файл с именем vars, создайте его копию.

cp vars vars.original

Для настройки переменных нашего центра сертификации нам необходимо отредактировать файл vars. Откройте этот файл в вашем текстовом редакторе:

nano vars

Внутри файла вы найдёте переменные, которые можно отредактировать, и которые задают параметры сертификатов при их создании. Нам нужно изменить всего несколько переменных.

Чтобы в дальнейшем, при создании сертификатов, не появлялась ошибка про отсутствие файла openssl.cnf, вы можете пойти двумя путями. Первый просто переименовать нужный файл.

cp openssl-1.0.0.cnf openssl.cnf

И второй путь, отредактировать в файле vars параметр export KEY_CONFIG:

# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
#export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_CONFIG=$EASY_RSA/openssl-1.0.0.cnf

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

~/openvpn-ca/vars
. . .
 
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"
 
. . .

Замените значения, на что-нибудь другое, не оставляйте их не заполненными:

~/openvpn-ca/vars
. . .
 
export KEY_COUNTRY="UA"
export KEY_PROVINCE="NY"
export KEY_CITY="Kharkiv"
export KEY_ORG="Mirax"
export KEY_EMAIL="darkfire@example.com"
export KEY_OU="MyPersonal"
 
. . .

Отредактируйте значение KEY_NAME чуть ниже, которое заполняет поле субъекта сертификатов. Проще всего задать ему имя server, потому что в документации примеры конфигов сервера OpenVPN используют это имя:

~/openvpn-ca/vars
export KEY_NAME="server"

Сохраните и закройте файл.

Шаг 5: Создание центра сертификации

Теперь мы можем использовать заданные нами переменные и утилиты easy-rsa для создания центра сертификации.

Убедитесь, что вы находитесь в директории центра сертификации и используйте команду source к файлу vars:

cd ~/openvpn-ca
source vars

Вы должны увидеть следующий вывод:

Вывод

NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys

Возможно вам нужно будет переименовать файл:

cp openssl-1.0.0.cnf openssl.cnf

Убедимся, что мы работаем в “чистой среде” выполнив следующую команду:

./clean-all

Теперь мы можем создать наш корневой центр сертификации командой:

./build-ca

Эта команда запустит процесс создания ключа и сертификата корневого центра сертификации. Поскольку мы задали все переменные в файле vars, все необходимые значения будут введены автоматически. Нажимайте ENTER для подтверждения выбора:

В результате будет создан центр сертификации и два важных файла, ca.crt и ca.key, представляющие открытую и закрытую части сертификата SSL.

Теперь у нас есть центр сертификации, который мы сможем использовать для создания всех остальных необходимых нам файлов.

Теперь ваш центр сертификации установлен и готов подписывать запросы сертификатов.

Шаг 6: Создание сертификата сервера, ключа и файлов шифрования

Далее создадим сертификат, пару ключей и некоторые дополнительные файлы, используемые для осуществления шифрования, для нашего сервера.

Начнём с создания сертификата OpenVPN и ключей для сервера. Это можно сделать следующей командой:

Внимание: Если ранее вы выбрали имя, отличное от server, вам придётся немного изменить некоторые инструкции. Например, при копировании созданных файлов в директорию /etc/openvpn вам придётся заменить имена на заданные вами. Вам также придётся изменить файл /etc/openvpn/server.conf для того, чтобы он указывал на корректные .crt и .key файлы.

./build-key-server server

Вывод опять будет содержать значения по умолчанию, переданные этой команде (server), а также значения из файла vars.

Согласитесь со всеми значениями по умолчанию, нажимая ENTER. Не задавайте challenge password. В конце процесса два раза введите y для подписи и подтверждения создания сертификата:

Вывод

. . .

Certificate is to be certified until May  1 17:51:16 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Далее создадим оставшиеся файлы. Мы можем сгенерировать сильные ключи протокола Диффи-Хеллмана, используемые при обмене ключами, командой:

./build-dh

Для завершения этой команды может потребоваться несколько минут.

Далее мы можем сгенерировать подпись HMAC для усиления способности сервера проверять целостность TSL:

openvpn --genkey --secret keys/ta.key

Шаг 7: Создание сертификата и пары ключей для клиента

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

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

Поскольку мы можем вернуться к этому шагу позже, мы повторим команду source для файла vars. Мы будем использовать параметр client1 для создания первого сертификата и ключа.

Для создания файлов без пароля для облегчения автоматических соединений используйте команду build-key:

cd ~/openvpn-ca
source vars
./build-key client1

Для создания файлов, защищённых паролем, используйте команду build-key-pass:

cd ~/openvpn-ca
source vars
./build-key-pass client1

В ходе процесса создания файлов все значения по умолчанию будут введены, вы можете нажимать ENTER. Не задавайте challenge password и введите y на запросы о подписи и подтверждении создания сертификата.

Шаг 8: Настройка конфигурационного файла сервера OpenVPN

Далее настроим конфигурационный файл сервера OpenVPN с использованием созданных ранее файлов.

Копирование файлов в директорию OpenVPN. Нам необходимо скопировать нужные нам файлы в директорию /etc/openvpn.

Сначала скопируем созданные нами файлы. Они находятся в директории ~/openvpn-ca/keys, в которой они и были созданы. Нам необходимо скопировать сертификат и ключ центра сертификации, сертификат и ключ сервера, подпись HMAC и файл Diffie-Hellman:

cd ~/openvpn-ca/keys
sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn

Далее нам необходимо скопировать и распаковать файл-пример конфигурации OpenVPN в конфигурационную директорию, мы будем использовать этот файл в качестве базы для наших настроек:

gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

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

tls-auth ta.key 0
key-direction
cipher AES-128-CBC
auth SHA256
user nobody
group nogroup

Рабочий конфигурационный файл OpenVPN сервера:

server.conf
;local a.b.c.d
local xxx.xxx.xxx.xxx # IP на котором сервер слушает входящие сообщения
port 1194 # порт на котором сервер слушает входящие сообщения
proto udp
# Включение интерфейса управления OpenVPN. Доступен при помощи telnet localhost 7505
# management localhost 7505
dev tun
ca ca.crt # местонахождение самоподписного доверенного сертификата (CA)
cert server.crt # местонахождение сертификата сервера
key server.key  # местонахождение закрытого ключа сервера
dh dh2048.pem # местонахождение файла параметров Диффи-Хэлмана
 
# Настройка режима сервера и адреса VPN-сети, 
# из которой OpenVPN будет раздавать адреса клиентам.
# Сервер возьмет себе 10.8.0.1,
# остальные адреса будут доступны для клиентов.
# Каждый клиент сможет связаться с сервером по адресу 10.8.0.1.
server 10.8.0.0 255.255.255.0
# в файле ipp.txt хранится информация о соединении, например на случай обрыва соединения
# и его дальнейшего восстановления
ifconfig-pool-persist /var/log/openvpn/ipp.txt
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100
;server-bridge
# маршруты которые будут передаваться каждому клиенту.
# push - команда OpenVPN, передаваемая клиенту и выполняемая клиентом
# (в данном случае добавляем на стороне клиента два маршрута к виртуальной частной сети)
push "route 192.168.35.0 255.255.255.0"
# указываем где будут хранятся файлы с настройками IP-адресов клиентов
client-config-dir ccd
# добавляем маршрут сервер-клиент.
# route - добавляет на стороне сервера маршруты к локальным подсетям, находящимся за клиентами
route 192.168.35.0 255.255.255.0
route 192.168.22.0 255.255.255.0
route 10.90.91.0 255.255.255.0
# маршрут передается всем клиентам
push "route 192.168.35.0 255.255.255.0"
# Перенаправлять default gateway на vpn-сервер. Если не нужно - закомментировать или 
# добавить в ccd для конкретного клиента
;push "redirect-gateway def1 bypass-dhcp"
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"
client-to-client # разрешить общение клиентов подключенных к серверу OpenVPN общение между собой
;duplicate-cn
# Директива проверки работоспособности, включающая отсылку
# ping-подобных сообщений туда и обратно через
# соединение для того, чтобы каждая сторона знала когда
# другая сторона внезапно пропадет (gone down).
# Пинг каждые 10 секунд, с предположением, что удаленный
# узел недоступен, если не получено на одного пинга за период времени
# равный 120 секундам.
keepalive 10 120
tls-auth ta.key 0 # This file is secret
key-direction 0
cipher AES-128-CBC
auth SHA256
;compress lz4-v2
;push "compress lz4-v2"
;comp-lzo
max-clients 100
user nobody
group nogroup
persist-key
persist-tun
# Содержимое небольшого файла состояния, показывающего
# текущие соединения, усекается
# и перезаписывается раз в минуту.
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
;log-append  /var/log/openvpn/openvpn.log
verb 3 # уровень отладки
;mute 20
explicit-exit-notify 1

Шаг 9: Включение и запуск сервиса OpenVPN

Включим сервис OpenVPN с помощью systemd.

При запуске сервера OpenVPN необходимо указать имя нашего файла конфигурации в качестве переменной после имени файла systemd. Файл конфигурации для нашего сервера называется /etc/openvpn/server.conf, поэтому мы добавим @server в конец имени файла при его вызове:

sudo systemctl start openvpn@server

Убедимся, что сервис успешно запущен командой:

sudo systemctl status openvpn@server

Если всё в порядке, настроем сервис на автоматическое включение при загрузке сервера:

sudo systemctl enable openvpn@server

Шаг 10: Создание инфраструктуры для конфигурационных файлов клиентов

Создание структуры директорий для конфигурационных файлов клиентов. В домашней директории создайте структуру директорий для хранения файлов:

mkdir -p ~/client-configs/files

Поскольку наши файлы конфигурации будут содержать клиентские ключи, мы должны настроить права доступа для созданных директорий:

chmod 700 ~/client-configs/files

Создание базовой конфигурации: Далее скопируем конфигурацию-пример в нашу директорию для использования в качестве нашей базовой конфигурации:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

Откройте этот файл в вашем текстовом редакторе:

nano ~/client-configs/base.conf

Работающий base.conf. Я привел его одинаковым настройкам с сервером, изменил параметры cipher, auth, key-direction. Основное отличие клиентского файла от серверного в директиве client и задании местонахождения сервера OpenVPN, при помощи директивы remote.

Если ваш клиент работает на Linux и использует файл /etc/openvpn/update-resolv-conf нужно раскомментировать три нижние строчки.

# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
base.conf
client
dev tun
proto udp
;remote xxx.xxx.xxx.xxx 1194
remote vpn8.example.net 1194
resolv-retry infinite
nobind
#user nobody
#group nogroup
persist-key
persist-tun
#ca ca.crt
#cert client.crt
#key client.key
remote-cert-tls server
tls-auth ta.key 1
#cipher AES-256-CBC
cipher AES-128-CBC
auth SHA256
#comp-lzo
verb 3
;mute 20
key-direction 1
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

ШАГ 11: Создание скрипта генерации файлов конфигурации клиента

Теперь создадим простой скрипт для генерации файлов конфигурации с релевантными сертификатами, ключами и файлами шифрования. Он будет помещать сгенерированные файла конфигурации в директорию ~/client-configs/files.

Создайте и откройте файл make_config.sh внутри директории ~/client-configs:

nano ~/client-configs/make_config.sh

Вставьте следующие текст в этот файл:

make_config.sh
~/client-configs/make_config.sh
#!/bin/bash
 
# First argument: Client identifier
 
KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
 
cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

Сохраните и закройте файл.

Сделайте его исполняемым файлом командой:

chmod 700 ~/client-configs/make_config.sh

ШАГ 12: Генерация конфигурационных файлов клиентов

Теперь легко и понятно можно генерировать файлы конфигурации клиентов.

Если вы следовали всем шагам этой статьи, вы создали сертификат client1.crt и ключ клиента client1.key командой ./build-key client1 на шаге 7. Вы можете сгенерировать конфигурацию для этих файлов перейдя в директорию ~/client-configs и используя только что созданный нами скрипт:

cd ~/client-configs
./make_config.sh client1

Если всё прошло успешно, мы должны получить файл client1.ovpn в директории ~/client-configs/files:

ls ~/client-configs/files
 
client1.ovpn

Теперь вы должны скопировать или переместить полученный файл конфигурации на клиентское устройство: на компьютер или смартфон.

ШАГ 13: Клиенты OpenVPN для разных ОС Windows, Android, MikroTik, Ubuntu, MacOS

Для Linux проще всего ставить этот же пакет OpenVPN, но настраивать его клиентом.

sudo apt install openvpn

Пример рабочего конфига для Ubuntu 20.04.1 LTS скачиваем файл (с расширением ovpn) созданный на этапе 10. Копируем его в директорию /etc/openvpn клиента (переименовываем расширение):

cp client1.ovpn client1.conf

Тестируем работу клиента:

sudo openvpn --config client1.conf

Если все ОК - настраиваем автозапуск клиента в Ubuntu. Для Ubuntu 18.04 LTS и выше нужно включить службу OpenVPN для запуска во время загрузки перечитать конфиг systemctl. Положите конфигурационный файл в /etc/openvpn/client/имя-конфига.conf

sudo systemctl enable openvpn-client@client1
sudo systemctl daemon-reload

Запускаем клиента

sudo systemctl start openvpn-client@client1

ШАГ 14: (Опционально) Директория ccd клиенты OpenVPN

В директории ccd хранятся индивидуальные настройки для каждого клиента. Имя файла должно соответствовать имени сгенерированного клиентского сертификата. Файлы конфигурации клиентов являются текстовыми файлами и содержат команды, выполняемые сервером при подключении клиентов. Обычно файл клиента содержать команды:

  1. добавляет клиенту маршрут к локальной подсети центрального офиса(push "route 192.168.1.0 255.255.255.0")
  2. определяет адрес локальной подсети, находящейся за клиентом (например iroute 192.168.2.0 255.255.255.0)
  3. привязка к статическому IP (ifconfig-push 192.168.14.21 192.168.14.22), где ifconfig-push <IP-адрес клиента> <IP-адрес сервера>. Выбранные пары IP-адресов, во-первых, должны быть уникальными, во-вторых, должны входить в состав последовательных подсетей, ограниченных маской /30 (255.255.255.252), и, в-третьих, должны находиться в пределах пула IP-адресов, выделенного для виртуальной частной сети (определяется параметром server файла конфигурации сервера OpenVPN).
# mkdir /etc/openvpn/ccd
# nano ccd/farm1c
push "route 192.168.1.0 255.255.255.0"
#push "route 192.168.35.0 255.255.255.0"
# static IP
ifconfig-push 192.168.14.21 192.168.14.22
#iroute 192.168.2.0 255.255.255.0

Шаг 15: Отзыв клиентских сертификатов crl-verify

Сотрудники увольняются и им нужно запретить доступ к VPN. Значит нужно отозвать их сертификат. Команда revoke-full с именем клиента используется для отзыва ssl сертификата OpenVPN.

Если нет файла .rnd (это файл генератора псевдослучайных чисел) в каталоге пользователя, от имени которого вы создаете сертификаты, выполните командой:

$ cd
$ touch .rnd
default_crl_days= 3000                  # how long before next CRL

Переходим в директорию центра сертификации и вводим команды:

$ cd ~/openvpn-ca
$ source vars

Отзываем сертификат используя команду revoke-full с именем клиента, например client1.

$ ./revoke-full client1

В результате работы будет создан файл crl.pem в директории keys с необходимой для отзыва сертификата информацией. Теперь нужно объяснить серверу OpenvPN, где ему брать информацию об отозванных сертификатах, для этого используется директива crl-verify. Сервер OpenVPN будет проверять список отозванных сертификатов из файла каждый раз crl.pem, когда кто-то устанавливает соединение с сервером.

Копируем crl.pem в каталог. В конце файла /etc/openvpn/server.conf задаем путь через директиву crl-verify

crl-verify crl.pem

Перезапускаем сервер OpenVPN

# service openvpn restart

Теперь клиент не сможет устанавливать соединение с сервером OpenVPN используя старый сертификат, в логе сервера будет появляться строка о том что сертификат отозван: VERIFY ERROR: depth=0, error=certificate revoked. В логе OpenVPN клиента будет написано:

Wed Aug 25 14:28:09 2021 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Wed Aug 25 14:28:09 2021 TLS Error: TLS handshake failed

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

Если у вас 2 сервера openvpn, вам следует переименовать crl.pem и в crl-verify задать файл со своим именем. Просто для второго сервера копируем и переименовываем crl.pem например в crltcp.pem. Если вы укажите один и тот же файл для разных OpebVPN серверов - ваши сервера будут падать.

FAQ OpenVPN

Frequently Asked Questions OpenVPN. Часто задаваемые вопросы по настройке сервера и клиентов OpenVPN

Проблема: Если сервер подключён к ISP при помощи технологии Как работает PPPoE, в этом случае OpenVPN не сможет сделать доступными сети за подключённым клиентом. Не будет отрабатывать команда iroute. Это связано с тем, что PPP прописывает маршрут по умолчанию в таком виде:

# netstat -rn
Kernel IP routing table              
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         0.0.0.0         0.0.0.0         U         0 0          0 ppp0

Т.е. указывается маршрутом по умолчанию интерфейс (ppp0), а не IP адресс, такой записи сервер OpenVPN не понимает, для корректной работы сервера OpenVpn маршрут должен бы вида:

# netstat -rn
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         91.196.96.35    255.255.255.255 UGH       0 0          0 ppp0

Решение: Исправить маршрут по умолчанию можно командой (соответственно указав нужный вам IP)

route add 0/0 gw 91.196.96.35

или в скрипте при загрузке системы, но после поднятия интерфейса ppp0

route del default
route add default gw 91.196.96.35 dev ppp0

Окружение: Клиент выходит в интернет с Ubuntu 14.04.3 LTS + Настройка Dnsmasq Ubuntu установленной в Виртуализация при помощи VirtualBox. Сеть установлена в VirtualBox как сетевой мост. IP получается от Настройка DHCP сервера Linux, FreeBSD на интернет роутере (Netis WF2419R).

Проблема: Не работает push "dhcp-option DNS 10.26.95.254". Соответственно все Раздел DNS: Что такое DNS Dnsmasq отсылает основному DNS серверу. Все бы ничего если бы клиенту не нужны локальные Раздел DNS: Что такое DNS.

Решение: Был доустановлен основной пакет

aptitude install dnsmasq

добавлены описания наших локальных зон (non-public domains) в конфигурационный файл dnsmasq.conf

server=/gaga.lan/10.26.95.254
server=/m86a.lan/10.26.95.254
server=/atlex.lan/10.26.95.254
 
server=/95.26.10.in-addr.arpa/10.26.95.254
server=/168.192.in-addr.arpa/10.26.95.254
server=/85.161.10.in-addr.arpa/10.26.95.254

В файле /etc/logrotate.d/openvpn прописываем настройки для приложения logrotate, ключевой параметр copytruncate (чтобы не перегружать OpenVPN и заставить его писать данные в тот же лог файл)

openvpn
etc/openvpn/servers/vpnluxor/logs/openvpn.log {
        daily
        rotate 8
        compress
        delaycompress
        missingok
        copytruncate
        notifempty
        create 640 root
}

Для управления сертификатами/клиентами сервера OpenVPN при помощи веб-интерфейса существует не так много программ:

  • Модуль на основе Webmin: OpenVpn Admin Module + пример настройки OpenVPN Server
  • OpenVPN-PHP-Gui MIT License
  • OpenVPN Access Server платный вариант, требуется покупка лицензии
  • ca.crt — файл открытой части сертификата CA, который используется сервером и клиентом OpenVPN, чтобы информировать друг друга о том, что они входят в единую сеть доверия и что между ними отсутствует потенциальный злоумышленник в качестве посредника. В связи с этим, копия файла ca.crt потребуется для вашего сервера и для всех ваших клиентов.
  • ca.key — закрытый ключ CA, используемый для подписания ключей и сертификатов серверов и клиентов. Если злоумышленник получит доступ к CA и файлу ca.key, он сможет подписывать запросы сертификатов и получать доступ к вашей VPN, что нарушит ее безопасность. Поэтому файл ca.key должен храниться только на компьютере CA, и для дополнительной безопасности компьютер CA следует выключать, когда он не используется для подписывания запросов сертификатов.
Файл Машина Назначение Доступ
ca.crt Сервер и клиенты Сертификат корневого СА Публичный
ca.key Только на сервере Необходим для подписи других сертификатов Секретный
dh{n}.pem Только на сервере Diffie Hellman параметры Публичный
vpnspar.crt Только на сервере Сертификат сервера Публичный
vpnspar.key Только на сервере Ключ сервера Секретный
darkfire.crt Только на клиенте Сертификат клиента Публичный
darkfire.key Только на клиенте Ключ клиента Секретный

Подборка руководств по настройке сервера и клиентов OpenVPN.

В этом разделе приведены как ссылки на мои руководства по настройке OpenVPN, так и на руководства других авторов, которым я доверяю.

Расширение границ VPN для включения дополнительных машин из подсетей на стороне клиента или сервера. Включение нескольких машин на стороне сервера при использовании маршрутизируемого VPN (dev tun)

Поскольку VPN действует только в режиме точка-точка, может возникнуть желание расширить границы VPN так, чтобы клиенты могли связываться с другими машинами в сети сервера, а не только с самим сервером.

Чтобы проиллюстрировать это примером, предположим, что в локальной сети на стороне сервера используется подсеть 10.66.0.0/24 и для пула VPN-адресов используется 10.8.0.0/24, о чем говорится в директиве server в файле конфигурации OpenVPN-сервера.

Во-первых, вы должны сообщить VPN-клиентам, что подсеть 10.66.0.0/24 доступна через VPN. Это легко можно сделать с помощью следующих директив в конфигурационном файле сервера:

push "route 10.66.0.0 255.255.255.0"

Далее, необходимо настроить на LAN- шлюзе в сети сервера маршрут для маршрутизации пакетов, предназначенных для подсети VPN-клиентов (10.8.0.0/24) через OpenVPN-сервер (это необходимо только тогда, когда сервер OpenVPN и LAN-шлюз – разные машины).

Убедитесь, что вы включили пересылку для IP (ip-forwarding) (параметр ядра net.ipv4.ip_forward должен быть равен 1) и TUN/TAP на машине OpenVPN-сервера.

Проталкивание изменений DNS для перенаправления всего трафика через VPN.

Сделанные нами настройки создают VPN соединение между двумя машинами, но они не заставляют эти машины использовать VPN соединение. Если вы хотите использовать VPN соединение для всего своего трафика, вам необходимо протолкнуть (push) настройки DNS на клиентские машины.

Для этого вам необходимо раскомментировать несколько директив. Найдите секцию redirect-gateway и удалите “;” из начала строки для расскоментирования redirect-gateway:

/etc/openvpn/server.conf

push "redirect-gateway def1 bypass-dhcp"

Чуть ниже находится секция dhcp-option. Удалите “;” для обеих строк:

/etc/openvpn/server.conf

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Это позволит клиентам сконфигурировать свои настройки DNS для использования VPN соединения в качестве основного.

PQ VPS сервера в 28+ странах.