====== OpenVPN Настройка сервера ====== Зачем 100500 статейка на одну и ту же тему? Просто для себя! Задача: * Сервер OpenVPN на Ubuntu (настройки пойдут на любом другом дистрибутиве, вся разница только в установке пакетов) * Разумные (но не параноидальные) настройки безопасности, больше информации можно найти тут: https://blog.securityevaluators.com/hardening-openvpn-in-2020-1672c3c4135a * Скорость работы через соединение должна быть приемлемой. Чем сильнее затянуты гайки в плане безопасности - тем неудобнее работать Что будет в итоге: * Авторизация по сертификатам * Согласование ключей на основе эллиптических кривых ECDH (Elliptic Curve Diffie-Hellmann), а не на привычных DH. Что это и чем лучше можно посмотреть тут: https://habr.com/ru/post/335906/ * TSL-криптование соединения * Списки отзыва сертификатов * Пуш клиентам необходимых настроек Что нужно: * Сервер с операционной системой Linux (в моем случае это Ubuntu) * Белый IP - в примере это XXX.XXX.XXX.XXX * Крайне желательна DNS-запись для данного IP (но можно обойтись) - в примере это vpn.mysite.com ===== Установка OpenVPN ===== Подробно процесс установки описан тут: [[software:openvpn:ubuntu-openvpn-installation|OpenVPN Установка в Ubuntu]] Так же для создания сертификатов нам понадобится пакет easy-rsa: sudo apt install easy-rsa Примечание: нижеследующее описание для easy-rsa 2.x, в версии 3.x команды другие ===== Создание директории центра сертификации ===== OpenVPN использует сертификаты для шифрования трафика между сервером и клиентами. Для выпуска доверенных сертификатов нам потребуется создать наш собственный центр сертификации. Для начала скопируем шаблонную директорию easy-rsa в нашу домашнюю директорию с помощью команды make-cadir и перейдем в нее: make-cadir ~/openvpn-ca cd ~/openvpn-ca ===== Настройка переменных центра сертификации ===== Настройка переменных нужна для ускорения и упрощения создания сертификатов. Необходимо отредактировать файл vars и установить переменные как указано ниже: ... export KEY_SIZE=2048 # Длина ключа. Чем больше, тем безопаснее, но и меньше производительность ... export CA_EXPIRE=3650 # Срок жизни сертификата центра авторизации. 3650 - 10 лет ... export KEY_EXPIRE=3650 # Срок жизни сертификатов пользователей export KEY_COUNTRY="RU" # Наименование страны export KEY_PROVINCE="YourRegion" # Название региона export KEY_CITY="YourCity" # Название города export KEY_ORG="YourCompany" # Название компании export KEY_EMAIL="your@email.com" # Адрес почты export KEY_OU="YourOU" # Наименование подразделения export KEY_CN="CommonName" # Это имя сертификата и он меняется при создании или его нужно будет вводить руками ... # X509 Subject Field export KEY_NAME="vpn.mysite.com" # Имя ключа, необязательно. Можно указать что угодно, но лучше или DNS-имя или белый IP ... ===== Как работать с сертификатами ===== При любых операциях с сертификатами желательно начинать работу с применения переменных из файла vars: cd ~/openvpn-ca source vars ===== Создание сертификата центра сертификации (CA) ===== Убедитесь, что вы находитесь в директории центра сертификации и применим настройки из файла vars: cd ~/openvpn-ca source vars Вы должны увидеть следующий вывод: NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/fireball/openvpn-ca/keys Убедимся, что мы работаем в “чистой среде” выполнив следующую команду: ./clean-all Теперь мы можем создать наш корневой центр сертификации командой: ./build-ca Эта команда запустит процесс создания ключа и сертификата корневого центра сертификации. Поскольку мы задали все переменные в файле vars, все необходимые значения будут введены автоматически. Нажимайте ENTER для подтверждения выбора. По окончании процесса у нас появится сертификат центр сертификации (CA), который мы сможем использовать для создания всех остальных необходимых нам сертификатов. ===== Создание сертификатов сервера ===== Создаем сертификат, в примере я выбрал наименование ServerVPN ./build-key-server ServerVPN Согласитесь со всеми значениями по умолчанию (кроме Common Name, оно должно быть ServerVPN), нажимая ENTER. Не задавайте challenge password. В конце процесса два раза введите "Y" для подписи и подтверждения создания сертификата. Ключ протокола Диффи-Хеллмана, используемые при обмене ключами **НЕ ДЕЛАЮ**, т.к. будет использоваться согласование ключей на основе эллиптических кривых ECDH (Elliptic Curve Diffie-Hellmann). Но если вдруг понадобится, вот команда: ./build-dh Создаем подпись HMAC для проверки целостности TLS: openvpn --genkey --secret keys/ta.key В результате в папке keys должно быть несколько файлов, из которых 4 нужные для дальнейшей работы: ca.crt - сертификат центра авторизации ServerVPN.crt - сертификат сервера ServerVPN.key - приватный ключ сервера ta.key - ключ для проверки TLS **Важно:** все файлы с расширением key являются приватными и должны быть доступны только их владельцам ===== Создаем файл отзыва сертификатов ===== Файл отзыва нужен в ситуации когда какой-то сертификат "утек" и требуется запретить подключение с ним. Для создания файла необходимо создать сертификат и тут же отозвать его. Создаем, отвечая на все вопросы и в конце два раза "Y": ./build-key empty-crl Отзываем: ./revoke-full empty-crl В папке keys появится файл crl.pem - нужно сделать на него символическую ссылку или каждый раз после отзыва сертификатов копировать в папку откуда его увидит OpenVPN. ===== Создаем сертификаты пользователей ===== Создаем сертификат пользователя с именем client1, отвечая на все вопросы и в конце два раза "Y": ./build-key client1 Итак, все готово и вот какие файлы для подключения будут нам нужны: * ca.crt * client1.crt * client1.key * ta.key ===== Конфигурационный файл сервера OpenVPN ===== Копируем наши сертификаты в папку: cd ~/openvpn-ca/keys sudo cp ca.crt ServerVPN.crt ServerVPN.key ta.key /etc/openvpn Создаем файл /etc/openvpn/server.conf: port 1194 # Порт 1194 proto udp # Протокол UDP dev tun # Тип интерфейса: TUN - L3, TAP - L2 ca /etc/openvpn/ca.crt # Сертификат ЦА (CA) cert /etc/openvpn/ServerVPN.crt # Сертификат сервера key /etc/openvpn/ServerVPN.key # Ключ сервера crl-verify /etc/openvpn/crl.pem # Список отозванных сертификатов dh none # Не используем Diffie-Hellmann ecdh-curve secp384r1 # Используем эллиптические кривые topology subnet # Топология server 10.8.0.0 255.255.255.0 # Адрес сервера и /24 подсеть ifconfig-pool-persist ipp.txt # перед тем как выдать клиенту свободный адрес из пула сервер должен свериться с файлом ipp.txt в котором прописывается привязка имени пользователя к ip-адресу client-config-dir /etc/openvpn/ccd # Директория для индивидуальных настроек пользователей (IP, маршруты и т.д.) push "dhcp-option DNS 10.8.0.1" # Принудительная отправка DNS-сервера клиентам client-to-client # Разрешить клиеентам подключаться друг к другу float # позволять пользователям менять IP keepalive 10 60 # Проверка таймаутов каждый 10 сек и переподключение через 60 секунд неактивности persist-key # не перечитывать файлы ключей при перезапуске туннеля persist-tun # оставлять без изменения устройства tun/tap при перезапуске OpenVPN explicit-exit-notify 1 # Уведомлять клиентов о необходимости переподключения tls-crypt /etc/openvpn/ta.key # Ключ TLS tls-version-min 1.2 # Минимальная версия TLS remote-cert-tls client # Требовать сертификат клиента verify-client-cert require # Запретить подключения без сертификата cipher AES-256-GCM # Протокол шифрования. AES-128-GCM менее безопасно, зато быстрее на 40% - решать вам auth SHA256 # Протокол аутентификации opt-verify #не разрешать подключение клиентов с отличающимися настройками verify-client-cert require #не разрешать подключение без сертификатов compress lz4-v2 # Режим сжатия push "compress lz4-v2" # Уведомить клиента об используемом режиме сжатия user nobody # Запуск процесса под непривелегированным пользователем group nogroup # Запуск процесса под непривелегированным пользователем status openvpn-status.log # путь к статус-файлу, в котором содержится информация о текущих соединениях и информация о интерфейсах TUN/TAP verb 3 # уровень логирования mute 20 # кол-во записей в каждой из категорий ===== Файлы индивидуальных настроек для определенных клиентов ===== Если требуется каким-то клиентам выдавать индивидуальные настройки, должно быть сделано: * Должна существовать папка ccd (можно назвать как угодно), например /etc/openvpn/ccd * Включена настройка client-config-dir /etc/openvpn/ccd в файле конфигурации * В папке создан файл для конкретного клиента с его именем Содержимое файла client1 для примера: ifconfig-push 10.8.0.101 255.255.255.0 push "route 10.10.10.0 255.255.255.0" ===== Файл настроек клиента (*.ovpn) ===== Пример файла клиента: client # Режим работы Клиент proto udp # Протокол UDP dev tun # Тип интерфейса: TUN - L3, TAP - L2 nobind # использовать динамический порт для подключени remote vpn.mysite.com 1194 # Сервер к которому подключаемся и порт resolv-retry infinite # Бесконечное кол-во попыток подключения keepalive 10 60 # Проверка таймаутов каждый 10 сек и переподключение через 60 секунд неактивности persist-key # не перечитывать файлы ключей при перезапуске туннеля persist-tun # оставлять без изменения устройства tun/tap при перезапуске OpenVPN cipher AES-256-GCM # Протокол шифрования. AES-128-GCM менее безопасно, зато быстрее на 40% - решать вам auth SHA256 # Протокол аутентификации tls-version-min 1.2 # Минимальная версия TLS tls-client # Режим клиента TLS remote-cert-tls server # Проверять TLS от сервера verify-x509-name vpn.mysite.com name # Проверять кем выдан сертификат comp-lzo # Уровень сжатия float # позволять менять IP verb 3 # Уровель логирования auth-nocache # Не кэшировать аутентификационные данные === Сертификат центра авторизации (ca.crt) === === Сертификат пользователя (client1.crt) === === Приватный ключ пользователя (client1.key) === === Ключ HMAC для TLS (ta.key) === ===== Настройка firewall (упрощенный вариант) ===== Для начала необходимо разрешить прохождение трафика между интерфейсами в файле /etc/sysctl.conf: net.ipv4.ip_forward=1 и применить изменения: sysctl -p Разрешаем клиентам ходить куда угодно (eth0 - основной шлюз): iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT