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

Материал из ALT Linux Wiki
м (openssl help dhparam)
(Полностью переписана статья. Статья стала больше похожа на руководство. Записи от прежней версии также присутствуют в на этой странице.)
Строка 1: Строка 1:
Рассмотрена настройка OpenVPN в режиме "server" на сервере Alt linux P7 с SysVinit. В случае systemd есть отличия.
== Предисловие ==
Прежде чем начать, рекомендуется ознакомиться с особенностями работы OpenVPN на ALT Linux.


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


openvpn - полнофункциональное решение VPN на базе SSL
=== Особенности конфигурации и работы сервера в ALT Linux ===
Каждый файл конфигурации по маске <tt>/etc/openvpn/*.conf</tt> является конфигурацией отдельного экземпляра демона openvpn. Для имени экземпляра берётся имя файла без суффикса <tt>".conf"</tt>.


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


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


=== Особенности работы и конфигурации ===
Стартовый скрипт <tt>/etc/init.d/openvpn</tt> может запускать и останавливать как все экземпляры демона, так и каждый по отдельности. Значение переменной <tt>MANUAL</tt> в <tt>/etc/sysconfig/openvpn</tt> указывает экземпляры, которые не нужно автоматически запускать при старте системы (и при запуске стартового скрипта без параметра).
Каждый файл конфигурации по маске /etc/openvpn/*.conf является конфигурацией отдельного экземпляра демона openvpn. Для имени экземпляра берётся имя файла без суффикса ".conf".


Настройки стартового скрипта располагаются в файле /etc/sysconfig/openvpn, по умолчанию он устанавливает следующие переменные окружения:
Для ручного запуска (остановки, проверки) одного экземпляра в конце командной строки указываем имя экземпляра. Например, для экземпляра openvpn с конфигом <tt>/etc/openvpn/server.conf</tt>:
CHROOT=yes
OPENVPNUSER=openvpn
OPENVPNGROUP=openvpn
MANUAL=""


Стартовый скрипт /etc/init.d/openvpn может запускать и останавливать как все экземпляры демона, так и каждый по отдельности. Значение переменной MANUAL в /etc/sysconfig/openvpn указывает экземпляры, которые не нужно автоматически запускать при старте системы (и при запуске стартового скрипта без параметра).
<tt><br>
[root@kuvepus openvpn]# service openvpn start server<br>
[root@kuvepus openvpn]# service openvpn status server<br>
</tt><br>


Для ручного запуска (остановки, проверки) одного экземпляра в конце командной строки указываем имя экземпляра. Например для экземпляра openvpn с конфигом /etc/openvpn/server.conf::
;Когда запускаем сервис<nowiki>:</nowiki>
[root@kuvepus openvpn]# service openvpn start server
* демон openvpn запускает скрипт <tt>/etc/openvpn/openvpn-startup</tt>
Adjusting environment for openvpn:                                                                                                                                                            [ DONE ]
* читает файлы <tt>*.conf</tt> указанные в <tt>/etc/openvpn/openvpn-startupn</tt> из <tt>/etc/openvpn/</tt>
Starting openvpn service:                                                                                                                                                                    [ DONE ]
* читает файлы dh, ca и ключи из папки указанной в конфигурационном файле сервера. Этот каталог доступен демону только при его запуске
[root@kuvepus openvpn]# service openvpn status client-one
* выполняет chroot в <tt>/var/lib/openvpn/</tt> и cd в <tt>/var/lib/openvpn/cache</tt>
openvpn is stopped
* понижает привилегии до пользователя openvpn, затем инициализирует работу с сетью.


Когда запускаем сервис, демон openvpn запускается, читает файл конфигурации из /etc/openvpn/, читает оттуда же файлы dh, ca и ключи.
=== Советы по устранению неполадок ===
Этот каталог доступен демону только при его запуске.
;Права доступа к файлам<nowiki>:</nowiki>
* ключи должны быть доступны только руту;
* конфигурации клиентов и файл отзывов сертификатов CRL должны быть доступны на чтение пользователю openvpn.


Дальше демон выполняет chroot в /var/lib/openvpn/ и cd в /var/lib/openvpn/cache, понижает привилегии до пользователя openvpn, затем инициализирует работу с сетью.
== Развертывание OpenVPN ==
=== Шаг 1 - установка openvpn и easy-rsa ===
Проверь обновления и установи обновления для своей системы.<br>
    apt-get update ; apt-get dist-upgrade -y


; Размещение файлов
Установи openvpn и easy-rsa.<br>
* Файл конфигурации в /etc/openvpn/.
    apt-get install openvpn easy-rsa
* Все ключи в /etc/openvpn/keys/.
* CRL в /var/lib/openvpn/etc/openvpn/.
* Файлы настроек клиентов в /etc/openvpn/ccd/ или /var/lib/openvpn/etc/openvpn/ccd/ (сюда адресован симлинк).
* Файл параметров DH в /etc/openvpn/ или /etc/openvpn/keys/.
* Указанный в ifconfig-pool-persist файл демон читает и пишет от корня, в /etc/openvpn/ нужен подкаталог с правом записи для openvpn.
* Файл, указанный в status, демон с правами рута читает и пишет от корня (в /etc/openvpn)


;Совет.
Установка openvpn создаст в папке /etc папку openvpn.<br>
Важно правильно указать права доступа. Ключи должны быть доступны только руту, конфигурации клиентов и файл отзывов сертификатов должны быть доступны на чтение пользователю openvpn:
В зависимости от устанавливаемой версии, установка easyrsa создаст в папке /user/share папку easyrsa или easyrsa3 или easy-rsa. В нашем случае это easyrsa3. От версии к версии пакет easyrsa не подвергается существенным изменениям, функционал остается прежним.<br>
# chown root:root /etc/openvpn/keys/* ; chmod 600 /etc/openvpn/keys/*
# chown root:openvpn /var/lib/openvpn/etc/openvpn/ccd/* /var/lib/openvpn/etc/openvpn/*crl.pem ; chmod 640 /var/lib/openvpn/etc/openvpn/ccd/* /var/lib/openvpn/etc/openvpn/*crl.pem


В файле конфигурации указываем
Создай папку easy-rsa в папке openvpn. Мы собираемся разместить PKI здесь, поэтому запрети всем кроме root войти в папку easy-rsa<br>
* ifconfig-pool-persist и status — без полного пути либо с путём /cache/
    mkdir /etc/openvpn/easy-rsa
* ca, dh, cert, key — с путём /etc/openvpn/keys/
    chown root /etc/openvpn/easy-rsa
* client-config-dir /etc/openvpn/ccd
    chmod 700 /etc/openvpn/easy-rsa
* crl-verify - с путём относительно /var/lib/openvpn (например, файл копируем в /var/lib/openvpn/etc/openvpn/server.crl.pem, в конфиге указываем crl-verify /etc/openvpn/server.crl.pem)


;Совет.
=== Шаг 2 - инициализация PKI ===
Если нужны несколько экземпляров сервера openvpn, файлы в параметрах <tt>status</tt>, <tt>ifconfig-pool-persist</tt> и <tt>client-config-dir</tt> указывайте разные, например, с именем экземпляра в префиксе.


==== Пример ====
Cкопируй шаблон с параметрами по умолчанию для easyrsa vars.example и переименуй его в vars. Мы собираемся отредактировать шаблон с настройками шифрования. Данный файл будет влиять на все созданные нами сертификаты и ключи шифрования, созданные далее. <br>
$ cat /etc/openvpn/server.conf
    cd /etc/openvpn/easy-rsa/
port 1194
    cp /usr/share/easyrsa3/vars.example vars
proto udp
Отредактируй файл <tt>/etc/openvpn/easy-rsa/vars</tt>. Найди нижеследующие строчки в файле и внеси изменения.<br>
dev tun
    # Размер секретного ключа в битах
ca  /etc/openvpn/keys/admin.ca
    set_var EASYRSA_KEY_SIZE 4096
dh  /etc/openvpn/keys/dh4096.pem
    # Включить поддержку криптографии эллиптической кривой (рекомендуется)
cert /etc/openvpn/keys/server.crt
    set_var EASYRSA_ALGO "ec"
key  /etc/openvpn/keys/server.key
    # Настройки цифровой подписи сертификата
comp-lzo
    set_var EASYRSA_DIGEST "sha512"
server 192.168.254.0 255.255.255.0
    # Срок действия всех выпущенных сертификатов в том числе и сервера в днях (1800 дней - это 4.9 лет)
tls-server
    set_var EASYRSA_CERT_EXPIRE 1800
cipher AES-256-CBC
    # Число дней до следующей даты публикации CRL.  
verb 3
    set_var EASYRSA_CRL_DAYS 365
mute 10
    # crl.pem файл нужно обновлять заранее,
keepalive 10 60
    # иначе если истечет срок действия файла crl.pem, то клиенты не смогут подключиться.
user nobody
    # В журналах работы сервера при этом будет
group nogroup
    # видны ошибки подключения клиентов и указание на проблему срока действия CRL.
persist-key
    # Чтобы проверить последнюю дату обновления файла CRL
persist-tun
    # используй следущее: openssl crl -inform PEM -in crl.pem -text -noout
status server_status.log
    # Last Update: Aug 26 13:30:36 2022 GMT
ifconfig-pool-persist server_ipp.txt
    # Next Update: Sep 25 13:30:36 2023 GMT
verb 3
    # Чтобы обновить CRL используй следующее: ./easyrsa gen-crl
management localhost 1194
push "route 192.168.1.0 255.255.255.0"
client-config-dir /etc/openvpn/ccd
route 192.168.2.0 255.255.255.0
route 192.168.3.0 255.255.255.0


=== Создание ключей ===
Когда вы закончите работу с сертификатами сервера вы можете уменьшить срок действия сертификатов клиента. Просто измените EASYRSA_CERT_EXPIRE в любой момент в файле vars.<br>
==== openssl ====
Приступим к инициализации PKI. На первом запуске, если не указать <tt>--vars</tt>, easyrsa установит значения по умолчанию, которые вшиты в программу easyrsa, в функции vars_setup()<br>
<blockquote><u>'''Создание ключей для OpenVPN тунеля средствами openssl утилиты.'''</u> Проверено:(p7,p8 systemd, sysv)</blockquote>
    easyrsa --vars=/etc/openvpn/easy-rsa/vars init-pki
Наличие в системе установленного пакета.
'''rpm -qa openssl'''
openssl-1.0.1k-alt3.M70P.1
Открываем файл /var/lib/ssl/openssl.cnf и меняем значение параметра policy на:


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


Это для того, чтобы можно было подписывать любые сертификаты.
=== Шаг 3 - сертификат и ключ сервера ===
После чего создаем следующие папки и файлы:
Рассмотрим несколько путей работы с сертификатами OpenVPN. В данной статье подробно описан вариант "Б".<br>
'''mkdir -p /root/CA/demoCA'''
'''cd /root/CA''' - далее все команды вводим находясь в данном каталоге /root/CA
'''mkdir -p ./demoCA/newcerts'''
'''touch ./demoCA/index.txt''' - текстовый файл база с действующими и отозванными сертификатами
'''echo '01' > ./demoCA/serial''' - файл индекса для базы ключей и сертификатов
'''echo '01' > ./demoCA/crlnumber''' - файл индекса для базы отозванных сертификатов
(без этого OpenSSL будет сильно ругаться, ответ кроется в файле /var/lib/ssl/openssl.cnf ).
'''less /var/lib/ssl/openssl.cnf'''  - посмотреть файл (выход q)


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


'''openssl req -new -x509 -keyout my-ca.pem -out my-ca.crt'''
'''Вариант "Б"''' предназначен для тех, у кого нет <tt>rootCA.key</tt> и хочет его создать либо просто для тех, кого устраивают самоподписанные сертификаты. Это легкий путь.<br>
<span style="font-size:1.0em">Generating a 2048 bit RSA private key
..................................................+++
................................................................................+++
writing new private key to 'my-ca.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
Country Name (2 letter code) [RU]:RU
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (e.g., your name or your server's hostname) []:CA-ORG
Email Address []:</span>


Подробнее:
==== Вариант "A" - используем уже имеющийся центр сертификации ====
* '''-req''' - запрос на создание сертификата,
'''ВНИМАНИЕ! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br>
* '''-x509''' - создать самоподписанный сертификат стандарта X.509,
Шаг А.1 - создание запроса на сертификат и закрытый ключ <br>
* '''-keyout''' - записать закрытый ключ в файл,
* '''-out''' - записать сертификат в файл.


В процессе создания, первым делом, нам предложат ввести пароль для закрытого ключа (крайне важно). Придумываем пароль, вводим, подтверждаем. Далее, будет задано несколько вопросов о том, кто мы такие. Вводим международное обозначение страны, например RU, UA, CN, далее указываем регион, город/село/деревню, название нашей организации, свои ФИО, адрес электронной почты. Все. Наш корневой "самоподписанный" сертификат готов к употреблению.  
    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/
'''openssl req -new -nodes -keyout server.pem -out server.crs'''
Generating a 2048 bit RSA private key
......................+++
..........................................+++
writing new private key to 'server.pem'
-----
...
-----
Country Name (2 letter code) [RU]:RU
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (e.g., your name or your server's hostname) []:vpn-server
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


* '''-nodes''' - означает, что шифровать закрытый ключ не нужно (иначе при каждом запуске туннеля надо будет вводить пароль на ключ).  
На данном этапе мы сегенировали ключ и запрос на подпись сертификата для сервера. CSR готов к подписанию вашим CA.
Так же вводим описание для владельца ключа, как и ранее.


И подписываем запрос на сертификат своим "самоподписанным" '''my-ca.crt''' сертификатом и ключом '''my-ca.pem''':
Шаг А.2 - подпись запроса на сертификат
'''openssl ca -cert my-ca.crt -keyfile my-ca.pem -days 3650 -in server.crs -out server.crt'''
Using configuration from /var/lib/ssl/openssl.cnf
Enter pass phrase for my-ca.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug 26 11:58:11 2015 GMT
            Not After : Aug 23 11:58:11 2025 GMT
        Subject:
            countryName              = RU
            commonName                = vpn-server
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                FA:E5:0B:67:9A:B9:03:18:8F:13:D1:30:FB:63:21:A1:83:8D:99:0C
            X509v3 Authority Key Identifier:
                keyid:65:29:B0:0A:8A:93:AA:4C:68:77:9F:6F:AF:FF:E8:FA:6B:11:27:BA
Certificate is to be certified until Aug 23 11:58:11 2025 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


* '''-cert''', корневой сертификат удостоверяющего центра
    scp /etc/openvpn/easy-rsa/pki/reqs/myserver.req user@your-ca-server-ip:/tmp
* '''-keyfile''', секретный ключ удостоверяющего центра
Отвечаем два раза положительным "игреком" (y), в итоге, получаем связку "ключ-сертификат" для сервера server.


Теперь генерируем запрос на сертификат для  пользователя:
    user@your-ca-server-ip:$ cd /easy-rsa
'''openssl req -new -nodes -keyout user_1.pem -out user_1.crs
    ./easy-rsa import-req /tmp/myserver.req myserver
'''
    ./easy-rsa sign-req server myserver
И подписываем запрос на сертификат своим "самоподписанным" '''my-ca.crt''' сертификатом и ключом '''my-ca.pem''':


'''openssl ca -cert my-ca.crt -keyfile my-ca.pem -days 365 -in user_1.crs -out user_1.crt'''
    '''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'''


Отвечаем два раза положительным "игреком" (y), в итоге, получаем связку "ключ-сертификат" для пользователя user_1.  
На данном этапе сертификат подписан, копируем назад на openvpn server
    scp pki/issued/myserver.crt user@your-vpn-server-ip:/tmp
    scp pki/ca.crt user@your-vpn-server-ip:/tmp


Некоторые клиенты, например для Android, могут использовать бандл в формате pkcs12 вместо трёх отдельных файлов. Его тоже можно сделать:
==== Вариант "Б" - создать новый центр сертификации ====


'''openssl pkcs12 -export -out user_1.p12 -inkey user_1.pem -in user_1.crt -certfile my-ca.crt'''
Создадим центр сертификации. Обязательно введите сложный пароль. Данный пароль вам придется вводить каждый раз при подписывании сертификатов.
    easyrsa build-ca


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


'''openssl dhparam -out server.dh 2048'''
Создадим сертификат сервера без пароля, иначе вам придется каждый раз при перезапуске службы вводить пароль.
    easyrsa build-server-full myserver nopass


Файлы запросов на сертификаты можно удалить:
Скопируем ключи сервера в папку keys. Здесь будут хранится ключи сервера и ссылка на crl.pem
'''rm  *.crs'''
    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


В результате в каталоге /root/CA должен получиться такой набор файлов:
Поправим права доступа к папке keys, чтобы пользователь группы openvpn не могла войти в эту папку.
'''ls -l'''
    сhown root:root
итого 40
    chmod 700 /etc/openvpn/keys
drwxr-xr-x 3 root root 4096 авг 26 15:07 demoCA
-rw-r--r-- 1 root root 1123 авг 26 14:47 my-ca.crt
-rw-r--r-- 1 root root 1834 авг 26 14:47 my-ca.pem
-rw-r--r-- 1 root root 4202 авг 26 14:58 server.crt
-rw-r--r-- 1 root root  424 авг 26 15:14 server.dh
-rw-r--r-- 1 root root 1708 авг 26 14:52 server.pem
-rw-r--r-- 1 root root 4190 авг 26 15:07 user_1.crt
-rw-r--r-- 1 root root 1708 авг 26 15:05 user_1.pem


Разносим ключи и сертификаты по каталогам сервера и клиента.
=== Шаг 4 - настройка TLS криптографии сервера OpenVPN ===
* '''my-ca.crt''' - для сервера и клиентов
* '''my-ca.pem''' - только для подписи сертификатов, лучше хранить на отдельном от OpenVPN сервера компьютере
* '''my-ca.crt, server.crt, server.dh, server.pem''' - для сервера OpenVPN
* '''my-ca.crt, user_1.crt, user_1.pem''' - для клиента OpenVPN
Для новых клиентов создать новые ключи и отдать комплектом '''my-ca.crt, новый_сертификат.crt, новый_ключ.pem'''.


В конфигурационном файле OpenVPN сервера размещаем ссылку на эти ключи (пути до ключей подставляем свои) :
Сгенерируем TLS ключ и создадим CRL файл.
ca  /root/CA/my-ca.crt
    cd /etc/openvpn/easy-rsa/pki/
cert /root/CA/server.crt
    openvpn --genkey secret ta.key
key  /root/CA/server.pem
    cd /etc/openvpn/easy-rsa
dh  /root/CA/server.dh
    ./easyrsa gen-crl


В конфигурационном файле OpenVPN клиента размещаем ссылку на эти ключи (пути до ключей подставляем свои):
Сохрани crl.pem в папку server.
ca  /etc/net/ifaces/tun0/my-ca.crt
    cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
cert /var/lib/ssl/certs/user_1.crt
    cp /etc/openvpn/easy-rsa/pki/ta.key /etc/openvpn/keys/ta.key
key /var/lib/ssl/private/user_1.pem
    ln -s /etc/openvpn/server/crl.pem /etc/openvpn/keys/
Смотрим базу ключей:
'''cat  /root/CA/demoCA/index.txt'''
V      250823115811Z          01      unknown /C=RU/CN=vpn-server
V      160825120737Z          02      unknown /C=RU/CN=user_1
* '''v'''- действующий ключ (валидный)


<blockquote>Создание списка отзыва сертификатов</blockquote>
Настрой доступ к файлу crl.pem, чтобы клиенты могли проверять список отозванных сертификатов. Файл crl.pem должен быть доступен пользователю, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.
    chown root:openvpn /etc/openvpn/server/crl.pem
    chmod 640 /etc/openvpn/server/crl.pem


Для создания списка отзыва сертификатов необходимо выполнить следующую команду:
=== Шаг 5 - генерация сертификатов и ключей клиентов ===
'''openssl ca -cert my-ca.crt -keyfile my-ca.pem -gencrl -out crl.pem'''
Создадим папку, которая будет содержать конфигурации клиентов.
Просмотр crl.pem:
    cd /etc/openvpn/
'''openssl crl -noout -text -in crl.pem'''
    mkdir -p client-configs/keys/
    chmod -R 700 client-configs
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=RU/CN=CA-ORG
        Last Update: Aug 26 13:19:40 2015 GMT
        Next Update: Sep 25 13:19:40 2015 GMT
        CRL extensions:
            X509v3 CRL Number:
                1
No Revoked Certificates.
    Signature Algorithm: sha1WithRSAEncryption
          32:b5:de:eb:99:3c:30:7f:0d:11:7c:80:39:36:0d:d7:35:72:
          a3:6b:e8:b3:8f:de:3f:77:06:27:e0:68:ea:5c:25:ea:3d:92:
          22:6e:d9:8a:11:28:4a:82:f4:95:cf:db:6c:51:f6:b1:f1:ca:
          1e:34:a2:b6:21:18:a1:84:96:13:90:db:94:bc:a5:f3:19:5d:
          cb:09:df:49:b8:2d:3b:4f:23:3b:04:e3:fd:49:5b:1b:35:19:
          ce:a5:c4:2b:61:c4:58:70:94:32:8f:2a:85:ed:fb:d5:21:da:
          8c:f1:29:0d:51:fb:22:17:fa:6b:21:37:81:b6:0d:cf:c9:8a:
          f9:19:a4:aa:d1:cd:33:6c:b7:eb:a3:bf:0d:5c:d7:87:e4:a5:
          34:2e:2c:29:e2:86:50:8d:5d:80:ac:7f:bd:8d:34:5a:20:e9:
          f2:cc:77:d7:97:a3:14:3a:39:ab:14:5b:1c:67:23:76:19:b7:
          31:15:4b:88:f2:cd:4a:4b:63:a6:ab:de:4d:7f:7d:23:49:1b:
          a1:36:c4:9f:62:86:6a:f2:77:22:cd:ff:73:ff:4c:b3:f0:c8:
          a7:68:4e:7e:26:a6:5f:55:4e:25:aa:7c:e8:e2:38:63:3a:d6:
          15:76:02:8d:22:00:94:87:72:5d:e1:ed:44:35:7b:02:c6:bb:
          9f:f2:76:0e


Отозвать серификат user_1.crt:
Рассмотрим несколько вариантов создания клиентской конфигурации.  
'''openssl ca -cert my-ca.crt -keyfile my-ca.pem -revoke user_1.crt -out crl.pem'''
Using configuration from /var/lib/ssl/openssl.cnf
Enter pass phrase for my-ca.pem:
Revoking Certificate 02.
Data Base Updated


Обновить список (обязательно после каждого отзыва сертификата):
==== Вариант "А" - с подписыванием через внешний CA ====
'''openssl ca -cert my-ca.crt -keyfile my-ca.pem -gencrl -out crl.pem'''
'''ВНИМАНИЕ! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br>
Просмотр crl.pem:
Создадим запрос на сертификат для клиента user1.
'''openssl crl -noout -text -in crl.pem'''
    ./easyrsa gen-req user1
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=RU/CN=CA-ORG
        Last Update: Aug 26 13:30:36 2015 GMT
        Next Update: Sep 25 13:30:36 2015 GMT
        CRL extensions:
            X509v3 CRL Number:
                3
Revoked Certificates:
    Serial Number: 02
        Revocation Date: Aug 26 13:28:05 2015 GMT
    Signature Algorithm: sha1WithRSAEncryption
          55:eb:cb:99:6e:01:e5:47:77:69:fc:ca:8b:d7:d0:8d:a2:5a:
          2f:90:93:71:f7:d1:70:16:75:eb:99:fa:4a:8a:43:e9:79:7d:
          43:f1:82:ac:7f:46:df:41:3b:39:59:ac:bc:5d:e1:79:85:03:
          7d:72:cb:65:c8:2e:7c:54:ec:67:07:7d:3a:08:8b:87:64:b4:
          7b:b7:dd:1c:a2:44:b1:ad:e5:76:fd:a3:10:b3:a7:81:fd:05:
          34:3f:eb:20:66:d2:7d:77:a0:e5:79:f8:88:10:e5:bb:95:d8:
          f0:d2:92:c2:ae:0f:42:2b:34:09:f5:3d:73:7d:c8:42:ea:7b:
          dc:d9:3f:c2:f2:a8:8d:63:77:3d:89:37:0b:50:70:7e:0d:c2:
          66:a5:03:61:b8:5e:25:98:9a:42:93:cf:38:74:3e:d3:a3:5c:
          2f:6c:76:52:6c:c6:0e:24:72:71:40:34:98:06:50:08:a9:8f:
          8f:66:05:3c:c2:f5:55:fe:14:d6:01:44:99:c2:8d:ce:41:c3:
          42:1e:3f:8b:c0:7f:07:44:51:bd:1d:eb:bf:ca:6d:fa:31:77:
          f1:f5:69:30:11:b1:35:58:53:05:e2:7c:90:34:66:a1:58:1d:
          78:ef:84:8b:22:23:d0:71:8f:84:9d:f7:53:f9:81:96:01:03:
          60:73:1b:b2


Для Alt Linux файл '''crl.pem''' поместить в каталог '''/var/lib/openvpn'''
Скопируем ключ клиента в папку с ключами клиентских конфигураций. Затем скопируем запрос на сертификат на сервер центра сертификации.
    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 easy-rsa/
    ./easy-rsa import-req /tmp/user1.req user1
    ./easyrsa sign-req client user1


----
Скопируем, в результате операции подписания, сертификат клиента обратно на сервер VPN.
==== Easy-Rsa ====
    scp pki/issued/user1.crt user@your-vpn-server-ip:/tmp


<u>'''Создание ключей для OpenVPN тунеля средствами Easy-Rsa скриптов.'''</u>
Скопиурй сертификат клиента в папку keys клиентских конфигураций. Папка keys должна быть доступен пользователю на чтение, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.
    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/*


Утилита для работы с командной строкой (openssl) в OpenSSL является оболочкой для многих «подпрограмм», одна из которых является Easy-rsa.
==== Вариант "Б" - самоподписаные сертифкаты ====
'''ВНИМАНИЕ! Для применения варианта "Б" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br>
Создадим самоподписанный сертификат клиента user1. Скопиурй сертификат клиента в папку keys клиентских конфигураций. Папка keys должна быть доступен пользователю на чтение, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.
    ./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/private/user1.key /etc/openvpn/clients-config/keys/


Для OpenVPN версии выше 2.3 набор скриптов easy-rsa не входит в инсталляцию по умолчанию, а устанавливается отдельно.
==== Вариант "В" - файлы конфигурации 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 в папке <tt>/etc/openvpn</tt>.
    cd /etc/openvpn/
    ln -s /var/lib/openvpn/etc/openvpn/ccd /etc/openvpn/ccd


Установим данный пакет, но для начала просмотрим кеш пакетов в системе, на наличие Easy-rsa пакета скриптов.
=== Шаг 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


'''apt-get update && apt-cache search easy rsa | grep easy'''
ВНИМАНИЕ! В конце файла есть дополнительне необязательные настройки, которые могут быть несовместимы с основным текстом конфигурации. Отредактируй файл 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, и далее продолжим для tun.
    dev tun
    # Не рекомендуется использовать сжатие. В прошлом это уже приводило
    # к компрометации ключей из-за повреждений при распаковке.
    # Закомментируй comp-lzo как на сервере так и на клиенте (см. оф. документацию к openvpn).
    # comp-lzo
    # Укажи местоположение корневого сертификата центра сертификации
    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  # Этот файл должен храниться в секрете!
    # Директива dh, которая определяет параметры Диффи-Хеллмана.
    # Поскольку ранее мы настроили поддержку Elliptic Curve Cryptography,
    # нам не нужен сид файл Диффи-Хеллмана. Закомментируйте существующую строку
    # (типа dh dh2048.pem или dh dh.pem), а под ней вставьте строку dh none:
    # Не использовать ключ Диффи-Хеллмана, вместо этого задействуем ta.key
    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
    # 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 сервер
    push "redirect-gateway def1 bypass-dhcp"
    # Посылать пинг пакет клиенту каждые 10 секунд. Если он не ответит за 120 секунд, туннель перезапустится.
    keepalive 10 120
    # Директива tls-auth добавляет дополнительную подпись HMAC ко всем пакетам рукопожатия SSL/TLS
    # для проверки целостности. Любой UDP-пакет, не имеющий правильной подписи HMAC,
    # может быть отброшен без дальнейшей обработки. Подпись в tls-auth HMAC обеспечивает дополнительный
    # уровень безопасности.
    tls-auth /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 openvpn-status.log
    # Режим дозаписи основного журнала сервера
    # Укажите место хранения файлов журналов
    log-append  openvpn.log
    # Включить проверку списка отзывов с указанием его местоположения
    crl-verify /etc/openvpn/server/crl.pem
    # Подробность журналов
    verb 3
   
    # ДАЛЕЕ ОПЦИОНАЛЬНЫЕ НАСТРОЙКИ, КОТОРЫЕ МОГУТ НЕ СОЧЕТАТЬСЯ С ВЫШЕ ПРЕДСТАВЛЕННОЙ КОНФИГУРАЦИЕЙ:
    # Чтобы трафик выходил из заданной подсети в директиве server
    push "redirect private"
    # Ниже найдите раздел 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"


easy-rsa - Simple shell based CA utility


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


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


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


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


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


'''find / -name "easyrsa*" '''
Для NetworkManager (native) нужно редактировать /etc/sysctl.conf
/usr/bin/easyrsa
/usr/share/easyrsa3


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


В OpenSSL есть пример файла openssl.cnf, который находится в соответствующей папке (название директории может изменяться от версии к версии). По умолчанию openssl утилита обращается к файлу /var/lib/ssl/openssl.cnf. В большинстве случаев (и особенно при тестировании) можно использовать как раз этот файл без каких-либо изменений. Если же вы планируете более плотно поработать с сертификатами, следует поподробнее ознакомиться с содержимым файла конфигурации. В нем есть несколько полезных параметров, например, местонахождение серийных номеров и списка отозванных сертификатов (Certificate Revocation List).  
Следущим шагом нужно настроить фаервол и это нужно делать каждый раз, когда вы создаете новую клиентскую конфигурацию. UFW можно взять с официального сайта разработчика. Выполнить сборку rpm из исходников и установить.


Однако некоторые записи из раздела [ CA_default ] ссылаются на директории и файлы, которые, в случае их отсутствия, могут привести к проблемам при развертывании центра сертификации, и вы должны создать все необходимые файлы и папки перед тем, как подписывать CSR. В составе OpenSSL идет простая утилита CA.pl, которая упрощает весь процесс (на самом деле просто создается структура директорий, на которые ссылается файл openssl.cnf)
    ufw limit 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


Разрешение на FORWARD для client1:
    ufw route allow proto tcp from 172.16.90.2 to 172.16.3.0/24 port 80,443 comment client1


Заглянем в каталог /usr/share/easyrsa3:
Аналогичная настройка для встроенного стандартного 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


'''ls /usr/share/easyrsa3 '''
=== Шаг 9 - запуск службы ===
openssl-1.0.cnf  vars.example  x509-types/
Для запуска сервера используйте скрипт <tt>/etc/openvpn/openvpn-startup</tt>. Впишите в него указание для openvpn запускать сервер с конфигурации myserver.conf в фоном:
    openvpn /etc/openvpn/myserver.conf &


Файл openssl-1.0.cnf, является конфигуратором для утилиты openssl, запущенной через скрипты easy-rsa. В случае с использованием скриптов easy-rsa нам не нужно думать о создании инфраструктуры каталогов <tt>PKI </tt>(Public Key Infrastructure — Инфраструктура открытых ключей). Программа упрощает процесс создания инфраструктуры каталогов.
В результате файл должен иметь вид:
    #!/bin/bash
    # Startup file for OpenVPN
    openvpn /etc/openvpn/myserver.conf &
    # Load tun module
    /sbin/modprobe tun >/dev/null 2>&1
    sleep 1s


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


Перейдем в каталог в котором создадим инфраструктуру каталогов для ключей и сертификатов.
Запустите сервер
    service openvpn start


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


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


'''easyrsa init-pki'''
Скопируем шаблон клиентской конфигурации
init-pki complete; you may now create a CA or requests.
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-config/client.conf
Your newly created PKI dir is: /root/pki


В текущей директории создается каталог pki c вложенными каталогами для ключей и запросов.
Отредактируем файл клиентской конфигурации <tt>/etc/openvpn/client-config/client.conf</tt>
    # Означает, что это конфигурация для клиента
    client
    # Установите здесь такое же значение как у сервера
    dev tun
    # Убедитесь, что взаимодействия с сервром сопадает в конфигурациях
    proto udp
    # Укажите внешний 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


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


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


<u>'''Ключи центра сертификации.'''</u>
Отредактируй <tt>make-config.sh</tt> файл:
    #!/bin/bash
    # Варианты использования:
    # 1) клиенту потребуется ввести пароль для аутентификации на сервере (рекомендуется): ./make-config.sh client1
    # 2) не потребуется вводить пароль: ./make-config.sh client1 nopass
    # First argument: Client identifier
    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


Создать корневой сертификат. Обязательно ввести сложный пароль и <tt>Common Name</tt> сервера, например CA-ORG:
    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-auth>') \
        ${KEY_DIR}/ta.key \
        <(echo -e '</tls-auth>') \
        | egrep -v "^\s*(#|$|;)" \
        > ${OUTPUT_DIR}/${1}.ovpn


'''easyrsa build-ca'''
Опционально. Создадим скрипт, который правильно удалит испорченые по той или иной причине файлы конфигурации с операцией отзыва сертификата.
Generating a 2048 bit RSA private key
ВНИМАНИЕ! Используется упоминания о CCD. Если вы не используете ccd, закомментируйте операции связанные с ним.
................................................................................................................................+++
    touch /etc/openvpn-client-configs/revoke.sh
......................................................+++
    sudo chmod 700 revoke.sh
writing new private key to '/root/pki/private/ca.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
<nowiki>-----</nowiki>
...
<nowiki>-----</nowiki>
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:CA-ORG
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/root/pki/ca.crt
Создать ключи Диффи-Хелмана:


'''easyrsa gen-dh'''
Отредактируй файл <tt>revoke.sh</tt>:
    #!/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}"


Проверим содержание каталога pki
=== Шаг 12 - примеры использования скриптов ===
Генерация файла конфигурации ovpn:
    ./make-config.sh client1
    ls ~/client-configs/files
        client1.ovpn


'''ls -l ./pki'''
Отзыв сертификата и удаление остаточных файлов отзываемого сертификата:
итого 28
    ./revoke.sh client1
-rw------- 1 root root 1151 авг 27 09:32 ca.crt
drwx------ 2 root root 4096 авг 27 09:32 certs_by_serial
-rw------- 1 root root  424 авг 27 09:38 dh.pem
-rw------- 1 root root    0 авг 27 09:32 index.txt
drwx------ 2 root root 4096 авг 27 09:32 issued
drwx------ 2 root root 4096 авг 27 09:32 private
drwx------ 2 root root 4096 авг 27 09:28 reqs
-rw------- 1 root root    3 авг 27 09:32 serial
* '''ca.crt '''- сертификат корневого центра сертификации


* '''dh.pem''' - ключ Диффи-Хелмана
Отзыв сертификата вручную с помощью easyrsa:
    ./easyrsa revoke client1
    ./easyrsa gen-crl
    ./easyrsa update-db


* '''./private/ca.key''' - секретный ключ центра сертификации
На этом этапе настройка OpenVPN сервера завершена. Далее рекомендуется настроить fail2ban и настроить postfix для отправки автоматических оповещений сервера по электронной почте.


 
=== Источники ===
<u>'''Ключи сервера.'''</u>
[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]
Создать запрос на сертификат для сервера OVPN. Обращаю внимание, что сертификат будет не зашифрован (запаролен), за это отвечает параметр <tt>nopass</tt>, иначе при каждом старте OpenVPN будет запрашивать этот пароль:
[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]
'''easyrsa gen-req vpn-server nopass'''
[https://www.8host.com/blog/nastrojka-servera-openvpn-v-ubuntu-20-04/ 8host.com]
Generating a 2048 bit RSA private key
....................................................+++
..............+++
writing new private key to '/root/pki/private/vpn-server.key'
<nowiki>-----</nowiki>
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
<nowiki>-----</nowiki>
Common Name (eg: your user, host, or server name) [vpn-server]:vpn-server
Keypair and certificate request completed. Your files are:
req: /root/pki/reqs/vpn-server.req
key: /root/pki/private/vpn-server.key
 
Создать сам сертификат сервера OVPN:
 
'''easyrsa sign-req server vpn-server'''
'''(client | server) - '''это параметр предположительно берущий настройки из файла /usr/share/easyrsa3/x509-types/'''server'''
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                <nowiki>= \D0\BC\D0vpn-server</nowiki>
Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /usr/share/easyrsa3/openssl-1.0.cnf
Enter pass phrase for /root/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'\0xFFFFFFC3\0xFFFFFF90\0xFFFFFFC2\0xFFFFFFBC\0xFFFFFFC3\0xFFFFFF90vpn-server'
Certificate is to be certified until Aug 24 06:57:49 2025 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /root/pki/issued/vpn-server.crt
 
Скопировать полученные ключи в рабочий каталог openvpn и в конфиге сервера указать полный путь к ключам.  
 
'''cp ./pki/ca.crt /etc/openvpn/keys'''
 
'''cp ./pki/issued/vpn-server.crt /etc/openvpn/keys'''
 
'''cp ./pki/private/vpn-server.key /etc/openvpn/keys'''
 
'''cp ./pki/dh.pem /etc/openvpn/keys'''
 
Для создания пары ключ/сертификат минуя создания запросов и подписи необходимо выполнить команду:
 
'''easyrsa build-server-full vpn-server nopass '''- без пароля
 
'''easyrsa build-server-full vpn-server '''- с паролем
 
 
<u>'''Ключи клиентам.'''</u>
 
Процесс создания ключей клиентам аналогичен созданию ключей для сервера.
 
 
Создание запроса запароленного ключа для клиента (потребуется вводить при каждом подключении) с именем User:
 
'''easyrsa gen-req User'''
 
Если авторизация будет внешней (например ADшная), то пароль не потребуется. Создание запроса без парольного ключа для клиента:
 
'''easyrsa gen-req User nopass'''
 
Создание ключа пользователя (по дефолту сроком на 10 лет):
 
'''easyrsa sign-req client User'''
 
'''(client | server) - '''это параметр предположительно берущий настройки из файла /usr/share/easyrsa3/x509-types/'''client'''
 
 
Или cоздание ключа пользователя с ограничением действия сертификата в 90 дней (после истечения срока можно только перевыпустить):
 
'''./easyrsa sign-req client User -days 90'''
 
 
Клиенту передать эти файлы:
 
'''./pki/issued/User.crt'''
 
'''./pki/private/User.key'''
 
'''./pki/ca.crt'''
 
 
Для создания пары ключ/сертификат минуя создания запросов и подписи необходимо выполнить команду:
 
'''easyrsa build-client-full User nopass '''- без пароля
 
'''easyrsa build-client-full User '''- с паролем
 
 
<blockquote><u>'''Отзыв сертификатов'''</u></blockquote>
 
 
Генерация файла отозванных ключей:
 
'''easyrsa gen-crl'''
 
 
Сделать символическую ссылку в каталог с ключами (конечно, файл можно и скопировать, но придется делать каждый раз при отзыве сертификата):
 
'''ln -s /root/pki/crl.pem /var/lib/openvpn'''
 
 
В файл конфигурации openvpn сервера добавить строку
 
'''crl-verify crl.pem'''
 
 
Отзыв сертификата пользователя User:
 
'''easyrsa revoke User'''
 
 
Каждый раз при отзыве сертификата необходимо обновлять crl.pem, чтобы внести в него изменения:
 
'''easyrsa gen-crl'''
 
 
<u>Примечание: </u>
 
Одноименный файл ключа не может быть создан пока не отозван старый.  
 
При попытке создать сертификат с уже имеющимся именем выдаст ошибку:
 
failed to update database
Easy-RSA error:
signing failed (openssl output above may have more detail)
 
 
<u>Некоторые замечания:</u>
 
Для исключения возможности mitm атаки, ошибка которого так выглядит в логах клиента:
 
WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.
 
служит параметр '''remote-cert-tls server.'''
 
 
Список валидных и отозванных сертификатов можно посмотреть в файле '''./pki/index.txt.'''
 
Начало строки описания каждого сертификата начинается с букв V или R, что значит Valid и Revoked (действующий и отозванный)
 
 
При помощи OpenSSL можно создать свой собственный центр сертификации и не прибегать к услугам коммерческих центров и тем самым сэкономить немного денег.
 
В документации утверждается, что средства по созданию своего собственного центра сертификации были разработаны лишь в демонстрационных целях. Их никогда не планировалось использовать для работы в боевых условиях. Выдержка из документации:
 
''«Первоначальной цель утилиты ca - продемонстрировать на примере, как происходит подпись запроса в центре сертификации, и не предполагается ее использование в реальной жизни. Тем не менее, некоторые пользователи используют утилиту ca для подписи запросов»''
 
Для нечастого использования – средства OpenSSL вполне подходят, однако если вы хотите создать что-то более масштабное, необходимо развернуть серьезную инфраструктуру по управлению сертификатами.
 
=== Базовая настройка для P8 ===
Рассмотрим установку и настройку OpenVPN. Установим необходимые пакеты на сервере:
<pre># apt-get install openvpn</pre>
Для настройки OpenVPN сервера мы будем использовать образец файла конфигурации OpenVpn:
 
<pre>Скопируйте из /usr/share/doc/openvpn-2.4.4/server.conf в директорию /etc/openvpn/ для его редактирования и последующего запуска сервера VPN.</pre>
Скопированный на предыдущем этапе файл server.conf является вполне работоспособной конфигурацией. Ее достаточно для нормальной работы сервера. Только стоит обратить внимание на имена и пути файлов сертификата сервера (.crt) и его ключа (.key), а также сертификата CA (.crt).<br>
Начиная с версии 2.3 утилиту easy-rsa из пакета убрали, поэтому придется установить пакет отдельно:
<pre># apt-get install easy-rsa</pre>
Генерируем все необходимые ключи и сертификаты. Вводим для них пароли.
<pre>
easyrsa init-pki
easyrsa build-ca
easyrsa build-server-full server
easyrsa build-client-full client1
easyrsa gen-dh
</pre>
Переносим полученные ключи и сертификаты в каталог /etc/openvpn/keys/.
Далее запускаем сервер OpenVPN:
<pre>openvpn /etc/openvpn/server.conf</pre>
Сервер успешно запущен.<br>
Настроим openVPN клиент:
<pre>Скопируйте из /usr/share/doc/openvpn-2.4.4/client.conf в директорию /etc/openvpn/ для его редактирования и последующего запуска клиента VPN.
Так же не забываем скопировать раннее сгенерированные ключи и сертификаты в директорию /etc/openvpn/keys/ и указать их в client.conf.
</pre>
Открываем client.conf ищем строку remote и меняем ее на:
<pre>remote 10.10.3.87 1194
где 10.10.3.87 ip вашего vpn сервера.
</pre>
Запускаем клиент OpenVPN:
<pre>openvpn /etc/openvpn/client.conf</pre>
Клиент успешно запущен.<br>
Между клиентом и сервером получится виртуальная сеть. На этом настройка OpenVPN завершена.
[[Категория:ALT Linux Office Server]]
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}

Версия от 08:20, 6 января 2023

Предисловие

Прежде чем начать, рекомендуется ознакомиться с особенностями работы 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-startupn из /etc/openvpn/
  • читает файлы dh, ca и ключи из папки указанной в конфигурационном файле сервера. Этот каталог доступен демону только при его запуске
  • выполняет chroot в /var/lib/openvpn/ и cd в /var/lib/openvpn/cache
  • понижает привилегии до пользователя openvpn, затем инициализирует работу с сетью.

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

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

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

Шаг 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 создаст в папке /user/share папку easyrsa или easyrsa3 или easy-rsa. В нашем случае это easyrsa3. От версии к версии пакет easyrsa не подвергается существенным изменениям, функционал остается прежним.

Создай папку 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

Cкопируй шаблон с параметрами по умолчанию для easyrsa vars.example и переименуй его в 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()

   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

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

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

Создай ссылку на программу easyrsa в папке где лежит настоящий файл vars, т.к. скрипт make-config.sh (описанный далее) запускает 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 не подключен сети и к нему нужно идти с флешкой в выделенное помещение.

Вариант "Б" предназначен для тех, у кого нет rootCA.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

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

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

   easyrsa build-ca

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

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

   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 не могла войти в эту папку.

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

Шаг 4 - настройка TLS криптографии сервера OpenVPN

Сгенерируем TLS ключ и создадим CRL файл.

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

Сохрани crl.pem в папку server.

   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
   ln -s /etc/openvpn/server/crl.pem /etc/openvpn/keys/

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

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

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

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

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

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

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

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

   ./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 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 клиентских конфигураций. Папка keys должна быть доступен пользователю на чтение, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.

   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 клиентских конфигураций. Папка keys должна быть доступен пользователю на чтение, который указан в параметрах user/group в конфигурации сервера (описан ниже). По умолчанию ALT Linux предлагает использовать пользователя openvpn.

   ./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/private/user1.key /etc/openvpn/clients-config/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

ВНИМАНИЕ! В конце файла есть дополнительне необязательные настройки, которые могут быть несовместимы с основным текстом конфигурации. Отредактируй файл 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, и далее продолжим для tun.
   dev tun
   # Не рекомендуется использовать сжатие. В прошлом это уже приводило 
   # к компрометации ключей из-за повреждений при распаковке. 
   # Закомментируй comp-lzo как на сервере так и на клиенте (см. оф. документацию к openvpn).
   # comp-lzo
   # Укажи местоположение корневого сертификата центра сертификации
   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  # Этот файл должен храниться в секрете!
   # Директива dh, которая определяет параметры Диффи-Хеллмана. 
   # Поскольку ранее мы настроили поддержку Elliptic Curve Cryptography, 
   # нам не нужен сид файл Диффи-Хеллмана. Закомментируйте существующую строку 
   # (типа dh dh2048.pem или dh dh.pem), а под ней вставьте строку dh none:
   # Не использовать ключ Диффи-Хеллмана, вместо этого задействуем ta.key
   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
   # 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 сервер
   push "redirect-gateway def1 bypass-dhcp"
   # Посылать пинг пакет клиенту каждые 10 секунд. Если он не ответит за 120 секунд, туннель перезапустится.
   keepalive 10 120
   # Директива tls-auth добавляет дополнительную подпись HMAC ко всем пакетам рукопожатия SSL/TLS 
   # для проверки целостности. Любой UDP-пакет, не имеющий правильной подписи HMAC, 
   # может быть отброшен без дальнейшей обработки. Подпись в tls-auth HMAC обеспечивает дополнительный
   # уровень безопасности.
   tls-auth /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 openvpn-status.log
   # Режим дозаписи основного журнала сервера
   # Укажите место хранения файлов журналов
   log-append  openvpn.log
   # Включить проверку списка отзывов с указанием его местоположения
   crl-verify /etc/openvpn/server/crl.pem
   # Подробность журналов
   verb 3
   
   # ДАЛЕЕ ОПЦИОНАЛЬНЫЕ НАСТРОЙКИ, КОТОРЫЕ МОГУТ НЕ СОЧЕТАТЬСЯ С ВЫШЕ ПРЕДСТАВЛЕННОЙ КОНФИГУРАЦИЕЙ:
   # Чтобы трафик выходил из заданной подсети в директиве server
   push "redirect private"
   # Ниже найдите раздел 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

Разрешаем forwarding трафика через сервер для 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 можно взять с официального сайта разработчика. Выполнить сборку rpm из исходников и установить.

   ufw limit 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

Разрешение на FORWARD для client1:

   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/myserver.conf &

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

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

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

   systemctl enable openvpn

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

   service openvpn start

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

Шаг 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-config/client.conf

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

   # Означает, что это конфигурация для клиента
   client
   # Установите здесь такое же значение как у сервера
   dev tun
   # Убедитесь, что взаимодействия с сервром сопадает в конфигурациях
   proto udp
   # Укажите внешний 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. Данный скрипт сформирует пользовательский конфиг файл, который присодинит все ключи в *.ovpn файл (см. исходник).

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

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

   #!/bin/bash
   # Варианты использования:
   # 1) клиенту потребуется ввести пароль для аутентификации на сервере (рекомендуется): ./make-config.sh client1
   # 2) не потребуется вводить пароль: ./make-config.sh client1 nopass
   # First argument: Client identifier
   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-auth>') \
       ${KEY_DIR}/ta.key \
       <(echo -e '</tls-auth>') \
       | egrep -v "^\s*(#|$|;)" \
       > ${OUTPUT_DIR}/${1}.ovpn

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

   touch /etc/openvpn-client-configs/revoke.sh
   sudo 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}"

Шаг 12 - примеры использования скриптов

Генерация файла конфигурации ovpn:

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

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

   ./revoke.sh client1

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

   ./easyrsa revoke client1
   ./easyrsa gen-crl
   ./easyrsa update-db

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

Источники

community.openvpn.net linuxconfig.org digitalocean.com losst.ru 8host.com