OpenVPN: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
м (→‎Шаг 4 - усиление защиты OpenVPN: Небольшое уточнение)
 
(не показано 190 промежуточных версий 2 участников)
Строка 1: Строка 1:
[[Категория:Руководства]]
OpenVPN — свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом для создания зашифрованных каналoв типа точка-точка или клиент-сервер между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT и сетевым экраном, без необходимости изменения их настроек. OpenVPN была создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL.
== Предисловие ==
== Предисловие ==
Прежде чем начать, рекомендуется ознакомиться с особенностями работы OpenVPN на ALT Linux.
Прежде чем начать, рекомендуется ознакомиться с особенностями работы OpenVPN на ALT Linux.
Строка 31: Строка 34:
;Когда запускаем сервис<nowiki>:</nowiki>
;Когда запускаем сервис<nowiki>:</nowiki>
* демон openvpn запускает скрипт <tt>/etc/openvpn/openvpn-startup</tt>
* демон openvpn запускает скрипт <tt>/etc/openvpn/openvpn-startup</tt>
* читает файлы <tt>*.conf</tt> указанные в <tt>/etc/openvpn/openvpn-startupn</tt> из <tt>/etc/openvpn/</tt>
* читает файлы <tt>*.conf</tt> указанные в <tt>/etc/openvpn/openvpn-startup</tt> из <tt>/etc/openvpn/</tt>
* читает файлы dh, ca и ключи из папки указанной в конфигурационном файле сервера. Этот каталог доступен демону только при его запуске
* читает файлы dh, ca и ключи из папки указанной в конфигурационном файле сервера. Этот каталог доступен демону только при его запуске
* выполняет chroot в <tt>/var/lib/openvpn/</tt> и cd в <tt>/var/lib/openvpn/cache</tt>
* выполняет chroot в <tt>/var/lib/openvpn/</tt> и cd в <tt>/var/lib/openvpn/cache</tt>
Строка 38: Строка 41:
=== Советы по устранению неполадок ===
=== Советы по устранению неполадок ===
;Права доступа к файлам<nowiki>:</nowiki>
;Права доступа к файлам<nowiki>:</nowiki>
* ключи должны быть доступны только руту;
* ключи должны быть доступны только root;
* конфигурации клиентов и файл отзывов сертификатов CRL должны быть доступны на чтение пользователю openvpn.
* конфигурации клиентов должны быть доступны на чтение пользователю openvpn;
* файл отзывов сертификатов CRL должны быть доступны на чтение пользователю openvpn.
 
==== Журналирование ====
Если вы используете [[UFW|UFW]] или iptables с журналированием, то вы сможете посмотреть блокировки в реальном времени с помощью команды:
    <tt>journalctl -k -f</tt>
 
Посмотреть журналы openvpn в реальном времени:
    <tt>journalctl -u openvpn -f</tt>
 
==== Файл CRL ====
Файл crl.pem нужно обновлять заранее, иначе если истечет срок действия файла crl.pem, то клиенты не смогут подключиться. В журналах работы сервера при этом увидите ошибки подключения клиентов и указание на проблему срока действия CRL:
    VERIFY ERROR: depth=0, error=CRL has expired: CN=client1
Чтобы проверить последнюю дату обновления файла CRL используй команду:
    openssl crl -inform PEM -in crl.pem -text -noout
    Last Update: Aug 26 13:30:36 2022 GMT
    Next Update: Sep 25 13:30:36 2023 GMT
 
Чтобы обновить CRL используй команду:
    ./easyrsa gen-crl
 
==== Директива CCD ====
Ошибка в журнале следующего вида сообщает о том, что у вас включена директива ccd, но файл ccd для client1 отсутствует или не настроен:
    TLS Auth Error: --client-config-dir authentification failed for common name 'client1' file='/etc/openvpn/ccd/client1'
 
== Развертывание сервера OpenVPN ==
 
В данной статье OpenVPN сервер настраивается с использованием ECC (elliptic curve cryptography) шифрования, что требует обязательного использования следующих версий программного обеспечения:
    openvpn 2.4.0 и выше
    easyrsa 3.0 и выше
    openssl 1.0.1 и выше


== Развертывание OpenVPN ==
=== Шаг 1 - установка openvpn и easy-rsa ===
=== Шаг 1 - установка openvpn и easy-rsa ===
Проверь обновления и установи обновления для своей системы.<br>
Проверь обновления и установи обновления для своей системы.<br>
Строка 50: Строка 82:


Установка openvpn создаст в папке /etc папку openvpn.<br>
Установка openvpn создаст в папке /etc папку openvpn.<br>
В зависимости от устанавливаемой версии, установка easyrsa создаст в папке /user/share папку easyrsa или easyrsa3 или easy-rsa. В нашем случае это easyrsa3. От версии к версии пакет easyrsa не подвергается существенным изменениям, функционал остается прежним.<br>
Установка easyrsa создаст в папке /usr/share папку easyrsa или easyrsa3 или easy-rsa. В нашем случае была создана папка easyrsa3. <br>


Создай папку easy-rsa в папке openvpn. Мы собираемся разместить PKI здесь, поэтому запрети всем кроме root войти в папку easy-rsa<br>
Создай папку easy-rsa в папке openvpn. Здесь будет размещена инфраструктура открытых ключей (PKI), поэтому запрети всем кроме root войти в папку easy-rsa<br>
     mkdir /etc/openvpn/easy-rsa
     mkdir /etc/openvpn/easy-rsa
     chown root /etc/openvpn/easy-rsa
     chown root /etc/openvpn/easy-rsa
Строка 59: Строка 91:
=== Шаг 2 - инициализация PKI ===
=== Шаг 2 - инициализация PKI ===


