OpenVPN: различия между версиями
Pauli (обсуждение | вклад) м (openssl help dhparam) |
Generic (обсуждение | вклад) (Полностью переписана статья. Статья стала больше похожа на руководство. Записи от прежней версии также присутствуют в на этой странице.) |
||
Строка 1: | Строка 1: | ||
== Предисловие == | |||
Прежде чем начать, рекомендуется ознакомиться с особенностями работы OpenVPN на ALT Linux. | |||
;Размещение файлов<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> — Каталог для хранения ключей (точнее, для информации ограниченного доступа) | |||
=== Особенности конфигурации и работы сервера в ALT Linux === | |||
Каждый файл конфигурации по маске <tt>/etc/openvpn/*.conf</tt> является конфигурацией отдельного экземпляра демона openvpn. Для имени экземпляра берётся имя файла без суффикса <tt>".conf"</tt>. | |||
Настройки стартового скрипта располагаются в файле <tt>/etc/sysconfig/openvpn</tt>, по умолчанию он устанавливает следующие переменные окружения: | |||
CHROOT=yes | |||
OPENVPNUSER=openvpn | |||
OPENVPNGROUP=openvpn | |||
MANUAL="" | |||
Стартовый скрипт <tt>/etc/init.d/openvpn</tt> может запускать и останавливать как все экземпляры демона, так и каждый по отдельности. Значение переменной <tt>MANUAL</tt> в <tt>/etc/sysconfig/openvpn</tt> указывает экземпляры, которые не нужно автоматически запускать при старте системы (и при запуске стартового скрипта без параметра). | |||
Для ручного запуска (остановки, проверки) одного экземпляра в конце командной строки указываем имя экземпляра. Например, для экземпляра openvpn с конфигом <tt>/etc/openvpn/server.conf</tt>: | |||
<tt><br> | |||
[root@kuvepus openvpn]# service openvpn start server<br> | |||
[root@kuvepus openvpn]# service openvpn status server<br> | |||
</tt><br> | |||
;Когда запускаем сервис<nowiki>:</nowiki> | |||
* демон openvpn запускает скрипт <tt>/etc/openvpn/openvpn-startup</tt> | |||
* читает файлы <tt>*.conf</tt> указанные в <tt>/etc/openvpn/openvpn-startupn</tt> из <tt>/etc/openvpn/</tt> | |||
* читает файлы dh, ca и ключи из папки указанной в конфигурационном файле сервера. Этот каталог доступен демону только при его запуске | |||
* выполняет chroot в <tt>/var/lib/openvpn/</tt> и cd в <tt>/var/lib/openvpn/cache</tt> | |||
* понижает привилегии до пользователя openvpn, затем инициализирует работу с сетью. | |||
=== Советы по устранению неполадок === | |||
;Права доступа к файлам<nowiki>:</nowiki> | |||
* ключи должны быть доступны только руту; | |||
* конфигурации клиентов и файл отзывов сертификатов CRL должны быть доступны на чтение пользователю openvpn. | |||
== Развертывание OpenVPN == | |||
=== Шаг 1 - установка openvpn и easy-rsa === | |||
Проверь обновления и установи обновления для своей системы.<br> | |||
apt-get update ; apt-get dist-upgrade -y | |||
Установи openvpn и easy-rsa.<br> | |||
apt-get install openvpn easy-rsa | |||
Установка openvpn создаст в папке /etc папку openvpn.<br> | |||
В зависимости от устанавливаемой версии, установка easyrsa создаст в папке /user/share папку easyrsa или easyrsa3 или easy-rsa. В нашем случае это easyrsa3. От версии к версии пакет easyrsa не подвергается существенным изменениям, функционал остается прежним.<br> | |||
Создай папку easy-rsa в папке openvpn. Мы собираемся разместить PKI здесь, поэтому запрети всем кроме root войти в папку easy-rsa<br> | |||
mkdir /etc/openvpn/easy-rsa | |||
chown root /etc/openvpn/easy-rsa | |||
chmod 700 /etc/openvpn/easy-rsa | |||
=== Шаг 2 - инициализация PKI === | |||
Cкопируй шаблон с параметрами по умолчанию для easyrsa vars.example и переименуй его в vars. Мы собираемся отредактировать шаблон с настройками шифрования. Данный файл будет влиять на все созданные нами сертификаты и ключи шифрования, созданные далее. <br> | |||
cd /etc/openvpn/easy-rsa/ | |||
cp /usr/share/easyrsa3/vars.example vars | |||
Отредактируй файл <tt>/etc/openvpn/easy-rsa/vars</tt>. Найди нижеследующие строчки в файле и внеси изменения.<br> | |||
# Размер секретного ключа в битах | |||
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.<br> | |||
Приступим к инициализации PKI. На первом запуске, если не указать <tt>--vars</tt>, easyrsa установит значения по умолчанию, которые вшиты в программу easyrsa, в функции vars_setup()<br> | |||
< | easyrsa --vars=/etc/openvpn/easy-rsa/vars init-pki | ||
После инициализации инфраструктуры ключей, для надежности конфигураций, создадим ссылки на 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> | |||
'''Вариант "А"''' предназначен для тех, кто собирается подписывать сертификаты ключом центра сертификации CA в организации, то есть любым уже имеющимся <tt>ca.key</tt>. | |||
;Преимущества и недостатки<nowiki>:</nowiki> | |||
* Ваша PKI намного лучше защищена, т.к. находится в отдельном защищенном месте (т.е. хранится не на той же машине, что и openvpn). | |||
* Единое управление всеми выпущенными сертификатами | |||
* В данной схеме можно задействовать общедоступный список CRL. Для отзыва сертификатов в вашей организации можно опубликовать список CRL на сервере nginx в локальной сети и организовать автоматическую проверку валидности сертификатов клиентов. | |||
* Для использования данной схемы потребуется уже имеющаяся PKI. Каждый раз при создании сертификатов клиента OpenVPN, вам придется подписывать их способом описным в данном варианте. | |||
* Это медленный способ, особенно, если ваш CA не подключен сети и к нему нужно идти с флешкой в выделенное помещение. | |||
'''Вариант "Б"''' предназначен для тех, у кого нет <tt>rootCA.key</tt> и хочет его создать либо просто для тех, кого устраивают самоподписанные сертификаты. Это легкий путь.<br> | |||
==== Вариант "A" - используем уже имеющийся центр сертификации ==== | |||
'''ВНИМАНИЕ! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br> | |||
Шаг А.1 - создание запроса на сертификат и закрытый ключ <br> | |||
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 ==== | |||
'''ВНИМАНИЕ! Для применения варианта "А" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<br> | |||
Создадим запрос на сертификат для клиента 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/* | |||
==== Вариант "Б" - самоподписаные сертифкаты ==== | |||
'''ВНИМАНИЕ! Для применения варианта "Б" возможно потребуется изменение конфигурации не описанных здесь. Представлен для ознакомления.'''<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/ | |||
Для | ==== Вариант "В" - файлы конфигурации 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 | |||
=== Шаг 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, указывайте разные файлы в параметрах <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> | |||
В файле ipp.txt сервер OpenVPN запишет ip адрес который был назначен клиенту. | |||
Адреса в файле появляются после подключения пользователя и последующего перезапуска сервера openvpn. | |||
=== Шаг 7 - конфигурация сети сервера openvpn === | |||
Разрешаем forwarding трафика через сервер для NetworkManager на базе (etcnet) включается в файле <tt>/etc/net/sysctl.conf</tt>. | |||
Установи значение "1" для параметра ip_forward в файле <tt>etc/net/sysctl.conf</tt>: | |||
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 - запуск службы === | |||
Для запуска сервера используйте скрипт <tt>/etc/openvpn/openvpn-startup</tt>. Впишите в него указание для 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 мы создали папку <tt>client-configs/keys</tt> теперь создадим в ней папку files. Эта папка предназначена для хранения <tt>*.ovpn</tt> файлов конфигурации. | |||
mkdir -p /etc/openvpn/client-configs/files/ | |||
Скопируем шаблон клиентской конфигурации | |||
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-config/client.conf | |||
Отредактируем файл клиентской конфигурации <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 | |||
=== Шаг 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 | |||
< | Отредактируй <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 | |||
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 | |||
Отредактируй файл <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}" | |||
=== Шаг 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 для отправки автоматических оповещений сервера по электронной почте. | |||
=== Источники === | |||
[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://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://www.8host.com/blog/nastrojka-servera-openvpn-v-ubuntu-20-04/ 8host.com] | |||
Версия от 11: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