software:openvpn:ubuntu-openvpn-server

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 Установка в 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="[email protected]"  # Адрес почты
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

Убедитесь, что вы находитесь в директории центра сертификации и применим настройки из файла 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

Копируем наши сертификаты в папку:

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"

Пример файла клиента:

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>
=== Сертификат центра авторизации (ca.crt) ===
</ca>
<cert>
=== Сертификат пользователя (client1.crt) ===
</cert>
<key>
=== Приватный ключ пользователя (client1.key) ===
</key>
<tls-crypt>
=== Ключ HMAC для TLS (ta.key) ===
</tls-crypt>

Для начала необходимо разрешить прохождение трафика между интерфейсами в файле /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
  • software/openvpn/ubuntu-openvpn-server.txt
  • Последнее изменение: 2020/10/11 21:51
  • 127.0.0.1