Cкопируй шаблон с параметрами по умолчанию для easyrsa vars.example и переименуй его в vars. Мы собираемся отредактировать шаблон с настройками шифрования. Данный файл будет влиять на все созданные нами сертификаты и ключи шифрования, созданные далее. <br>
Традиционными алгоритмами шифрования в OpenVPN является DH и RSA. Вместо этого, будет использоваться ECDH и ECDSA - протокол Диффи Хелмана на эллиптических кривых (ECC). Исследование показало[https://habr.com/ru/articles/335906], что ECDH и ECDSA обладает более высокой криптостойкостью в сравнении с DH и RSA , поэтому задействуем в настройке сервера алгоритмы шифрования ECDH и ECDSA. OpenVPN использует кривую автоматически из сертификата сервера сгенерированного с помощью ECDSA [https://github.com/OpenVPN/openvpn/blob/master/README.ec] при условии, что в конфигурации сервера директива dh отключена. Файл dh.pem не будет генерироваться. Если сгенерировать сертификат сервера на алгоритме RSA, то OpenVPN будет вынужден попытаться выполнить согласование алгоритмов. В случае ошибки согласования OpenVPN будет использовать <tt>secp384r1</tt> в качестве запасного варианта при аутентификации. Прошу обратить внимание, что в данной статье создан один общий для всех <tt>vars</tt> файл, используемый для генерации сертификатов и ключей, поэтому сертификаты клиентов также будут настроены на использование шифрования с помощью ECC.
 
Cкопируй шаблон <tt>vars.example</tt> с параметрами по умолчанию для easyrsa и переименуй его в <tt>vars</tt>. Данный файл будет влиять на все созданные нами сертификаты и ключи шифрования, созданные далее. <br>
     cd /etc/openvpn/easy-rsa/
     cd /etc/openvpn/easy-rsa/
     cp /usr/share/easyrsa3/vars.example vars
     cp /usr/share/easyrsa3/vars.example vars
Строка 65: Строка 99:
     # Размер секретного ключа в битах
     # Размер секретного ключа в битах
     set_var EASYRSA_KEY_SIZE 4096
     set_var EASYRSA_KEY_SIZE 4096
   
     # Включить поддержку криптографии эллиптической кривой (рекомендуется)
     # Включить поддержку криптографии эллиптической кривой (рекомендуется)
     set_var EASYRSA_ALGO "ec"
     set_var EASYRSA_ALGO "ec"
   
     # Настройки цифровой подписи сертификата
     # Настройки цифровой подписи сертификата
     set_var EASYRSA_DIGEST "sha512"
     set_var EASYRSA_DIGEST "sha512"
   
     # Срок действия всех выпущенных сертификатов в том числе и сервера в днях (1800 дней - это 4.9 лет)
     # Срок действия всех выпущенных сертификатов в том числе и сервера в днях (1800 дней - это 4.9 лет)
     set_var EASYRSA_CERT_EXPIRE 1800
     set_var EASYRSA_CERT_EXPIRE 1800
   
     # Число дней до следующей даты публикации CRL.  
     # Число дней до следующей даты публикации CRL.  
     set_var EASYRSA_CRL_DAYS 365
     set_var EASYRSA_CRL_DAYS 365
     # crl.pem файл нужно обновлять заранее,  
     # crl.pem файл нужно обновлять заранее,  
     # иначе если истечет срок действия файла crl.pem, то клиенты не смогут подключиться.
     # иначе если истечет срок действия файла crl.pem, то клиенты не смогут подключиться  
     # В журналах работы сервера при этом будет
     # В журналах работы сервера при этом увидите
     # видны ошибки подключения клиентов и указание на проблему срока действия CRL.
     # ошибки подключения клиентов и указание на проблему срока действия CRL.
     # Чтобы проверить последнюю дату обновления файла CRL
     # Чтобы проверить последнюю дату обновления файла CRL
     # используй следущее: openssl crl -inform PEM -in crl.pem -text -noout
     # используй команду: openssl crl -inform PEM -in crl.pem -text -noout
     # Last Update: Aug 26 13:30:36 2022 GMT
     # Last Update: Aug 26 13:30:36 2022 GMT
     # Next Update: Sep 25 13:30:36 2023 GMT
     # Next Update: Sep 25 13:30:36 2023 GMT
     # Чтобы обновить CRL используй следующее: ./easyrsa gen-crl
     # Чтобы обновить CRL используй команду: ./easyrsa gen-crl


Когда вы закончите работу с сертификатами сервера вы можете уменьшить срок действия сертификатов клиента. Просто измените EASYRSA_CERT_EXPIRE в любой момент в файле vars.<br>
Когда вы закончите работу с сертификатами сервера вы можете уменьшить срок действия сертификатов клиента. Просто измените EASYRSA_CERT_EXPIRE в любой момент в файле vars.<br>
Приступим к инициализации PKI. На первом запуске, если не указать <tt>--vars</tt>, easyrsa установит значения по умолчанию, которые вшиты в программу easyrsa, в функции vars_setup()<br>
 
Приступим к инициализации PKI. На первом запуске, если не указать <tt>--vars</tt>, easyrsa установит значения по умолчанию, которые вшиты в программу easyrsa, в функции vars_setup(), поэтому запускаем инициализацию PKI с указанием местоположения файла vars:<br>
     easyrsa --vars=/etc/openvpn/easy-rsa/vars init-pki
     easyrsa --vars=/etc/openvpn/easy-rsa/vars init-pki


После инициализации инфраструктуры ключей, для надежности конфигураций, создадим ссылки на vars, где easyrsa ожидает его появления (см. функцию <tt>vars_setup()</tt> в программе easyrsa)<br>
После инициализации инфраструктуры ключей, для надежности работы конфигурации шифрования, создадим ссылки на vars в нескольких местах (не во всех), где easyrsa ожидает его появления (см. функцию <tt>vars_setup()</tt> в программе easyrsa)<br>
Создай ссылку на vars в папке с pki, т.к. easyrsa ищет файл vars в <tt>$PWD/pki</tt><br>
Создай ссылку на vars в папке с pki, т.к. easyrsa ищет файл vars в <tt>$PWD/pki</tt><br>
     ln -s /etc/openvpn/easy-rsa/vars /etc/openvpn/easy-rsa/pki/vars
     ln -s /etc/openvpn/easy-rsa/vars /etc/openvpn/easy-rsa/pki/vars
Создай ссылку на vars в <tt>/usr/bin/vars</tt>, т.к. при использовании, easyrsa ищет файл vars рядом с программой easyrsa<br>
В ALT Linux easyrsa расположен в <tt>/usr/bin</tt>. Создай ссылку на файл vars в <tt>/usr/bin/</tt>, т.к. easyrsa ищет файл vars рядом с easyrsa.<br>
     ln -s /etc/openvpn/easy-rsa/pki/vars /usr/bin/vars
     ln -s /etc/openvpn/easy-rsa/vars /usr/bin/vars
Создай ссылку на программу easyrsa в папке где лежит настоящий файл vars, т.к. скрипт <tt>make-config.sh</tt> (описанный далее) запускает easyrsa в этой папке. Данная ссылка на самом деле адаптация под семейство debian, т.к. в debian системах easyrsa не располагается в <tt>/usr/bin</tt>.<br>
Скрипт <tt>make-config.sh</tt> описанный на шаге создания клиентских конфигураций <tt>*.ovpn</tt> ищет easyrsa в папке <tt>/etc/openvpn/easy-rsa</tt>, там же у нас лежит файл vars, поэтому создай ссылку на программу easyrsa в этой папке. Создание данной ссылки на самом деле является адаптацией под семейство debian, т.к. в debian системах easyrsa не располагается в <tt>/usr/bin</tt>.<br>
     ln -s /usr/bin/easyrsa /etc/openvpn/easy-rsa/
     ln -s /usr/bin/easyrsa /etc/openvpn/easy-rsa/


=== Шаг 3 - сертификат и ключ сервера ===
=== Шаг 3 - сертификат и ключ сервера ===
Рассмотрим несколько путей работы с сертификатами OpenVPN. В данной статье подробно описан вариант "Б".<br>
Рассмотрим несколько путей работы с сертификатами OpenVPN. В данной статье дальнейшие действия развиваются по варианту "Б" - наиболее распространенный вариант.<br>


'''Вариант "А"''' предназначен для тех, кто собирается подписывать сертификаты ключом центра сертификации CA в организации, то есть любым уже имеющимся <tt>ca.key</tt>.  
'''Вариант "А"''' предназначен для тех, кто собирается подписывать сертификаты ключом центра сертификации CA в организации, то есть любым уже имеющимся <tt>ca.key</tt>.  
Строка 104: Строка 143:
* В данной схеме можно задействовать общедоступный список CRL. Для отзыва сертификатов в вашей организации можно опубликовать список CRL на сервере nginx в локальной сети и организовать автоматическую проверку валидности сертификатов клиентов.
* В данной схеме можно задействовать общедоступный список CRL. Для отзыва сертификатов в вашей организации можно опубликовать список CRL на сервере nginx в локальной сети и организовать автоматическую проверку валидности сертификатов клиентов.
* Для использования данной схемы потребуется уже имеющаяся PKI. Каждый раз при создании сертификатов клиента OpenVPN, вам придется подписывать их способом описным в данном варианте.
* Для использования данной схемы потребуется уже имеющаяся PKI. Каждый раз при создании сертификатов клиента OpenVPN, вам придется подписывать их способом описным в данном варианте.
* Это медленный способ, особенно, если ваш CA не подключен сети и к нему нужно идти с флешкой в выделенное помещение.
* Это медленный способ, особенно, если ваш CA не подключен к сети и к нему нужно идти с флешкой в выделенное помещение.


'''Вариант "Б"''' предназначен для тех, у кого нет <tt>rootCA.key</tt> и хочет его создать либо просто для тех, кого устраивают самоподписанные сертификаты. Это легкий путь.<br>
'''Вариант "Б"''' предназначен для тех, у кого нет <tt>ca.key</tt> и хочет его создать либо просто для тех, кого устраивают самоподписанные сертификаты. Это легкий путь.<br>


==== Вариант "A" - используем уже имеющийся центр сертификации ====
==== Вариант "A" - используем уже имеющийся центр сертификации ====
'''ВНИМАНИЕ! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br>
{{Attention| Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.}}<br>
Шаг А.1 - создание запроса на сертификат и закрытый ключ <br>
Шаг А.1 - создание запроса на сертификат и закрытый ключ <br>


     cd /etc/openvpn/easy-rsa
     cd /etc/openvpn/easy-rsa
     ./easy-rsa gen-req myserver nopass
     ./easy-rsa gen-req myserver nopass
 
   
     Common Name (eg: your user, host, or server name) [server]:
     Common Name (eg: your user, host, or server name) [server]:
     Keypair and certificate request completed. Your files are:
     Keypair and certificate request completed. Your files are:
     req: /home/host/easy-rsa/pki/reqs/myserver.req
     req: /home/host/easy-rsa/pki/reqs/myserver.req
     key: /etc/openvpn/easy-rsa/pki/private/myserver.key
     key: /etc/openvpn/easy-rsa/pki/private/myserver.key
 
   
     cp /etc/openvpn/easy-rsa/pki/private/myserver.key /etc/openvpn/server/
     cp /etc/openvpn/easy-rsa/pki/private/myserver.key /etc/openvpn/server/


На данном этапе мы сгенировали ключ и запрос на подпись сертификата для сервера. CSR готов к подписанию вашим CA.
На данном этапе был сгенерирован ключ и запрос на подпись сертификата для сервера. CSR готов к подписанию вашим CA.


Шаг А.2 - подпись запроса на сертификат
Шаг А.2 - подпись запроса на сертификат


     scp /etc/openvpn/easy-rsa/pki/reqs/myserver.req user@your-ca-server-ip:/tmp
     scp /etc/openvpn/easy-rsa/pki/reqs/myserver.req user@your-ca-server-ip:/tmp
 
   
     user@your-ca-server-ip:$ cd /easy-rsa
     user@your-ca-server-ip:$ cd /easy-rsa
     ./easy-rsa import-req /tmp/myserver.req myserver
     ./easy-rsa import-req /tmp/myserver.req myserver
     ./easy-rsa sign-req server myserver
     ./easy-rsa sign-req server myserver
 
   
     '''You are about to sign the following certificate.'''
     '''You are about to sign the following certificate.'''
     '''Please check over the details shown below for accuracy. Note that this request'''
     '''Please check over the details shown below for accuracy. Note that this request'''
Строка 151: Строка 190:


Создадим центр сертификации. Обязательно введите сложный пароль. Данный пароль вам придется вводить каждый раз при подписывании сертификатов.
Создадим центр сертификации. Обязательно введите сложный пароль. Данный пароль вам придется вводить каждый раз при подписывании сертификатов.
    cd /etc/openvpn
     easyrsa build-ca
     easyrsa build-ca


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


Создадим сертификат сервера без пароля, иначе вам придется каждый раз при перезапуске службы вводить пароль.
Создадим сертификат сервера без пароля, иначе вам придется каждый раз при перезапуске службы вводить пароль.
    cd /etc/openvpn
     easyrsa build-server-full myserver nopass
     easyrsa build-server-full myserver nopass


Скопируем ключи сервера в папку keys. Здесь будут хранится ключи сервера и ссылка на crl.pem
Скопируем ключи сервера в папку <tt>keys</tt>. Здесь будут хранится ключи сервера и размещена ссылка на <tt>crl.pem</tt>
     cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/keys/ca.crt
     cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/keys/ca.crt
     cp /etc/openvpn/easy-rsa/pki/issued/myserver.crt /etc/openvpn/keys/myserver.crt
     cp /etc/openvpn/easy-rsa/pki/issued/myserver.crt /etc/openvpn/keys/myserver.crt
     cp /etc/openvpn/easy-rsa/pki/private/myserver.key /etc/openvpn/keys/myserver.key
     cp /etc/openvpn/easy-rsa/pki/private/myserver.key /etc/openvpn/keys/myserver.key


Поправим права доступа к папке keys, чтобы пользователь группы openvpn не могла войти в эту папку.
Поправим права доступа к папке <tt>keys</tt>, чтобы пользователь группы openvpn не мог войти в эту папку.
     сhown root:root
    cd /etc/openvpn
     сhown root:root /etc/openvpn/keys
     chmod 700 /etc/openvpn/keys
     chmod 700 /etc/openvpn/keys


=== Шаг 4 - настройка TLS криптографии сервера OpenVPN ===
=== Шаг 4 - усиление защиты OpenVPN ===
 
По состоянию на 14.05.2023, почти все (кроме пункта о tls-crypt-v2) указанные в этом разделе рекомендации реализованы в конфигурации сервера и клиента. Раздел №4 об усилении защищенности установлен здесь раньше, чтобы вы заранее могли подготовиться и осмыслить то, как будет выглядеть итоговая конфигурация ваших клиентов и сервера.


Сгенерируем TLS ключ и создадим CRL файл.
Рекомендации по усилению защиты:
    cd /etc/openvpn/easy-rsa/pki/
 
     openvpn --genkey secret ta.key
1) При конфигурировании сервера '''используй протокол UDP'''. Хотя OpenVPN позволяет использовать протокол TCP или UDP в качестве соединения с OpenVPN, протокол UDP обеспечит лучшую защиту от DoS-атак и сканирования портов, чем TCP.
 
2) При конфигурировании сервера '''настрой директиву user/group''' на использование группы openvpn/openvpn (как этого рекомендует Alt Linux). OpenVPN был очень тщательно разработан, чтобы разрешить удаление привилегий root после инициализации, и эта функция всегда должна использоваться в Linux/BSD/Solaris. Без привилегий root запущенный демон сервера OpenVPN представляет собой гораздо менее заманчивую цель для злоумышленника.
 
3) Используйте '''ключи шифрования большего размера'''.
 
4) Храните '''<tt>ca.key</tt>''' на отдельной '''изолированной''' машине.
 
5) Директива '''crl-verify''' заставляет сервер проверять сертификат клиента по списку отзыва сертификатов. Этот параметр не является обязательным. Если соответствующий CRL-файл отсутствует, OpenVPN зарегистрирует предупреждение в журналах вида и при этом соединение будет разрешено:
     <tt>VERIFY WARNING: depth=0, unable to get certificate CRL</tt>
 
CRL (certificate revocation list, список отзыва сертификатов) используется, когда конкретный ключ был скомпрометирован, в то время когда ваш PKI не пострадал.
 
Предположим, у вас есть PKI, состоящий из центра сертификации, корневого сертификата и нескольких клиентских сертификатов. Предположим, был украден компьютер, содержащий клиентский ключ и сертификат. Добавив украденный сертификат в CRL-файл, тем самым отозвав сертификат, вы могли бы отклонить любое соединение, которое пытается его использовать, сохранив при этом общую целостность PKI.
 
Единственный случай, когда потребовалось бы перестроить весь PKI с нуля, - это если бы сам ключ корневого сертификата <tt>ca.key</tt> был скомпрометирован.
 
CRL-файл считывается каждый раз при подключении клиента. Если вы сбрасываете привилегии root с помощью --user, а в этой статье мы именно так и делаем, убедитесь, что у этого пользователя достаточно привилегий для чтения файла.
 
Создадим CRL список отзыва сертификатов:
     cd /etc/openvpn/easy-rsa
     cd /etc/openvpn/easy-rsa
     ./easyrsa gen-crl
     ./easyrsa gen-crl


Сохрани crl.pem в папку server.
В результате выполнения команды сгенерируется файл <tt>crl.pem</tt> по пути <tt>/etc/openvpn/easy-rsa/pki/</tt>
Вы можете хранить файл <tt>crl.pem</tt> где угодно. Для того, чтобы этот файл начал исполнять свою роль необходимо чтобы пользователь user/group указанный в конфигурации сервера имел доступ на чтение к этому файлу. Скопируем <tt>crl.pem</tt> в папку server:
     cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
     cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
    cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/keys/ta.key
 
Создайте ссылку на <tt>crl.pem</tt> положи её в <tt>keys</tt>:
     ln -s /etc/openvpn/server/crl.pem /etc/openvpn/keys/
     ln -s /etc/openvpn/server/crl.pem /etc/openvpn/keys/


Настрой доступ к файлу crl.pem, чтобы клиенты могли проверять список отозванных сертификатов. Файл crl.pem должен быть доступен пользователю, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.
Настрой доступ к файлу <tt>crl.pem</tt>, чтобы клиенты могли проверять список отозванных сертификатов. Файл <tt>crl.pem</tt> должен быть доступен пользователю, который указан в параметрах user/group в конфигурации сервера (описан в шаге №6 настройки сервера). По умолчанию ALT Linux предлагает использовать пользователя openvpn:
     chown root:openvpn /etc/openvpn/server/crl.pem
     chown root:openvpn /etc/openvpn/server/crl.pem
     chmod 640 /etc/openvpn/server/crl.pem
     chmod 640 /etc/openvpn/server/crl.pem
6) Если клиенты не проверяют сертификат сервера, к которому они подключаются, создается потенциальная возможность реализации mitm атаки. Убедитесь, что ваши клиенты '''принудительно проверяют сертификат сервера'''. Создайте свои серверные сертификаты с помощью скрипта build-key-server (дополнительную информацию смотрите в документации easy-rsa). Это позволит определить сертификат как сертификат только для сервера, установив правильные атрибуты. Затем используйте следующую строку в конфигурацию вашего клиента:
    remote-cert-tls server
7) Протокол OpenVPN использует 2 канала связи во время сеанса VPN:
* канал управления (control channel), в котором происходит аутентификация, согласование ключей, согласование конфигураций;
* канал данных (data channel) в котором шифруются и происходит обмен данными.
Директива '''tls-auth''' (устарел) добавляет дополнительную подпись HMAC ко всем пакетам подтверждения связи SSL/TLS для проверки целостности в канале управления. Любой UDP-пакет, не имеющий правильной подписи HMAC, может быть удален без дальнейшей обработки. Подпись HMAC tls-auth обеспечивает дополнительный уровень безопасности, превышающий тот, который обеспечивается SSL/TLS. Директива <tt>tls-auth</tt> включает подписывание общим групповым ключом и проверку пакетов в канале управления (control channel). Он может защитить от следующих атак произведенных неавторизованными пользователями:
* DoS-атаки или затопление UDP-порта OpenVPN.
* Сканирование портов, чтобы определить, какие UDP-порты сервера находятся в состоянии прослушивания.
* Уязвимости переполнения буфера в реализации SSL/TLS.
* Инициирование рукопожатия SSL/TLS с неавторизованных компьютеров (хотя такие рукопожатия в конечном итоге не смогут аутентифицировать, tls-auth может отключить их на гораздо более раннем этапе).
Использование tls-auth требует, чтобы вы сгенерировали общий секретный ключ <tt>ta.key</tt>, который используется в дополнение к стандартному сертификату/ключу ECDSA/RSA. Один и тот же ключ должен быть и у клиентов, и у сервера.
Сгенерируем общий секретный ключ <tt>ta.key</tt>:
    cd /etc/openvpn/easy-rsa/pki/
    openvpn --genkey secret ta.key
Скопируй <tt>ta.key</tt> в папку <tt>keys</tt>:
    cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/keys/ta.key
8) Директива '''<tt>tls-crypt</tt>''' (используется в конфигурации, для настройки смотри директиву <tt>tls-auth</tt>) - это развитие идеи <tt>tls-auth</tt>, в котором общий групповой ключ используется не только для аутентификации пакетов, но и для шифрования данных управляющего канала (control channel). TLS-crypt улучшает аутентификацию TLS, добавляя симметричное шифрование к каналу управления. В отличие от <tt>tls-auth</tt>, <tt>tls-crypt</tt> не требует от пользователя установки <tt>key-direction</tt>. Она настраивается аналогичным образом как tls-auth. Защищает от атак неавторизованными пользователями:
* Скрывает TLS сертификат.
* Затрудняет обнаружение трафика openvpn для стороннего наблюдателя.
* Простой вариант защиты от квантовых атак на TLS криптоалгоритмы.
9) Директива '''<tt>tls-crypt-v2</tt>''' (не задействована в конфигурации) - это развитие <tt>tls-crypt</tt>. Главным отличием от <tt>tls-crypt</tt> является то, что <tt>tls-crypt-v2</tt> использует уникальный ключ для каждого клиента в отдельности, а не общий групповой ключ <tt>ta.key</tt>.
10) VPN-туннели, в которых используется сжатие, восприимчивы к вектору атаки VORALCE. В конфигурации сервера '''отключите''' директиву отвечающую за '''сжатие данных''' (доп. см. оф. документацию к openvpn):
  comp-lzo no


=== Шаг 5 - генерация сертификатов и ключей клиентов ===
=== Шаг 5 - генерация сертификатов и ключей клиентов ===
Строка 190: Строка 285:
     chmod -R 700 client-configs
     chmod -R 700 client-configs


Рассмотрим несколько вариантов создания клиентской конфигурации.  
Рассмотрим несколько вариантов создания клиентской конфигурации:
* Вариант "А" - с подписыванием через внешний CA. Далее вы можете скомбинировать это решение с вариантом "Б" и "В".
* Вариант "Б" - используем самоподписаные сертификаты (для клиентов Linux)
* Вариант "В" - файлы конфигурации OVPN (для клиентов Windows и Linux)
 
В данной статье дальнейшие действия развиваются по варианту "В".


==== Вариант "А" - с подписыванием через внешний CA ====
==== Вариант "А" - с подписыванием через внешний CA ====
'''ВНИМАНИЕ! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br>
{{Attention| Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.}}<br>
Создадим запрос на сертификат для клиента user1.
Создадим запрос на сертификат для клиента user1.
    cd /etc/openvpn/easy-rsa
     ./easyrsa gen-req user1
     ./easyrsa gen-req user1


Строка 203: Строка 304:
Подпишем запрос клиента на сервере CA.
Подпишем запрос клиента на сервере CA.
     user@your-ca-server-ip:$
     user@your-ca-server-ip:$
     cd easy-rsa/
     cd /etc/openvpn/easy-rsa/
     ./easy-rsa import-req /tmp/user1.req user1
     ./easy-rsa import-req /tmp/user1.req user1
     ./easyrsa sign-req client user1
     ./easyrsa sign-req client user1
Строка 210: Строка 311:
     scp pki/issued/user1.crt user@your-vpn-server-ip:/tmp
     scp pki/issued/user1.crt user@your-vpn-server-ip:/tmp


Скопируй сертификат клиента в папку keys клиентских конфигураций. Папка keys должна быть доступен пользователю на чтение, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.
Скопируй сертификат клиента в папку keys клиентских конфигураций.  
     user@your-vpn-server-ip:$
     user@your-vpn-server-ip:$
     cp /tmp/user1.crt /etc/openvpn/client-configs/keys/
     cp /tmp/user1.crt /etc/openvpn/client-configs/keys/
Строка 218: Строка 319:


==== Вариант "Б" - самоподписаные сертификаты ====
==== Вариант "Б" - самоподписаные сертификаты ====
'''ВНИМАНИЕ! Для применения варианта "Б" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br>
{{Attention| Для применения варианта "Б" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.}}<br>
Создадим самоподписанный сертификат клиента user1. Скопируй сертификат клиента в папку keys клиентских конфигураций. Папка keys должна быть доступен пользователю на чтение, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.
Создадим самоподписанный сертификат клиента user1. Скопируй сертификат клиента в папку keys клиентских конфигураций.
    cd /etc/openvpn/easy-rsa
     ./easyrsa build-client-full user1
     ./easyrsa build-client-full user1
     cp /etc/openvpn/easy-rsa/pki/issued/user1.crt /etc/openvpn/client-config/keys/
     cp /etc/openvpn/easy-rsa/pki/issued/user1.crt /etc/openvpn/client-configs/keys/
     cp /etc/openvpn/easy-rsa/pki/private/user1.key /etc/openvpn/clients-config/keys/
     cp /etc/openvpn/easy-rsa/pki/private/user1.key /etc/openvpn/clients-configs/keys/


==== Вариант "В" - файлы конфигурации OVPN ====
==== Вариант "В" - файлы конфигурации OVPN ====
Строка 234: Строка 336:


=== Шаг 6 - настройка сервера OpenVPN ===
=== Шаг 6 - настройка сервера OpenVPN ===
Теперь пора настроить сервис OpenVPN. При этом используются созданные ранее учетные данные и файлы.  В данном разделе мы покажем, как настроить OpenVPN по образцу, который включен в документацию проекта. Для начала нужно скопировать образец файла server.conf OpenVPN в каталог конфигурации, чтобы его можно было использовать в качестве основы для новых конфигураций. Openvpn может обслуживать несколько VPN серверов одновременно, поэтому различайте названия конфигурационных файлов для каждого сервера.
Пришло время настроить сервис OpenVPN. При этом используются созданные ранее учетные данные и файлы.  В данном разделе будет показано, как настроить OpenVPN по образцу, который включен в документацию проекта. Для начала нужно скопировать образец файла server.conf OpenVPN в каталог конфигурации, чтобы его можно было использовать в качестве основы для новых конфигураций. Openvpn может обслуживать несколько VPN серверов одновременно, поэтому различайте названия конфигурационных файлов для каждого сервера.
Скопируй шаблон конфигурации сервера и назовите файл server.conf согласно названию вашего сертификата myserver.crt созданный на шаге 5.
Скопируй шаблон конфигурации сервера и назовите файл server.conf согласно названию вашего сертификата myserver.crt созданный на шаге 5.
     cp /usr/share/doc/openvpn-2.5.6/server.conf /etc/openvpn/server/myserver.conf
     cp /usr/share/doc/openvpn-2.5.6/server.conf /etc/openvpn/server/myserver.conf
В конфигурации сервера используется параметр ccd. Параметр ccd влияет на работу OpenVPN следующим образом:
# подключается пользователь user123
# openvpn начинает искать персональный файл <tt>/etc/openvpn/ccd/user123</tt>
# после прочтения конфига ccd, пользователь получает указанный ip и маршрут к заданной в ccd сети
# содержание <tt>/etc/openvpn/ccd/user123</tt> может быть таким:
    ifconfig-push 172.16.90.14 255.255.255.0
    push "route 172.16.0.32 255.255.255.224"
Создайте папку для хранения файлов журналов:
    mkdir -p /var/log/openvpn
    chmod 700 /var/log/openvpn


ВНИМАНИЕ! В конце файла есть дополнительные необязательные настройки, которые могут быть несовместимы с основным текстом конфигурации. Отредактируй файл myserver.conf:
ВНИМАНИЕ! В конце файла есть дополнительные необязательные настройки, которые могут быть несовместимы с основным текстом конфигурации. Отредактируй файл myserver.conf:
     # topology subnet (топология подсети) - это рекомендуемая топология на сегодняшний день; она не используется
     # topology subnet (топология подсеть) - это рекомендуемая топология на сегодняшний день;
    # по умолчанию в OpenVPN 2.3 по причинам обратной совместимости с конфигурациями эпохи 2.0.9.  
    # она не используется по умолчанию в OpenVPN 2.3  
    # по причинам обратной совместимости с конфигурациями эпохи 2.0.9.  
     # Рекомендуется использовать топологию подсети и это безопасно, когда не существует старых/устаревших
     # Рекомендуется использовать топологию подсети и это безопасно, когда не существует старых/устаревших
     # клиентов, работающих под управлением OpenVPN 2.0.9 под управлением Windows.
     # клиентов, работающих под управлением OpenVPN 2.0.9 под управлением Windows.
     # Рекомендуется включать topology subnet в конфигурацию
     # Рекомендуется включать topology subnet в конфигурацию
     topology subnet
     topology subnet
   
     # Порт который слушает сервер. Не забудьте проверить фаервол
     # Порт который слушает сервер. Не забудьте проверить фаервол
     port 1194
     port 1194
   
     # Протокол взаимодействия клиента и сервера (рекомендуется udp)
     # Протокол взаимодействия клиента и сервера (рекомендуется udp)
     proto udp
     proto udp
   
     # Если вы переключили протокол на TCP, вам нужно будет изменить значение директивы  
     # Если вы переключили протокол на TCP, вам нужно будет изменить значение директивы  
     # explicit-exit-notify с 1 на 0, так как эта директива поддерживается только UDP.  
     # explicit-exit-notify с 1 на 0, так как эта директива поддерживается только UDP.  
     # В противном случае TCP вызовет ошибки при запуске службы OpenVPN.
     # В противном случае TCP вызовет ошибки при запуске службы OpenVPN.
     explicit-exit-notify 1
     explicit-exit-notify 1
   
     # Тип устройства для взаимосвязи  
     # Тип устройства для взаимосвязи  
     # выбери tun (tunnel) для создания туннеля VPN уровня 3 (маршрутизируемый).
     # выбери tun (tunnel) для создания туннеля VPN уровня 3 (маршрутизируемый).
Строка 259: Строка 378:
     # на обоих концах vpn, и они смогут "разговаривать" друг с другом напрямую  
     # на обоих концах vpn, и они смогут "разговаривать" друг с другом напрямую  
     # без каких-либо изменений в их таблицах маршрутизации.
     # без каких-либо изменений в их таблицах маршрутизации.
     # Мы рекомендуем использовать dev tun, и далее продолжим для tun.
     # Режим маршрутизации также предоставляет более широкие возможности для выборочного контроля прав доступа в
    # зависимости от конкретного клиента.
    # Рекомендую использовать режим dev tun, если вам не нужна конкретная функция,
    # требующая подключения, например:
    # VPN должна быть способна обрабатывать протоколы, отличные от IP, такие как IPX,
    # вы запускаете приложения через VPN, которые полагаются на сетевые
    # трансляции (например, игры по локальной сети),
    # или вы хотели бы разрешить просмотр общих файловых ресурсов
    # Windows через VPN без настройки сервера Samba или WINS.
    # Далее продолжим для dev tun.
     dev tun
     dev tun
   
     # Не рекомендуется использовать сжатие. В прошлом это уже приводило  
     # Не рекомендуется использовать сжатие. В прошлом это уже приводило  
     # к компрометации ключей из-за повреждений при распаковке.  
     # к компрометации ключей из-за повреждений при распаковке.  
     # Закомментируй comp-lzo как на сервере так и на клиенте (см. оф. документацию к openvpn).
     # Отключите comp-lzo как на сервере так и на клиенте (см. оф. документацию к openvpn).
     # comp-lzo
     comp-lzo no
   
     # Укажи местоположение корневого сертификата центра сертификации
     # Укажи местоположение корневого сертификата центра сертификации
     ca  /etc/openvpn/keys/ca.crt
     ca  /etc/openvpn/keys/ca.crt
   
     # Если ранее вы указали другое имя в команде ./easyrsa gen-req server,  
     # Если ранее вы указали другое имя в команде ./easyrsa gen-req server,  
     # измените строки cert и key, чтобы указать соответствующие файлы .crt и .key.  
     # измените строки cert и key, чтобы указать соответствующие файлы .crt и .key.  
Строка 272: Строка 403:
     cert /etc/openvpn/keys/myserver.crt
     cert /etc/openvpn/keys/myserver.crt
     key  /etc/openvpn/keys/myserver.key  # Этот файл должен храниться в секрете!
     key  /etc/openvpn/keys/myserver.key  # Этот файл должен храниться в секрете!
     # Директива dh, которая определяет параметры Диффи-Хеллмана.
      
     # Поскольку ранее мы настроили поддержку Elliptic Curve Cryptography,  
     # Поскольку ранее было заявлено об использовании Elliptic Curve Cryptography (ECC),  
     # нам не нужен сид файл Диффи-Хеллмана. Закомментируйте существующую строку  
     # нам не нужен сид файл Диффи-Хеллмана. Закомментируйте существующую строку  
     # (типа dh dh2048.pem или dh dh.pem), а под ней вставьте строку dh none:
     # типа dh dh2048.pem или dh dh.pem, а под ней вставьте строку dh none,
     # Не использовать ключ Диффи-Хеллмана, вместо этого задействуем ta.key
    # тогда OpenVPN 2.4.0 и новее автоматически инициализирует параметры ecdh
    # из сертификата сервера (создан с помощью алгоритма 'ec').
    # Директива dh включает обмен ключами по алгоритму DH и проверку цифровой подписи RSA.
     # Отключив dh, тем самым включаем обмен ключами по ECDH и проверку цифровой подписи по ECDSA:
     dh none
     dh none
   
     # Определи подсеть в которую будут попадать клиенты (подсеть будет создана автоматически)
     # Определи подсеть в которую будут попадать клиенты (подсеть будет создана автоматически)
     # Сервер VPn будет раздавать клиентам адреса из этого пула
     # сервер vpn будет раздавать клиентам адреса из этого пула
     server 172.16.90.0 255.255.255.0
     server 172.16.90.0 255.255.255.0
   
     # Включаем ccd вместо глобального push route. В данном случае маршрут клиенту задается персонально.
     # Включаем ccd вместо глобального push route. В данном случае маршрут клиенту задается персонально.
     # В данном случае push "route *.*.*.* *.*.*.*" директивы нужно закомментировать!
     # В данном случае push "route *.*.*.* *.*.*.*" директивы нужно закомментировать!
     # Укажи использование персональных конфигураций (рекомендую всегда так делать)
     # Укажи использование персональных конфигураций (рекомендую всегда так делать)
     ccd-exclusive
     ccd-exclusive
   
     # Укажи место где располагаются файлы с персональными конфигурациями
     # Укажи место где располагаются файлы с персональными конфигурациями
     client-config-dir /etc/openvpn/ccd
     client-config-dir /etc/openvpn/ccd
     # ccd работает так: подключается пользователь user123
      
    # openvpn понимает, что ему предписано использовать ccd,
    # openvpn начинает искать персональный файл /etc/openvpn/ccd/user123
    # содержание /etc/openvpn/ccd/user123 может быть таким
    # ifconfig-push 172.16.90.14 255.255.255.0
    # push "route 172.16.0.32 255.255.255.224"
    # после прочтения конфига ccd, пользователь получает новый ip и маршрут к заданной в ccd сети
     # Маршрутизировать весь трафик пользователей через Openvpn сервер
     # Маршрутизировать весь трафик пользователей через Openvpn сервер
     push "redirect-gateway def1 bypass-dhcp"
     push "redirect-gateway def1 bypass-dhcp"
   
     # Посылать пинг пакет клиенту каждые 10 секунд. Если он не ответит за 120 секунд, туннель перезапустится.
     # Посылать пинг пакет клиенту каждые 10 секунд. Если он не ответит за 120 секунд, туннель перезапустится.
     keepalive 10 120
     keepalive 10 120
     # Директива tls-auth добавляет дополнительную подпись HMAC ко всем пакетам рукопожатия SSL/TLS  
   
     # Директива tls-auth (устарел) добавляет дополнительную подпись HMAC ко всем пакетам рукопожатия SSL/TLS  
     # для проверки целостности. Любой UDP-пакет, не имеющий правильной подписи HMAC,  
     # для проверки целостности. Любой UDP-пакет, не имеющий правильной подписи HMAC,  
     # может быть отброшен без дальнейшей обработки. Подпись в tls-auth HMAC обеспечивает дополнительный
     # может быть отброшен без дальнейшей обработки. Подпись в tls-auth HMAC обеспечивает дополнительный
     # уровень безопасности.
     # уровень безопасности
     tls-auth /etc/openvpn/keys/ta.key 0 # Это секретный файл
    # Дополнительная защита для DoS атак и флудинга портов UDP
    # tls-auth /etc/openvpn/keys/ta.key 0 # Это общий секретный ключ
    # Директива tls-crypt является усилением tls-auth и включает в себя те же процедуры
    # описанные при tls-auth и дополнительно включает шифрование данных в канале управления.  
     # Используем общий групповой ключ как для tls-auth:
    tls-crypt /etc/openvpn/keys/ta.key 0 # Это общий секретный ключ
   
     # OpenVPN автоматически поддерживает любой шифр, который поддерживается библиотекой OpenSSL,  
     # OpenVPN автоматически поддерживает любой шифр, который поддерживается библиотекой OpenSSL,  
     # и поэтому может поддерживать шифры, использующие большие размеры ключей.
     # и поэтому может поддерживать шифры, использующие большие размеры ключей.
Строка 308: Строка 447:
     # но AES-256-GCM надежнее, производительнее и хорошо поддерживается.
     # но AES-256-GCM надежнее, производительнее и хорошо поддерживается.
     cipher AES-256-GCM
     cipher AES-256-GCM
   
     # Выберите алгоритм аутентификации, алгоритм обработки сообщений HMAC.
     # Выберите алгоритм аутентификации, алгоритм обработки сообщений HMAC.
     auth SHA256
     auth SHA256
     # Чтобы OpenVPN запускался без привилегий, найдите настройки user и group и удалите “;” в начале этих строк:
   
     # Чтобы OpenVPN запускался без привилегий,  
    # найдите настройки user и group и удалите “;” в начале этих строк:
     # Alt linux рекомендует устанавливать пользователя и группу openvpn  
     # Alt linux рекомендует устанавливать пользователя и группу openvpn  
     user openvpn
     user openvpn
     group openvpn
     group openvpn
   
     # Указывает серверу не перечитывать ключи клиента при каждом перезапуске туннеля
     # Указывает серверу не перечитывать ключи клиента при каждом перезапуске туннеля
     persist-key
     persist-key
   
     # Указывает серверу не открывать устройство tun при каждом перезапуске туннеля
     # Указывает серверу не открывать устройство tun при каждом перезапуске туннеля
     persist-tun
     persist-tun
     # Записывать в журнал состояние сервера в том же месте, откуда произведен запуск сервера
   
     # Укажите место хранения файлов журналов
     # Записывать в журнал состояние сервер
     status openvpn-status.log
     # Укажите путь к файлу
     # Режим дозаписи основного журнала сервера
     status /var/log/openvpn/openvpn-status.log
     # Укажите место хранения файлов журналов
   
     log-append  openvpn.log
     # Режим до записи основного журнала сервера
     # Укажите путь к файлу
     log-append  /var/log/openvpn/openvpn.log
   
     # Включить проверку списка отзывов с указанием его местоположения
     # Включить проверку списка отзывов с указанием его местоположения
     crl-verify /etc/openvpn/server/crl.pem
     crl-verify /etc/openvpn/server/crl.pem
   
     # Подробность журналов
     # Подробность журналов
     verb 3
     verb 3
      
      
     # ДАЛЕЕ ОПЦИОНАЛЬНЫЕ НАСТРОЙКИ, КОТОРЫЕ МОГУТ НЕ СОЧЕТАТЬСЯ С ВЫШЕ ПРЕДСТАВЛЕННОЙ КОНФИГУРАЦИЕЙ:
     # ДАЛЕЕ ОПЦИОНАЛЬНЫЕ НАСТРОЙКИ, КОТОРЫЕ МОГУТ НЕ СОЧЕТАТЬСЯ С ВЫШЕ ПРЕДСТАВЛЕННОЙ КОНФИГУРАЦИЕЙ:
     # Чтобы трафик выходил из заданной подсети в директиве server
      
    push "redirect private"
     # Ниже найдите раздел dhcp-option. Удалите “;” в начале строк, чтобы раскомментировать их:
     # Ниже найдите раздел dhcp-option. Удалите “;” в начале строк, чтобы раскомментировать их:
     # Эти строки позволят клиентам использовать OpenDNS резолверы по перечисленным IP-адресам.
     # эти строки позволят клиентам использовать OpenDNS резолверы по перечисленным IP-адресам  
     # Если вы предпочитаете другие резолверы, укажите их здесь.
     # Если вы предпочитаете другие резолверы, укажите их здесь
     # Это должно помочь клиентам переконфигурировать DNS для использования туннеля VPN в качестве
     # Это должно помочь клиентам переконфигурировать DNS для использования туннеля VPN в качестве
     # шлюза по умолчанию.
     # шлюза по умолчанию
     push "dhcp-option DNS 208.67.222.222"
     push "dhcp-option DNS 208.67.222.222"
     push "dhcp-option DNS 208.67.220.220"
     push "dhcp-option DNS 208.67.220.220"
     # Не рекомендую использовать местный DNS, windows пользователи не стабильно работают с DNS через openvpn.
   
     # Если вы все же хотите использовать DNS в локальной сети, то настройте DNS сервер на этой машине,
     # Не рекомендую использовать местный DNS, windows пользователи не стабильно работают с DNS через openvpn
     # Если вы все же хотите использовать DNS в локальной сети, то настройте DNS сервер на этой машине
     # например, используя встроенный dnsmasq и обслуживайте VPN клиентов этим DNS сервером.
     # например, используя встроенный dnsmasq и обслуживайте VPN клиентов этим DNS сервером.
     push "dhcp-option DNS 10.10.10.10"
     push "dhcp-option DNS 10.10.10.10"
     push "dhcp-option DOMAIN test.ru"
     push "dhcp-option DOMAIN test.ru"
     # объявление маршрутов для клиента VPN
   
     # Глобальное объявление маршрутов для клиента VPN
     push "route 172.16.0.0 255.255.0.0"
     push "route 172.16.0.0 255.255.0.0"


Если нужны несколько экземпляров сервера openvpn, указывайте разные файлы в параметрах <tt>status</tt>, <tt>log-append</tt>, <tt>ifconfig-pool-persist</tt> и <tt>client-config-dir</tt>, например, с именем экземпляра в префиксе.


Если нужны несколько экземпляров сервера openvpn, указывайте разные файлы в параметрах <tt>status</tt>, <log-append>, <tt>ifconfig-pool-persist</tt> и <tt>client-config-dir</tt>, например, с именем экземпляра в префиксе.
Если вы собирайтесь использовать конфигурацию сервера без CCD, используйте в конфигурации сервера ifconfig-pool-persist:
 
    ifconfig-pool-persist /var/log/openvpn/ipp.txt
Если вы собирайтесь использовать конфигурацию сервера без CCD, используйте в конфигурации сервера ifconfig-pool-persist
<tt>ifconfig-pool-persist /var/log/openvpn/ipp.txt</tt>


В файле ipp.txt сервер OpenVPN запишет ip адрес который был назначен клиенту.  
В файле ipp.txt сервер OpenVPN запишет ip адрес который был назначен клиенту.  
Строка 358: Строка 506:
=== Шаг 7 - конфигурация сети сервера OpenVPN ===
=== Шаг 7 - конфигурация сети сервера OpenVPN ===


Разрешаем forwarding трафика через сервер для NetworkManager на базе (etcnet) включается в файле <tt>/etc/net/sysctl.conf</tt>.  
Разрешаем сквозной трафик через сервер. Для NetworkManager на базе (etcnet) включается в файле <tt>/etc/net/sysctl.conf</tt>.  
Установи значение "1" для параметра ip_forward в файле <tt>etc/net/sysctl.conf</tt>:
Установи значение "1" для параметра ip_forward в файле <tt>/etc/net/sysctl.conf</tt>:
     net.ipv4.ip_forward = 1
     net.ipv4.ip_forward = 1


Строка 366: Строка 514:
=== Шаг 8 - настройки фаервола на ALT Linux ===
=== Шаг 8 - настройки фаервола на ALT Linux ===


Следующим шагом нужно настроить фаервол и это нужно делать каждый раз, когда вы создаете новую клиентскую конфигурацию. UFW можно взять с официального сайта разработчика. Выполнить сборку rpm из исходников и установить.
Следующим шагом нужно настроить фаервол. Вносить изменения в фаервол нужно делать каждый раз, когда вы создаете новую клиентскую конфигурацию. Инструкцию по установке и работе смотрите на странице посвященной [[UFW|UFW]] (собран в Sisyphus с 04.05.2023).  


     ufw limit log proto tcp from 172.16.1.2 to 172.16.2.2 port 22 comment admin-ssh
Пример. Как разрешить подключение ssh и openvpn в ufw, где адрес сервера локальной сети 172.16.2.2:
     ufw allow log proto tcp from 172.16.1.2 to 172.16.2.2 port 22 comment admin-ssh
     ufw allow log proto udp from any to 172.16.2.2 port 1194 comment openvpn
     ufw allow log proto udp from any to 172.16.2.2 port 1194 comment openvpn


Разрешение на FORWARD для client1:
Пример. Как разрешить сквозной трафик от клиента client1 с адресом 172.16.90.2 к сети 172.16.3.0/24 по порту 80 и 443:
     ufw route allow proto tcp from 172.16.90.2 to 172.16.3.0/24 port 80,443 comment client1
     ufw route allow proto tcp from 172.16.90.2 to 172.16.3.0/24 port 80,443 comment client1


Аналогичная настройка для встроенного стандартного iptables:
Пример. Аналогичная настройка для встроенного стандартного iptables:
     *filter
     *filter
     :OUTPUT ACCEPT
     :OUTPUT ACCEPT
Строка 407: Строка 556:


=== Шаг 9 - запуск службы ===
=== Шаг 9 - запуск службы ===
Для запуска сервера используйте скрипт <tt>/etc/openvpn/openvpn-startup</tt>. Впишите в него указание для openvpn запускать сервер с конфигурации myserver.conf в фоном:
Для запуска сервера используйте скрипт <tt>/etc/openvpn/openvpn-startup</tt>. Впишите в него указание для openvpn запускать сервер с конфигурации myserver.conf в фоне:
     openvpn /etc/openvpn/myserver.conf &
     openvpn /etc/openvpn/server/myserver.conf &


В результате файл должен иметь вид:
В результате файл должен иметь вид:
     #!/bin/bash
     #!/bin/bash
     # Startup file for OpenVPN
     # Startup file for OpenVPN
     openvpn /etc/openvpn/myserver.conf &
     openvpn /etc/openvpn/server/myserver.conf &
     # Load tun module
     # Load tun module
     /sbin/modprobe tun >/dev/null 2>&1
     /sbin/modprobe tun >/dev/null 2>&1
     sleep 1s
     sleep 1s


Добавьте службу в автозапуск
Добавьте службу в автозапуск:
     systemctl enable openvpn
     systemctl enable openvpn


Запустите сервер
Запустите сервер:
     service openvpn start
     service openvpn start


Проверьте записи в файлах журналов на наличие ошибок, исправьте ошибки и предупреждения. Как только исправите все ошибки запуска, если таковы имеются, затем продолжайте настройку дальше.
Чтобы убедиться, что сервер запущен выполните команду:
    systemctl status openvpn
 
Проверить записи в файлах журналов на наличие ошибок. Исправьте все ошибки, если таковы имеются, затем продолжайте настройку дальше:
    journalctl -u openvpn


=== Шаг 10 - создание инфраструктуры для клиентской конфигурации ===
=== Шаг 10 - создание инфраструктуры для клиентской конфигурации ===
На шаге 5 мы создали папку <tt>client-configs/keys</tt> теперь создадим в ней папку files. Эта папка предназначена для хранения <tt>*.ovpn</tt> файлов конфигурации.
На шаге 5 была создана папка <tt>client-configs/keys</tt> теперь создадим в ней папку files. Эта папка предназначена для хранения <tt>*.ovpn</tt> файлов конфигурации.
     mkdir -p /etc/openvpn/client-configs/files/
     mkdir -p /etc/openvpn/client-configs/files/


Скопируем шаблон клиентской конфигурации
Скопируем шаблон клиентской конфигурации.
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-config/client.conf
    cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-configs/client.conf


Отредактируем файл клиентской конфигурации <tt>/etc/openvpn/client-config/client.conf</tt>
Отредактируем файл клиентской конфигурации <tt>/etc/openvpn/client-configs/client.conf</tt>:
     # Означает, что это конфигурация для клиента
     # Означает, что это конфигурация для клиента
     client
     client
   
     # Установите здесь такое же значение как у сервера
     # Установите здесь такое же значение как у сервера
     dev tun
     dev tun
   
     # Убедитесь, что взаимодействия с сервером совпадает в конфигурациях
     # Убедитесь, что взаимодействия с сервером совпадает в конфигурациях
     proto udp
     proto udp
   
    # Принудительно отключить сжатие
    comp-lzo no
   
     # Укажите внешний IP адрес в глобальной сети и (рекомендую) укажите нестандартный порт
     # Укажите внешний IP адрес в глобальной сети и (рекомендую) укажите нестандартный порт
     # Убедитесь, что трафик с данного порта будет перенаправлен (операция NAT) на ip адрес сервера и порт,
     # убедитесь, что трафик с данного порта будет перенаправлен (операция NAT) на ip адрес сервера и порт,
     # указанный в конфигурации сервера
     # указанный в конфигурации сервера
     remote 199.199.199.199 23111
     remote 199.199.199.199 23111
   
     # Продолжайте бесконечно пытаться разрешить имя хоста сервера OpenVPN. Очень полезно на компьютерах,
     # Продолжайте бесконечно пытаться разрешить имя хоста сервера OpenVPN. Очень полезно на компьютерах,
     # которые не подключены постоянно к Интернету, таких как ноутбуки.
     # которые не подключены постоянно к Интернету, таких как ноутбуки.
     resolv-retry infinite
     resolv-retry infinite
   
     # Большинство клиентов не нуждаются в привязке к номеру исходящего порта
     # Большинство клиентов не нуждаются в привязке к номеру исходящего порта
     nobind
     nobind
   
     # Понизить привилегии после аутентификации клиента на сервере
     # Понизить привилегии после аутентификации клиента на сервере
     # Затем раскомментируйте директивы user и group, удалив “;”:
     # затем раскомментируйте директивы user и group, удалив “;”:
     user openvpn
     user openvpn
     group openvpn
     group openvpn
   
     # Найдите директивы CA, CERT и KEY. ЗАКОММЕНТИРУЙТЕ их, т.к. сертификаты и ключи нужно добавить внутри  
     # Найдите директивы CA, CERT и KEY. ЗАКОММЕНТИРУЙТЕ их, т.к. сертификаты и ключи нужно добавить внутри  
     # самого файла.
     # самого файла.
Строка 458: Строка 621:
     ;cert client.crt
     ;cert client.crt
     ;key client.key
     ;key client.key
     # Также ЗАКОММЕНТИРУЙТЕ директиву tls-auth. Мы будем добавлять ta.key прямо в конфигурационный файл клиента.
   
     # Также ЗАКОММЕНТИРУЙТЕ директиву tls-auth. Файл ta.key будет добавляться прямо в конфигурационный файл клиента.
     ;tls-auth ta.key 1
     ;tls-auth ta.key 1
   
     # Укажите аналогично строки ниже как на сервере
     # Укажите аналогично строки ниже как на сервере
     persist-key
     persist-key
     persist-tun
     persist-tun
   
     # Дает указание клиенту OpenVPN разрешать подключения только к VPN-серверу, у которого есть сертификат  
     # Дает указание клиенту OpenVPN разрешать подключения только к VPN-серверу, у которого есть сертификат  
     # с атрибутом EKU X.509
     # с атрибутом EKU X.509
     remote-cert-tls server
     remote-cert-tls server
     # Добавьте в конфигурацию key-direction в "1", это означает что мы будем использовать файлы конфигураций ovpn.
   
     # Добавьте в конфигурацию key-direction в "1", это означает что будут использоваться файлы конфигурации ovpn.
     key-direction 1
     key-direction 1
   
     # Параметры cipher и auth должны быть в согласованном значении /etc/openvpn/server.conf.
     # Параметры cipher и auth должны быть в согласованном значении /etc/openvpn/server.conf.
     cipher AES-256-GCM
     cipher AES-256-GCM
     auth SHA256
     auth SHA256
   
     # Уровень подробности ведения журналов
     # Уровень подробности ведения журналов
     verb 3
     verb 3


=== Шаг 11 - создание клиентских конфигураций ===
=== Шаг 11 - создание клиентских конфигураций ===
Небольшое отступление по поводу срока действия сертификата. Дело в том, что мы используем общий vars файл для создания сертификата сервера, в котором мы указали срок действия 1800 дней. Когда придёт время обновить сертификат сервера, не забудьте про этот нюанс. Возможно следует разделить vars файлы на серверный и клиентский. Для ограничения действия выпущенного сертификата пользователя отредактируй:
Небольшое отступление по поводу срока действия сертификата. Дело в том, что ранее был создан общий vars файл для создания сертификата сервера, в котором был указан срок действия 1800 дней. Когда придёт время обновить сертификат сервера, не забудьте про этот нюанс. Возможно вам следует разделить vars файлы на серверный и клиентский.
    Если нужно изменить срок действия сертификата отредактируй параметр в <tt>/etc/openvpn/easy-rsa/vars</tt>:
Если нужно изменить срок действия сертификата отредактируй параметр в <tt>/etc/openvpn/easy-rsa/vars</tt>:
     set_var EASYRSA_CERT_EXPIRE    365
     set_var EASYRSA_CERT_EXPIRE    365


Создадим файл make-config.sh для полуавтоматического создания пользовательской конфигурации <tt>*.ovpn</tt>. Данный скрипт сформирует пользовательский конфиг файл, который присоединит все ключи в <tt>*.ovpn</tt> файл (см. исходник).
Создадим файл make-config.sh для полуавтоматического создания пользовательской конфигурации <tt>*.ovpn</tt>. Данный скрипт сформирует пользовательский конфигурационный файл, который присоединит сертификат центра сертификации, сертификат пользователя, ключ пользователя и <tt>ta.key</tt> в <tt>*.ovpn</tt> файл (см. исходник).
     touch /etc/openvpn/client-configs/make-config.sh
     touch /etc/openvpn/client-configs/make-config.sh
     chown root:root make-config
    cd /etc/openvpn/client-configs
     chown root:root make-config.sh
     chmod 700 make-config.sh
     chmod 700 make-config.sh


Строка 489: Строка 659:
     # 1) клиенту потребуется ввести пароль для аутентификации на сервере (рекомендуется): ./make-config.sh client1
     # 1) клиенту потребуется ввести пароль для аутентификации на сервере (рекомендуется): ./make-config.sh client1
     # 2) не потребуется вводить пароль: ./make-config.sh client1 nopass
     # 2) не потребуется вводить пароль: ./make-config.sh client1 nopass
    # First argument: Client identifier
     KEY_DIR=/etc/openvpn/client-configs/keys
     KEY_DIR=/etc/openvpn/client-configs/keys
     OUTPUT_DIR=/etc/openvpn/client-configs/files
     OUTPUT_DIR=/etc/openvpn/client-configs/files
Строка 495: Строка 664:
     CLIENT_DIR=/etc/openvpn/easy-rsa/
     CLIENT_DIR=/etc/openvpn/easy-rsa/
     CA_DIR=/etc/openvpn/easy-rsa
     CA_DIR=/etc/openvpn/easy-rsa
 
   
     cd ${CA_DIR}
     cd ${CA_DIR}
     echo "Creating a self-signed certificate $1..."
     echo "Creating a self-signed certificate $1..."
Строка 514: Строка 683:
         <(echo -e '</cert>\n\n<key>') \
         <(echo -e '</cert>\n\n<key>') \
         ${KEY_DIR}/${1}.key \
         ${KEY_DIR}/${1}.key \
         <(echo -e '</key>\n\n<tls-auth>') \
         <(echo -e '</key>\n\n<tls-crypt>') \
         ${KEY_DIR}/ta.key \
         ${KEY_DIR}/ta.key \
         <(echo -e '</tls-auth>') \
         <(echo -e '</tls-crypt>') \
         | egrep -v "^\s*(#|$|;)" \
         | egrep -v "^\s*(#|$|;)" \
         > ${OUTPUT_DIR}/${1}.ovpn
         > ${OUTPUT_DIR}/${1}.ovpn


Опционально. Создадим скрипт, который правильно удалит испорченные по той или иной причине файлы конфигурации с операцией отзыва сертификата.
Опционально. Создадим скрипт <tt>revoke.sh</tt>, который правильно удалит испорченные по той или иной причине файлы конфигурации с операцией отзыва сертификата. Вы можете использовать данный скрипт, чтобы выполнить отзыв сертификатов и удалить устаревшие файлы связанные с ними.
ВНИМАНИЕ! Используется упоминания о CCD. Если вы не используете ccd, закомментируйте операции связанные с ним.
ВНИМАНИЕ! Используется упоминания о CCD. Если вы не используете ccd, закомментируйте операции связанные с ним.
     touch /etc/openvpn-client-configs/revoke.sh
     touch /etc/openvpn/client-configs/revoke.sh
     sudo chmod 700 revoke.sh
     cd /etc/openvpn/client-configs
    chmod 700 revoke.sh


Отредактируй файл <tt>revoke.sh</tt>:
Отредактируй файл <tt>revoke.sh</tt>:
Строка 536: Строка 706:
     CCD=/etc/openvpn/ccd
     CCD=/etc/openvpn/ccd
     easyrsa=/etc/openvpn/easy-rsa/easyrsa
     easyrsa=/etc/openvpn/easy-rsa/easyrsa
 
   
     echo "-----REVOKING-----"
     echo "-----REVOKING-----"
     $easyrsa revoke ${1}
     $easyrsa revoke ${1}
Строка 543: Строка 713:
     echo "Updating index.txt"
     echo "Updating index.txt"
     $easyrsa update-db
     $easyrsa update-db
 
   
     rm ${OUTPUT_DIR}/${1}.ovpn
     rm ${OUTPUT_DIR}/${1}.ovpn
     echo "Removed:  ${OUTPUT_DIR}/${1}.ovpn"
     echo "Removed:  ${OUTPUT_DIR}/${1}.ovpn"
Строка 555: Строка 725:
     echo "Removed: ${CCD}/${1}"
     echo "Removed: ${CCD}/${1}"


=== Шаг 12 - примеры использования скриптов ===
=== Примеры использования скриптов ===
Генерация файла конфигурации ovpn:
Генерация файла конфигурации ovpn с последующим заданием пароля профиля (рекомендуется), иначе любой кто получит доступ к ovpn файлу сможет войти по VPN в вашу сеть:
    cd /etc/openvpn/client-configs
     ./make-config.sh client1
     ./make-config.sh client1
     ls ~/client-configs/files
     ls ~/client-configs/files
Строка 562: Строка 733:


Отзыв сертификата и удаление остаточных файлов отзываемого сертификата:
Отзыв сертификата и удаление остаточных файлов отзываемого сертификата:
    cd /etc/openvpn/client-configs
     ./revoke.sh client1
     ./revoke.sh client1


Отзыв сертификата вручную с помощью easyrsa:
Отзыв сертификата вручную с помощью easyrsa выполняется в три действия:
    cd /etc/openvpn/easy-rsa
    # Отозвать сертификат client1
     ./easyrsa revoke client1
     ./easyrsa revoke client1
    # Обновить файл CRL
     ./easyrsa gen-crl
     ./easyrsa gen-crl
    # Обновить таблицу index.txt в /etc/openvpn/pki/index.txt
     ./easyrsa update-db
     ./easyrsa update-db


На этом этапе настройка OpenVPN сервера завершена. Далее рекомендуется настроить fail2ban и настроить postfix для отправки автоматических оповещений сервера по электронной почте.
На этом этапе настройка OpenVPN сервера завершена. Далее рекомендуется настроить fail2ban и настроить postfix для отправки автоматических оповещений сервера по электронной почте.


=== Источники ===
== Ссылки ==
[https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage community.openvpn.net]
[https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage community.openvpn.net]
[https://linuxconfig.org/how-to-setup-a-openvpn-server-on-ubuntu-20-04 linuxconfig.org]
[https://linuxconfig.org/how-to-setup-a-openvpn-server-on-ubuntu-20-04 linuxconfig.org]
[https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04-ru digitalocean.com]
[https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-18-04-ru digitalocean.com]
[https://losst.ru/nastrojka-openvpn-v-ubuntu losst.ru]
[https://losst.ru/nastrojka-openvpn-v-ubuntu losst.ru]
[https://www.8host.com/blog/nastrojka-servera-openvpn-v-ubuntu-20-04/ 8host.com]
[https://www.8host.com/blog/nastrojka-servera-openvpn-v-ubuntu-20-04/ 8host.com]
[https://hackware.ru/?p=5369 hackware.ru]

Текущая версия от 11:21, 29 июня 2023

OpenVPN — свободная реализация технологии виртуальной частной сети (VPN) с открытым исходным кодом для создания зашифрованных каналoв типа точка-точка или клиент-сервер между компьютерами. Она позволяет устанавливать соединения между компьютерами, находящимися за NAT и сетевым экраном, без необходимости изменения их настроек. OpenVPN была создана Джеймсом Йонаном (James Yonan) и распространяется под лицензией GNU GPL.

Предисловие

Прежде чем начать, рекомендуется ознакомиться с особенностями работы OpenVPN на ALT Linux.

Размещение файлов:
  • /var/lib/openvpn/ — Корневой каталог после инициализации демона (chroot)
  • /var/lib/openvpn/etc/openvpn/ccd — Каталог, в котором размещаются файлы особых параметров для подключаемых клиентов (Client Config Directory)
  • /var/lib/openvpn/cache — Каталог для рабочих файлов после инициализации соединения. В файле конфигурации для таких файлов нужно писать путь /cache/файл
  • /etc/openvpn/ — Каталог с файлами настройки
  • /etc/openvpn/ccd — Символическая ссылка на /var/lib/openvpn/etc/openvpn/ccd (файлы доступны и до, и после chroot)
  • /etc/openvpn/keys/ — Каталог для хранения ключей (точнее, для информации ограниченного доступа)

Особенности конфигурации и работы сервера в ALT Linux

Каждый файл конфигурации по маске /etc/openvpn/*.conf является конфигурацией отдельного экземпляра демона openvpn. Для имени экземпляра берётся имя файла без суффикса ".conf".

Настройки стартового скрипта располагаются в файле /etc/sysconfig/openvpn, по умолчанию он устанавливает следующие переменные окружения:

   CHROOT=yes
   OPENVPNUSER=openvpn
   OPENVPNGROUP=openvpn
   MANUAL=""

Стартовый скрипт /etc/init.d/openvpn может запускать и останавливать как все экземпляры демона, так и каждый по отдельности. Значение переменной MANUAL в /etc/sysconfig/openvpn указывает экземпляры, которые не нужно автоматически запускать при старте системы (и при запуске стартового скрипта без параметра).

Для ручного запуска (остановки, проверки) одного экземпляра в конце командной строки указываем имя экземпляра. Например, для экземпляра openvpn с конфигом /etc/openvpn/server.conf:


[root@kuvepus openvpn]# service openvpn start server
[root@kuvepus openvpn]# service openvpn status server

Когда запускаем сервис:
  • демон openvpn запускает скрипт /etc/openvpn/openvpn-startup
  • читает файлы *.conf указанные в /etc/openvpn/openvpn-startup из /etc/openvpn/
  • читает файлы dh, ca и ключи из папки указанной в конфигурационном файле сервера. Этот каталог доступен демону только при его запуске
  • выполняет chroot в /var/lib/openvpn/ и cd в /var/lib/openvpn/cache
  • понижает привилегии до пользователя openvpn, затем инициализирует работу с сетью.

Советы по устранению неполадок

Права доступа к файлам:
  • ключи должны быть доступны только root;
  • конфигурации клиентов должны быть доступны на чтение пользователю openvpn;
  • файл отзывов сертификатов CRL должны быть доступны на чтение пользователю openvpn.

Журналирование

Если вы используете UFW или iptables с журналированием, то вы сможете посмотреть блокировки в реальном времени с помощью команды:

   journalctl -k -f

Посмотреть журналы openvpn в реальном времени:

   journalctl -u openvpn -f

Файл CRL

Файл crl.pem нужно обновлять заранее, иначе если истечет срок действия файла crl.pem, то клиенты не смогут подключиться. В журналах работы сервера при этом увидите ошибки подключения клиентов и указание на проблему срока действия CRL:

   VERIFY ERROR: depth=0, error=CRL has expired: CN=client1

Чтобы проверить последнюю дату обновления файла CRL используй команду:

   openssl crl -inform PEM -in crl.pem -text -noout
   Last Update: Aug 26 13:30:36 2022 GMT
   Next Update: Sep 25 13:30:36 2023 GMT

Чтобы обновить CRL используй команду:

   ./easyrsa gen-crl

Директива CCD

Ошибка в журнале следующего вида сообщает о том, что у вас включена директива ccd, но файл ccd для client1 отсутствует или не настроен:

   TLS Auth Error: --client-config-dir authentification failed for common name 'client1' file='/etc/openvpn/ccd/client1'

Развертывание сервера OpenVPN

В данной статье OpenVPN сервер настраивается с использованием ECC (elliptic curve cryptography) шифрования, что требует обязательного использования следующих версий программного обеспечения:

   openvpn 2.4.0 и выше 
   easyrsa 3.0 и выше
   openssl 1.0.1 и выше

Шаг 1 - установка openvpn и easy-rsa

Проверь обновления и установи обновления для своей системы.

   apt-get update ; apt-get dist-upgrade -y

Установи openvpn и easy-rsa.

   apt-get install openvpn easy-rsa

Установка openvpn создаст в папке /etc папку openvpn.
Установка easyrsa создаст в папке /usr/share папку easyrsa или easyrsa3 или easy-rsa. В нашем случае была создана папка easyrsa3.

Создай папку easy-rsa в папке openvpn. Здесь будет размещена инфраструктура открытых ключей (PKI), поэтому запрети всем кроме root войти в папку easy-rsa

   mkdir /etc/openvpn/easy-rsa
   chown root /etc/openvpn/easy-rsa
   chmod 700 /etc/openvpn/easy-rsa

Шаг 2 - инициализация PKI

Традиционными алгоритмами шифрования в OpenVPN является DH и RSA. Вместо этого, будет использоваться ECDH и ECDSA - протокол Диффи Хелмана на эллиптических кривых (ECC). Исследование показало[1], что ECDH и ECDSA обладает более высокой криптостойкостью в сравнении с DH и RSA , поэтому задействуем в настройке сервера алгоритмы шифрования ECDH и ECDSA. OpenVPN использует кривую автоматически из сертификата сервера сгенерированного с помощью ECDSA [2] при условии, что в конфигурации сервера директива dh отключена. Файл dh.pem не будет генерироваться. Если сгенерировать сертификат сервера на алгоритме RSA, то OpenVPN будет вынужден попытаться выполнить согласование алгоритмов. В случае ошибки согласования OpenVPN будет использовать secp384r1 в качестве запасного варианта при аутентификации. Прошу обратить внимание, что в данной статье создан один общий для всех vars файл, используемый для генерации сертификатов и ключей, поэтому сертификаты клиентов также будут настроены на использование шифрования с помощью ECC.

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

   cd /etc/openvpn/easy-rsa/
   cp /usr/share/easyrsa3/vars.example vars

Отредактируй файл /etc/openvpn/easy-rsa/vars. Найди нижеследующие строчки в файле и внеси изменения.

   # Размер секретного ключа в битах
   set_var EASYRSA_KEY_SIZE 4096
   
   # Включить поддержку криптографии эллиптической кривой (рекомендуется)
   set_var EASYRSA_ALGO "ec"
   
   # Настройки цифровой подписи сертификата
   set_var EASYRSA_DIGEST "sha512"
   
   # Срок действия всех выпущенных сертификатов в том числе и сервера в днях (1800 дней - это 4.9 лет)
   set_var EASYRSA_CERT_EXPIRE 1800
   
   # Число дней до следующей даты публикации CRL. 
   set_var EASYRSA_CRL_DAYS 365
   # crl.pem файл нужно обновлять заранее, 
   # иначе если истечет срок действия файла crl.pem, то клиенты не смогут подключиться 
   # В журналах работы сервера при этом увидите
   # ошибки подключения клиентов и указание на проблему срока действия CRL.
   # Чтобы проверить последнюю дату обновления файла CRL
   # используй команду: openssl crl -inform PEM -in crl.pem -text -noout
   # Last Update: Aug 26 13:30:36 2022 GMT
   # Next Update: Sep 25 13:30:36 2023 GMT
   # Чтобы обновить CRL используй команду: ./easyrsa gen-crl

Когда вы закончите работу с сертификатами сервера вы можете уменьшить срок действия сертификатов клиента. Просто измените EASYRSA_CERT_EXPIRE в любой момент в файле vars.

Приступим к инициализации PKI. На первом запуске, если не указать --vars, easyrsa установит значения по умолчанию, которые вшиты в программу easyrsa, в функции vars_setup(), поэтому запускаем инициализацию PKI с указанием местоположения файла vars:

   easyrsa --vars=/etc/openvpn/easy-rsa/vars init-pki

После инициализации инфраструктуры ключей, для надежности работы конфигурации шифрования, создадим ссылки на vars в нескольких местах (не во всех), где easyrsa ожидает его появления (см. функцию vars_setup() в программе easyrsa)
Создай ссылку на vars в папке с pki, т.к. easyrsa ищет файл vars в $PWD/pki

   ln -s /etc/openvpn/easy-rsa/vars /etc/openvpn/easy-rsa/pki/vars

В ALT Linux easyrsa расположен в /usr/bin. Создай ссылку на файл vars в /usr/bin/, т.к. easyrsa ищет файл vars рядом с easyrsa.

   ln -s /etc/openvpn/easy-rsa/vars /usr/bin/vars

Скрипт make-config.sh описанный на шаге создания клиентских конфигураций *.ovpn ищет easyrsa в папке /etc/openvpn/easy-rsa, там же у нас лежит файл vars, поэтому создай ссылку на программу easyrsa в этой папке. Создание данной ссылки на самом деле является адаптацией под семейство debian, т.к. в debian системах easyrsa не располагается в /usr/bin.

   ln -s /usr/bin/easyrsa /etc/openvpn/easy-rsa/

Шаг 3 - сертификат и ключ сервера

Рассмотрим несколько путей работы с сертификатами OpenVPN. В данной статье дальнейшие действия развиваются по варианту "Б" - наиболее распространенный вариант.

Вариант "А" предназначен для тех, кто собирается подписывать сертификаты ключом центра сертификации CA в организации, то есть любым уже имеющимся ca.key.

Преимущества и недостатки:
  • Ваша PKI намного лучше защищена, т.к. находится в отдельном защищенном месте (т.е. хранится не на той же машине, что и openvpn).
  • Единое управление всеми выпущенными сертификатами
  • В данной схеме можно задействовать общедоступный список CRL. Для отзыва сертификатов в вашей организации можно опубликовать список CRL на сервере nginx в локальной сети и организовать автоматическую проверку валидности сертификатов клиентов.
  • Для использования данной схемы потребуется уже имеющаяся PKI. Каждый раз при создании сертификатов клиента OpenVPN, вам придется подписывать их способом описным в данном варианте.
  • Это медленный способ, особенно, если ваш CA не подключен к сети и к нему нужно идти с флешкой в выделенное помещение.

Вариант "Б" предназначен для тех, у кого нет ca.key и хочет его создать либо просто для тех, кого устраивают самоподписанные сертификаты. Это легкий путь.

Вариант "A" - используем уже имеющийся центр сертификации

Внимание! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.


Шаг А.1 - создание запроса на сертификат и закрытый ключ

   cd /etc/openvpn/easy-rsa
   ./easy-rsa gen-req myserver nopass
   
   Common Name (eg: your user, host, or server name) [server]:
   Keypair and certificate request completed. Your files are:
   req: /home/host/easy-rsa/pki/reqs/myserver.req
   key: /etc/openvpn/easy-rsa/pki/private/myserver.key
   
   cp /etc/openvpn/easy-rsa/pki/private/myserver.key /etc/openvpn/server/

На данном этапе был сгенерирован ключ и запрос на подпись сертификата для сервера. CSR готов к подписанию вашим CA.

Шаг А.2 - подпись запроса на сертификат

   scp /etc/openvpn/easy-rsa/pki/reqs/myserver.req user@your-ca-server-ip:/tmp
   
   user@your-ca-server-ip:$ cd /easy-rsa
   ./easy-rsa import-req /tmp/myserver.req myserver
   ./easy-rsa sign-req server myserver
   
   You are about to sign the following certificate.
   Please check over the details shown below for accuracy. Note that this request
   has not been cryptographically verified. Please be sure it came from a trusted
   source or that you have verified the request checksum with the sender.
   Request subject, to be signed as a server certificate for 3650 days:
   subject=
   commonName = server
   Type the word 'yes' to continue, or any other input to abort.
   Confirm request details: yes
   . . .
   Certificate created at: /home/host/easy-rsa/pki/issued/myserver.crt

На данном этапе сертификат подписан, копируем назад на openvpn server

   scp pki/issued/myserver.crt user@your-vpn-server-ip:/tmp
   scp pki/ca.crt user@your-vpn-server-ip:/tmp

Вариант "Б" - создать новый центр сертификации

Создадим центр сертификации. Обязательно введите сложный пароль. Данный пароль вам придется вводить каждый раз при подписывании сертификатов.

   cd /etc/openvpn
   easyrsa build-ca

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

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

   cd /etc/openvpn
   easyrsa build-server-full myserver nopass

Скопируем ключи сервера в папку keys. Здесь будут хранится ключи сервера и размещена ссылка на crl.pem

   cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/keys/ca.crt
   cp /etc/openvpn/easy-rsa/pki/issued/myserver.crt /etc/openvpn/keys/myserver.crt
   cp /etc/openvpn/easy-rsa/pki/private/myserver.key /etc/openvpn/keys/myserver.key

Поправим права доступа к папке keys, чтобы пользователь группы openvpn не мог войти в эту папку.

   cd /etc/openvpn
   сhown root:root /etc/openvpn/keys
   chmod 700 /etc/openvpn/keys

Шаг 4 - усиление защиты OpenVPN

По состоянию на 14.05.2023, почти все (кроме пункта о tls-crypt-v2) указанные в этом разделе рекомендации реализованы в конфигурации сервера и клиента. Раздел №4 об усилении защищенности установлен здесь раньше, чтобы вы заранее могли подготовиться и осмыслить то, как будет выглядеть итоговая конфигурация ваших клиентов и сервера.

Рекомендации по усилению защиты:

1) При конфигурировании сервера используй протокол UDP. Хотя OpenVPN позволяет использовать протокол TCP или UDP в качестве соединения с OpenVPN, протокол UDP обеспечит лучшую защиту от DoS-атак и сканирования портов, чем TCP.

2) При конфигурировании сервера настрой директиву user/group на использование группы openvpn/openvpn (как этого рекомендует Alt Linux). OpenVPN был очень тщательно разработан, чтобы разрешить удаление привилегий root после инициализации, и эта функция всегда должна использоваться в Linux/BSD/Solaris. Без привилегий root запущенный демон сервера OpenVPN представляет собой гораздо менее заманчивую цель для злоумышленника.

3) Используйте ключи шифрования большего размера.

4) Храните ca.key на отдельной изолированной машине.

5) Директива crl-verify заставляет сервер проверять сертификат клиента по списку отзыва сертификатов. Этот параметр не является обязательным. Если соответствующий CRL-файл отсутствует, OpenVPN зарегистрирует предупреждение в журналах вида и при этом соединение будет разрешено:

   VERIFY WARNING: depth=0, unable to get certificate CRL 

CRL (certificate revocation list, список отзыва сертификатов) используется, когда конкретный ключ был скомпрометирован, в то время когда ваш PKI не пострадал.

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

Единственный случай, когда потребовалось бы перестроить весь PKI с нуля, - это если бы сам ключ корневого сертификата ca.key был скомпрометирован.

CRL-файл считывается каждый раз при подключении клиента. Если вы сбрасываете привилегии root с помощью --user, а в этой статье мы именно так и делаем, убедитесь, что у этого пользователя достаточно привилегий для чтения файла.

Создадим CRL список отзыва сертификатов:

   cd /etc/openvpn/easy-rsa
   ./easyrsa gen-crl

В результате выполнения команды сгенерируется файл crl.pem по пути /etc/openvpn/easy-rsa/pki/ Вы можете хранить файл crl.pem где угодно. Для того, чтобы этот файл начал исполнять свою роль необходимо чтобы пользователь user/group указанный в конфигурации сервера имел доступ на чтение к этому файлу. Скопируем crl.pem в папку server:

   cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem

Создайте ссылку на crl.pem положи её в keys:

   ln -s /etc/openvpn/server/crl.pem /etc/openvpn/keys/

Настрой доступ к файлу crl.pem, чтобы клиенты могли проверять список отозванных сертификатов. Файл crl.pem должен быть доступен пользователю, который указан в параметрах user/group в конфигурации сервера (описан в шаге №6 настройки сервера). По умолчанию ALT Linux предлагает использовать пользователя openvpn:

   chown root:openvpn /etc/openvpn/server/crl.pem
   chmod 640 /etc/openvpn/server/crl.pem

6) Если клиенты не проверяют сертификат сервера, к которому они подключаются, создается потенциальная возможность реализации mitm атаки. Убедитесь, что ваши клиенты принудительно проверяют сертификат сервера. Создайте свои серверные сертификаты с помощью скрипта build-key-server (дополнительную информацию смотрите в документации easy-rsa). Это позволит определить сертификат как сертификат только для сервера, установив правильные атрибуты. Затем используйте следующую строку в конфигурацию вашего клиента:

   remote-cert-tls server

7) Протокол OpenVPN использует 2 канала связи во время сеанса VPN:

  • канал управления (control channel), в котором происходит аутентификация, согласование ключей, согласование конфигураций;
  • канал данных (data channel) в котором шифруются и происходит обмен данными.

Директива tls-auth (устарел) добавляет дополнительную подпись HMAC ко всем пакетам подтверждения связи SSL/TLS для проверки целостности в канале управления. Любой UDP-пакет, не имеющий правильной подписи HMAC, может быть удален без дальнейшей обработки. Подпись HMAC tls-auth обеспечивает дополнительный уровень безопасности, превышающий тот, который обеспечивается SSL/TLS. Директива tls-auth включает подписывание общим групповым ключом и проверку пакетов в канале управления (control channel). Он может защитить от следующих атак произведенных неавторизованными пользователями:

  • DoS-атаки или затопление UDP-порта OpenVPN.
  • Сканирование портов, чтобы определить, какие UDP-порты сервера находятся в состоянии прослушивания.
  • Уязвимости переполнения буфера в реализации SSL/TLS.
  • Инициирование рукопожатия SSL/TLS с неавторизованных компьютеров (хотя такие рукопожатия в конечном итоге не смогут аутентифицировать, tls-auth может отключить их на гораздо более раннем этапе).

Использование tls-auth требует, чтобы вы сгенерировали общий секретный ключ ta.key, который используется в дополнение к стандартному сертификату/ключу ECDSA/RSA. Один и тот же ключ должен быть и у клиентов, и у сервера.

Сгенерируем общий секретный ключ ta.key:

   cd /etc/openvpn/easy-rsa/pki/
   openvpn --genkey secret ta.key

Скопируй ta.key в папку keys:

   cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/keys/ta.key

8) Директива tls-crypt (используется в конфигурации, для настройки смотри директиву tls-auth) - это развитие идеи tls-auth, в котором общий групповой ключ используется не только для аутентификации пакетов, но и для шифрования данных управляющего канала (control channel). TLS-crypt улучшает аутентификацию TLS, добавляя симметричное шифрование к каналу управления. В отличие от tls-auth, tls-crypt не требует от пользователя установки key-direction. Она настраивается аналогичным образом как tls-auth. Защищает от атак неавторизованными пользователями:

  • Скрывает TLS сертификат.
  • Затрудняет обнаружение трафика openvpn для стороннего наблюдателя.
  • Простой вариант защиты от квантовых атак на TLS криптоалгоритмы.

9) Директива tls-crypt-v2 (не задействована в конфигурации) - это развитие tls-crypt. Главным отличием от tls-crypt является то, что tls-crypt-v2 использует уникальный ключ для каждого клиента в отдельности, а не общий групповой ключ ta.key.

10) VPN-туннели, в которых используется сжатие, восприимчивы к вектору атаки VORALCE. В конфигурации сервера отключите директиву отвечающую за сжатие данных (доп. см. оф. документацию к openvpn):

  comp-lzo no

Шаг 5 - генерация сертификатов и ключей клиентов

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

   cd /etc/openvpn/
   mkdir -p client-configs/keys/
   chmod -R 700 client-configs

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

  • Вариант "А" - с подписыванием через внешний CA. Далее вы можете скомбинировать это решение с вариантом "Б" и "В".
  • Вариант "Б" - используем самоподписаные сертификаты (для клиентов Linux)
  • Вариант "В" - файлы конфигурации OVPN (для клиентов Windows и Linux)

В данной статье дальнейшие действия развиваются по варианту "В".

Вариант "А" - с подписыванием через внешний CA

Внимание! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.


Создадим запрос на сертификат для клиента user1.

   cd /etc/openvpn/easy-rsa
   ./easyrsa gen-req user1

Скопируем ключ клиента в папку с ключами клиентских конфигураций. Затем скопируем запрос на сертификат на сервер центра сертификации.

   cp pki/private/user1.key /etc/openvpn/client-configs/keys/
   scp pki/reqs/user1.req user@your-ca-server-ip:/tmp

Подпишем запрос клиента на сервере CA.

   user@your-ca-server-ip:$
   cd /etc/openvpn/easy-rsa/
   ./easy-rsa import-req /tmp/user1.req user1
   ./easyrsa sign-req client user1

Скопируем, в результате операции подписания, сертификат клиента обратно на сервер VPN.

   scp pki/issued/user1.crt user@your-vpn-server-ip:/tmp

Скопируй сертификат клиента в папку keys клиентских конфигураций.

   user@your-vpn-server-ip:$
   cp /tmp/user1.crt /etc/openvpn/client-configs/keys/
   cp /etc/openvpn/easy-rsa/ta.key /etc/openvpn/client-configs/keys/
   cp /etc/openvpn/server/ca.crt /etc/openvpn/client-configs/keys/
   chown user:user /etc/openvpn/client-configs/keys/*

Вариант "Б" - самоподписаные сертификаты

Внимание! Для применения варианта "Б" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.


Создадим самоподписанный сертификат клиента user1. Скопируй сертификат клиента в папку keys клиентских конфигураций.

   cd /etc/openvpn/easy-rsa
   ./easyrsa build-client-full user1
   cp /etc/openvpn/easy-rsa/pki/issued/user1.crt /etc/openvpn/client-configs/keys/
   cp /etc/openvpn/easy-rsa/pki/private/user1.key /etc/openvpn/clients-configs/keys/

Вариант "В" - файлы конфигурации OVPN

Для скрипта make-config.sh который создает пользовательские конфигурации создайте ссылки на файлы:

   ln -s /etc/openvpn/keys/ca.crt /etc/openvpn/client-configs/keys/
   ln -s /etc/openvpn/keys/ta.key /etc/openvpn/client-configs/keys/

Рекомендую, по возможности, всегда использовать client-config-dir (ccd) в openvpn. CCD нужен для того, чтобы дать пользователю доступ к конкретной сети и другие персональные настройки, вместо того, чтобы всем пользователям диктовать настройки заданные глобально в конфигурации сервера. В ALT Linux папка ccd уже создана. В случае использования ccd, для персональной маршрутизации и присвоения конкретного ip адреса клиенту проверьте наличие ccd в папке /etc/openvpn.

   cd /etc/openvpn/
   ln -s /var/lib/openvpn/etc/openvpn/ccd /etc/openvpn/ccd

Шаг 6 - настройка сервера OpenVPN

Пришло время настроить сервис OpenVPN. При этом используются созданные ранее учетные данные и файлы. В данном разделе будет показано, как настроить OpenVPN по образцу, который включен в документацию проекта. Для начала нужно скопировать образец файла server.conf OpenVPN в каталог конфигурации, чтобы его можно было использовать в качестве основы для новых конфигураций. Openvpn может обслуживать несколько VPN серверов одновременно, поэтому различайте названия конфигурационных файлов для каждого сервера. Скопируй шаблон конфигурации сервера и назовите файл server.conf согласно названию вашего сертификата myserver.crt созданный на шаге 5.

   cp /usr/share/doc/openvpn-2.5.6/server.conf /etc/openvpn/server/myserver.conf

В конфигурации сервера используется параметр ccd. Параметр ccd влияет на работу OpenVPN следующим образом:

  1. подключается пользователь user123
  2. openvpn начинает искать персональный файл /etc/openvpn/ccd/user123
  3. после прочтения конфига ccd, пользователь получает указанный ip и маршрут к заданной в ccd сети
  4. содержание /etc/openvpn/ccd/user123 может быть таким:
   ifconfig-push 172.16.90.14 255.255.255.0
   push "route 172.16.0.32 255.255.255.224"

Создайте папку для хранения файлов журналов:

   mkdir -p /var/log/openvpn
   chmod 700 /var/log/openvpn

ВНИМАНИЕ! В конце файла есть дополнительные необязательные настройки, которые могут быть несовместимы с основным текстом конфигурации. Отредактируй файл myserver.conf:

   # topology subnet (топология подсеть) - это рекомендуемая топология на сегодняшний день;
   # она не используется по умолчанию в OpenVPN 2.3 
   # по причинам обратной совместимости с конфигурациями эпохи 2.0.9. 
   # Рекомендуется использовать топологию подсети и это безопасно, когда не существует старых/устаревших
   # клиентов, работающих под управлением OpenVPN 2.0.9 под управлением Windows.
   # Рекомендуется включать topology subnet в конфигурацию
   topology subnet
   
   # Порт который слушает сервер. Не забудьте проверить фаервол
   port 1194
   
   # Протокол взаимодействия клиента и сервера (рекомендуется udp)
   proto udp
   
   # Если вы переключили протокол на TCP, вам нужно будет изменить значение директивы 
   # explicit-exit-notify с 1 на 0, так как эта директива поддерживается только UDP. 
   # В противном случае TCP вызовет ошибки при запуске службы OpenVPN.
   explicit-exit-notify 1
   
   # Тип устройства для взаимосвязи 
   # выбери tun (tunnel) для создания туннеля VPN уровня 3 (маршрутизируемый).
   # выбери tap (transport) для создания туннеля VPN уровня 2 (мост). Это упрощенное VPN соединение.
   # При настройке tap у вас могут быть компьютеры в одной ip-подсети (например, 10.0.0.0 / 24) 
   # на обоих концах vpn, и они смогут "разговаривать" друг с другом напрямую 
   # без каких-либо изменений в их таблицах маршрутизации.
   # Режим маршрутизации также предоставляет более широкие возможности для выборочного контроля прав доступа в 
   # зависимости от конкретного клиента.
   # Рекомендую использовать режим dev tun, если вам не нужна конкретная функция, 
   # требующая подключения, например:
   # VPN должна быть способна обрабатывать протоколы, отличные от IP, такие как IPX,
   # вы запускаете приложения через VPN, которые полагаются на сетевые 
   # трансляции (например, игры по локальной сети), 
   # или вы хотели бы разрешить просмотр общих файловых ресурсов 
   # Windows через VPN без настройки сервера Samba или WINS.
   # Далее продолжим для dev tun.
   dev tun
   
   # Не рекомендуется использовать сжатие. В прошлом это уже приводило 
   # к компрометации ключей из-за повреждений при распаковке. 
   # Отключите comp-lzo как на сервере так и на клиенте (см. оф. документацию к openvpn).
   comp-lzo no
   
   # Укажи местоположение корневого сертификата центра сертификации
   ca   /etc/openvpn/keys/ca.crt
   
   # Если ранее вы указали другое имя в команде ./easyrsa gen-req server, 
   # измените строки cert и key, чтобы указать соответствующие файлы .crt и .key. 
   # Укажи местоположение сертификата сервера и ключа
   cert /etc/openvpn/keys/myserver.crt
   key  /etc/openvpn/keys/myserver.key  # Этот файл должен храниться в секрете!
   
   # Поскольку ранее было заявлено об использовании Elliptic Curve Cryptography (ECC), 
   # нам не нужен сид файл Диффи-Хеллмана. Закомментируйте существующую строку 
   # типа dh dh2048.pem или dh dh.pem, а под ней вставьте строку dh none,
   # тогда OpenVPN 2.4.0 и новее автоматически инициализирует параметры ecdh
   # из сертификата сервера (создан с помощью алгоритма 'ec').
   # Директива dh включает обмен ключами по алгоритму DH и проверку цифровой подписи RSA.
   # Отключив dh, тем самым включаем обмен ключами по ECDH и проверку цифровой подписи по ECDSA:
   dh none
   
   # Определи подсеть в которую будут попадать клиенты (подсеть будет создана автоматически)
   # сервер vpn будет раздавать клиентам адреса из этого пула
   server 172.16.90.0 255.255.255.0
   
   # Включаем ccd вместо глобального push route. В данном случае маршрут клиенту задается персонально.
   # В данном случае push "route *.*.*.* *.*.*.*" директивы нужно закомментировать!
   # Укажи использование персональных конфигураций (рекомендую всегда так делать)
   ccd-exclusive
   
   # Укажи место где располагаются файлы с персональными конфигурациями
   client-config-dir /etc/openvpn/ccd
   
   # Маршрутизировать весь трафик пользователей через Openvpn сервер
   push "redirect-gateway def1 bypass-dhcp"
   
   # Посылать пинг пакет клиенту каждые 10 секунд. Если он не ответит за 120 секунд, туннель перезапустится.
   keepalive 10 120
   
   # Директива tls-auth (устарел) добавляет дополнительную подпись HMAC ко всем пакетам рукопожатия SSL/TLS 
   # для проверки целостности. Любой UDP-пакет, не имеющий правильной подписи HMAC, 
   # может быть отброшен без дальнейшей обработки. Подпись в tls-auth HMAC обеспечивает дополнительный
   # уровень безопасности
   # Дополнительная защита для DoS атак и флудинга портов UDP
   # tls-auth /etc/openvpn/keys/ta.key 0 # Это общий секретный ключ
   # Директива tls-crypt является усилением tls-auth и включает в себя те же процедуры 
   # описанные при tls-auth и дополнительно включает шифрование данных в канале управления. 
   # Используем общий групповой ключ как для tls-auth:
   tls-crypt /etc/openvpn/keys/ta.key 0 # Это общий секретный ключ
   
   # OpenVPN автоматически поддерживает любой шифр, который поддерживается библиотекой OpenSSL, 
   # и поэтому может поддерживать шифры, использующие большие размеры ключей.
   # Стандартное значение AES-256-CBC обеспечивает нормальное шифрование, 
   # но AES-256-GCM надежнее, производительнее и хорошо поддерживается.
   cipher AES-256-GCM
   
   # Выберите алгоритм аутентификации, алгоритм обработки сообщений HMAC.
   auth SHA256
   
   # Чтобы OpenVPN запускался без привилегий, 
   # найдите настройки user и group и удалите “;” в начале этих строк:
   # Alt linux рекомендует устанавливать пользователя и группу openvpn 
   user openvpn
   group openvpn
   
   # Указывает серверу не перечитывать ключи клиента при каждом перезапуске туннеля
   persist-key
   
   # Указывает серверу не открывать устройство tun при каждом перезапуске туннеля
   persist-tun
   
   # Записывать в журнал состояние сервер
   # Укажите путь к файлу
   status /var/log/openvpn/openvpn-status.log
   
   # Режим до записи основного журнала сервера
   # Укажите путь к файлу
   log-append  /var/log/openvpn/openvpn.log
   
   # Включить проверку списка отзывов с указанием его местоположения
   crl-verify /etc/openvpn/server/crl.pem
   
   # Подробность журналов
   verb 3
   
   # ДАЛЕЕ ОПЦИОНАЛЬНЫЕ НАСТРОЙКИ, КОТОРЫЕ МОГУТ НЕ СОЧЕТАТЬСЯ С ВЫШЕ ПРЕДСТАВЛЕННОЙ КОНФИГУРАЦИЕЙ:
   
   # Ниже найдите раздел dhcp-option. Удалите “;” в начале строк, чтобы раскомментировать их:
   # эти строки позволят клиентам использовать OpenDNS резолверы по перечисленным IP-адресам 
   # Если вы предпочитаете другие резолверы, укажите их здесь
   # Это должно помочь клиентам переконфигурировать DNS для использования туннеля VPN в качестве
   # шлюза по умолчанию
   push "dhcp-option DNS 208.67.222.222"
   push "dhcp-option DNS 208.67.220.220"
   
   # Не рекомендую использовать местный DNS, windows пользователи не стабильно работают с DNS через openvpn
   # Если вы все же хотите использовать DNS в локальной сети, то настройте DNS сервер на этой машине
   # например, используя встроенный dnsmasq и обслуживайте VPN клиентов этим DNS сервером.
   push "dhcp-option DNS 10.10.10.10"
   push "dhcp-option DOMAIN test.ru"
   
   # Глобальное объявление маршрутов для клиента VPN
   push "route 172.16.0.0 255.255.0.0"

Если нужны несколько экземпляров сервера openvpn, указывайте разные файлы в параметрах status, log-append, ifconfig-pool-persist и client-config-dir, например, с именем экземпляра в префиксе.

Если вы собирайтесь использовать конфигурацию сервера без CCD, используйте в конфигурации сервера ifconfig-pool-persist:

   ifconfig-pool-persist /var/log/openvpn/ipp.txt

В файле ipp.txt сервер OpenVPN запишет ip адрес который был назначен клиенту. Адреса в файле появляются после подключения пользователя и последующего перезапуска сервера openvpn.

Шаг 7 - конфигурация сети сервера OpenVPN

Разрешаем сквозной трафик через сервер. Для NetworkManager на базе (etcnet) включается в файле /etc/net/sysctl.conf. Установи значение "1" для параметра ip_forward в файле /etc/net/sysctl.conf:

   net.ipv4.ip_forward = 1

Для NetworkManager (native) нужно редактировать /etc/sysctl.conf

Шаг 8 - настройки фаервола на ALT Linux

Следующим шагом нужно настроить фаервол. Вносить изменения в фаервол нужно делать каждый раз, когда вы создаете новую клиентскую конфигурацию. Инструкцию по установке и работе смотрите на странице посвященной UFW (собран в Sisyphus с 04.05.2023).

Пример. Как разрешить подключение ssh и openvpn в ufw, где адрес сервера локальной сети 172.16.2.2:

   ufw allow log proto tcp from 172.16.1.2 to 172.16.2.2 port 22 comment admin-ssh
   ufw allow log proto udp from any to 172.16.2.2 port 1194 comment openvpn

Пример. Как разрешить сквозной трафик от клиента client1 с адресом 172.16.90.2 к сети 172.16.3.0/24 по порту 80 и 443:

   ufw route allow proto tcp from 172.16.90.2 to 172.16.3.0/24 port 80,443 comment client1

Пример. Аналогичная настройка для встроенного стандартного iptables:

   *filter
   :OUTPUT ACCEPT
   :INPUT DROP
   -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
   -A INPUT -m conntrack --ctstate INVALID -j DROP
   #lo
   -A INPUT -s 127.0.0.0/24 -i lo -j ACCEPT
   #ovpn
   -A INPUT -i ens160 -p udp -m udp --dport 1194 -j ACCEPT
   #ssh 
   -A INPUT -i ens160 -s 172.16.1.2 -p tcp -m tcp --dport 22 -j ACCEPT
   #ntp
   -A INPUT -i ens160 -p tcp -m tcp --dport 123 -j ACCEPT
   -A INPUT -i ens160 -p udp -m udp --dport 123 -j ACCEPT
   #icmp
   -A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
   -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
   -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
   -A INPUT -p icmp -m icmp --icmp-type 12 -j ACCEPT
   :FORWARD DROP
   :openvpn-users -
   -A FORWARD -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
   -A FORWARD -p udp --sport 53 -j ACCEPT
   -A FORWARD -p udp --dport 53 -j ACCEPT
   -A FORWARD -i tun0 -j openvpn-users
   -A FORWARD -o tun0 -j openvpn-users
   -A openvpn-users -s 172.16.90.2/32 -d 172.16.3.0/24 -p tcp -m multiport --dport 80,443 -j ACCEPT
   -A openvpn-users -s 172.16.3.0/24 -d 172.16.90.2/32 -p tcp -m multiport --sport 80,443 -j ACCEPT
   -A openvpn-users -j RETURN
   COMMIT

Шаг 9 - запуск службы

Для запуска сервера используйте скрипт /etc/openvpn/openvpn-startup. Впишите в него указание для openvpn запускать сервер с конфигурации myserver.conf в фоне:

   openvpn /etc/openvpn/server/myserver.conf &

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

   #!/bin/bash
   # Startup file for OpenVPN
   openvpn /etc/openvpn/server/myserver.conf &
   # Load tun module
   /sbin/modprobe tun >/dev/null 2>&1
   sleep 1s

Добавьте службу в автозапуск:

   systemctl enable openvpn

Запустите сервер:

   service openvpn start

Чтобы убедиться, что сервер запущен выполните команду:

   systemctl status openvpn

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

   journalctl -u openvpn

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

На шаге 5 была создана папка client-configs/keys теперь создадим в ней папку files. Эта папка предназначена для хранения *.ovpn файлов конфигурации.

   mkdir -p /etc/openvpn/client-configs/files/

Скопируем шаблон клиентской конфигурации.

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

Отредактируем файл клиентской конфигурации /etc/openvpn/client-configs/client.conf:

   # Означает, что это конфигурация для клиента
   client
   
   # Установите здесь такое же значение как у сервера
   dev tun
   
   # Убедитесь, что взаимодействия с сервером совпадает в конфигурациях
   proto udp
   
   # Принудительно отключить сжатие
   comp-lzo no
   
   # Укажите внешний IP адрес в глобальной сети и (рекомендую) укажите нестандартный порт
   # убедитесь, что трафик с данного порта будет перенаправлен (операция NAT) на ip адрес сервера и порт,
   # указанный в конфигурации сервера
   remote 199.199.199.199 23111
   
   # Продолжайте бесконечно пытаться разрешить имя хоста сервера OpenVPN. Очень полезно на компьютерах,
   # которые не подключены постоянно к Интернету, таких как ноутбуки.
   resolv-retry infinite
   
   # Большинство клиентов не нуждаются в привязке к номеру исходящего порта
   nobind
   
   # Понизить привилегии после аутентификации клиента на сервере
   # затем раскомментируйте директивы user и group, удалив “;”:
   user openvpn
   group openvpn
   
   # Найдите директивы CA, CERT и KEY. ЗАКОММЕНТИРУЙТЕ их, т.к. сертификаты и ключи нужно добавить внутри 
   # самого файла.
   ;ca ca.crt
   ;cert client.crt
   ;key client.key
   
   # Также ЗАКОММЕНТИРУЙТЕ директиву tls-auth. Файл ta.key будет добавляться прямо в конфигурационный файл клиента.
   ;tls-auth ta.key 1
   
   # Укажите аналогично строки ниже как на сервере
   persist-key
   persist-tun
   
   # Дает указание клиенту OpenVPN разрешать подключения только к VPN-серверу, у которого есть сертификат 
   # с атрибутом EKU X.509
   remote-cert-tls server
   
   # Добавьте в конфигурацию key-direction в "1", это означает что будут использоваться файлы конфигурации ovpn.
   key-direction 1
   
   # Параметры cipher и auth должны быть в согласованном значении /etc/openvpn/server.conf.
   cipher AES-256-GCM
   auth SHA256
   
   # Уровень подробности ведения журналов
   verb 3

Шаг 11 - создание клиентских конфигураций

Небольшое отступление по поводу срока действия сертификата. Дело в том, что ранее был создан общий vars файл для создания сертификата сервера, в котором был указан срок действия 1800 дней. Когда придёт время обновить сертификат сервера, не забудьте про этот нюанс. Возможно вам следует разделить vars файлы на серверный и клиентский. Если нужно изменить срок действия сертификата отредактируй параметр в /etc/openvpn/easy-rsa/vars:

   set_var EASYRSA_CERT_EXPIRE     365

Создадим файл make-config.sh для полуавтоматического создания пользовательской конфигурации *.ovpn. Данный скрипт сформирует пользовательский конфигурационный файл, который присоединит сертификат центра сертификации, сертификат пользователя, ключ пользователя и ta.key в *.ovpn файл (см. исходник).

   touch /etc/openvpn/client-configs/make-config.sh
   cd /etc/openvpn/client-configs
   chown root:root make-config.sh
   chmod 700 make-config.sh

Отредактируй make-config.sh файл:

   #!/bin/bash
   # Варианты использования:
   # 1) клиенту потребуется ввести пароль для аутентификации на сервере (рекомендуется): ./make-config.sh client1
   # 2) не потребуется вводить пароль: ./make-config.sh client1 nopass
   KEY_DIR=/etc/openvpn/client-configs/keys
   OUTPUT_DIR=/etc/openvpn/client-configs/files
   BASE_CONFIG=/etc/openvpn/client-configs/client.conf
   CLIENT_DIR=/etc/openvpn/easy-rsa/
   CA_DIR=/etc/openvpn/easy-rsa
   
   cd ${CA_DIR}
   echo "Creating a self-signed certificate $1..."
   echo | ${CA_DIR}/easyrsa build-client-full ${1} ${2}
   if [ $? -ne 0 ]
   then
           echo "Error on created"
           exit $?
   fi
   cp ${CA_DIR}/pki/private/${1}.key ${KEY_DIR}/
   cp ${CA_DIR}/pki/issued/${1}.crt ${KEY_DIR}/
   echo "Compiling config file..."
   cat ${BASE_CONFIG} \
       <(echo -e '<ca>') \
       ${KEY_DIR}/ca.crt \
       <(echo -e '</ca>\n\n<cert>') \
       ${KEY_DIR}/${1}.crt \
       <(echo -e '</cert>\n\n<key>') \
       ${KEY_DIR}/${1}.key \
       <(echo -e '</key>\n\n<tls-crypt>') \
       ${KEY_DIR}/ta.key \
       <(echo -e '</tls-crypt>') \
       | egrep -v "^\s*(#|$|;)" \
       > ${OUTPUT_DIR}/${1}.ovpn

Опционально. Создадим скрипт revoke.sh, который правильно удалит испорченные по той или иной причине файлы конфигурации с операцией отзыва сертификата. Вы можете использовать данный скрипт, чтобы выполнить отзыв сертификатов и удалить устаревшие файлы связанные с ними. ВНИМАНИЕ! Используется упоминания о CCD. Если вы не используете ccd, закомментируйте операции связанные с ним.

   touch /etc/openvpn/client-configs/revoke.sh
   cd /etc/openvpn/client-configs
   chmod 700 revoke.sh

Отредактируй файл revoke.sh:

   #!/bin/bash
   # for variant b)
   # Первый аргумент: идентификатор клиента
   # Например: ./revoke client1
   KEY_DIR=/etc/openvpn/client-configs/keys
   OUTPUT_DIR=/etc/openvpn/client-configs/files
   BASE_CONFIG=/etc/openvpn/client-configs/client.conf
   CA_DIR=/etc/openvpn/easy-rsa
   CCD=/etc/openvpn/ccd
   easyrsa=/etc/openvpn/easy-rsa/easyrsa
   
   echo "-----REVOKING-----"
   $easyrsa revoke ${1}
   echo "-----GEN-CRL-----"
   $easyrsa gen-crl
   echo "Updating index.txt"
   $easyrsa update-db
   
   rm ${OUTPUT_DIR}/${1}.ovpn
   echo "Removed:  ${OUTPUT_DIR}/${1}.ovpn"
   rm ${CA_DIR}/pki/reqs/${1}.req
   echo "Removed:  ${CA_DIR}/pki/reqs/${1}.req"
   rm ${CA_DIR}/pki/private/${1}.key
   echo "Removed: ${CA_DIR}/pki/private/${1}.key"
   rm ${CA_DIR}/pki/issued/${1}.crt
   echo "Removed: ${CA_DIR}/pki/issued/${1}.crt"
   rm ${CCD}/${1}
   echo "Removed: ${CCD}/${1}"

Примеры использования скриптов

Генерация файла конфигурации ovpn с последующим заданием пароля профиля (рекомендуется), иначе любой кто получит доступ к ovpn файлу сможет войти по VPN в вашу сеть:

   cd /etc/openvpn/client-configs
   ./make-config.sh client1
   ls ~/client-configs/files
       client1.ovpn

Отзыв сертификата и удаление остаточных файлов отзываемого сертификата:

   cd /etc/openvpn/client-configs
   ./revoke.sh client1

Отзыв сертификата вручную с помощью easyrsa выполняется в три действия:

   cd /etc/openvpn/easy-rsa
   # Отозвать сертификат client1
   ./easyrsa revoke client1
   # Обновить файл CRL
   ./easyrsa gen-crl
   # Обновить таблицу index.txt в /etc/openvpn/pki/index.txt
   ./easyrsa update-db

На этом этапе настройка OpenVPN сервера завершена. Далее рекомендуется настроить fail2ban и настроить postfix для отправки автоматических оповещений сервера по электронной почте.

Ссылки

community.openvpn.net

linuxconfig.org

digitalocean.com

losst.ru

8host.com

hackware.ru