Установка и настройка OpenVPN на Debian 12

Виртуальная частная сеть (VPN) позволяет безопасно выходить в интернет, скрывая ваше местоположение и перенаправляя трафик через доверенный сервер. OpenVPN — свободная TLS VPN-реализация, часто используемая для создания защищённых туннелей между клиентом и сервером.
В этом руководстве мы установим OpenVPN на сервер с Debian 12, настроим отдельный сервер CA (Certificate Authority), создадим необходимые криптоартефакты и соберём клиентскую конфигурацию, через которую весь трафик клиента будет проксироваться через OpenVPN-сервер.
Важно: в примерах используется сочетание IPv4 и IPv6, UFW (Uncomplicated Firewall) включён. Многие команды предполагают, что вы используете не-root пользователя с sudo и что оба сервера обновлены.
Что вы получите в конце
- Рабочий OpenVPN-сервер на Debian 12.
- Отдельный приватный CA для подписывания сертификатов.
- Клиентский файл .ovpn, который можно импортировать в GUI/CLI-клиент OpenVPN.
- Механизм отзыва сертификата (CRL) и рекомендации по безопасной эксплуатации.
Основные термины (в 1 строке)
- CA — центр сертификации, подписывает серверные и клиентские сертификаты.
- CSR — запрос на сертификат (Certificate Signing Request).
- CRL — список отозванных сертификатов (Certificate Revocation List).
- tls-crypt / tls-auth — дополнительный пред-общий ключ для защиты управления TLS.
Предварительные требования
- Сервер с Debian 12, доступ по сети (IPv4/IPv6), UFW включён — это будет OpenVPN-сервер.
- Второй сервер с Debian 12, используемый только как приватный CA (не запускать на нём лишние сервисы).
- Неправ-root пользователь с sudo на обоих серверах.
- Клиентская машина (в примерах — Debian 12, но подойдут Windows/macOS/Android/iOS).
- Оба сервера обновлены:
$ sudo apt update && sudo apt upgradeПорядок действий (вкратце)
- Настроить CA-сервер и Easy-RSA, создать корневой сертификат.
- Установить OpenVPN и Easy-RSA на VPN-сервер.
- Создать CSR на VPN-сервере, подписать его на CA и вернуть сертификат.
- Сгенерировать tls-crypt ключ, DH/EC параметры, собрать сертификаты и ключи.
- Настроить /etc/openvpn/server/server.conf, sysctl, UFW.
- Создать клиентские ключи, собрать .ovpn, подключиться и протестировать.
- При необходимости — отзывать сертификаты и обновлять CRL.
Важные заметки
Важно: приватный ключ CA (ca.key) должен храниться только на CA-сервере и по возможности быть офлайн, когда не используется. Если он скомпрометирован, все выданные сертификаты потеряют доверие.
Шаг 1 — Развёртывание CA-сервера
CA (Certificate Authority) — это сущность, подписывающая сертификаты. В этом руководстве мы используем отдельный сервер как приватный CA. На нём будут выполняться операции создания и подписи запросов.
Шаг 1.1 — Установка Easy-RSA
Easy-RSA — набор скриптов для управления PKI.
$ sudo apt install easy-rsaШаг 1.2 — Создание директории PKI
$ mkdir ~/easy-rsa
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
$ chmod 700 /home//easy-rsa
$ cd ~/easy-rsa
$ ./easyrsa init-pki Ожидаемый вывод подскажет, где находится PKI: /home/
Шаг 1.3 — Создание корневого CA
Отредактируйте файл vars, чтобы задать параметры организации:
$ cd ~/easy-rsa
$ nano pki/varsНайдите и измените / раскомментируйте переменные, например:
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "NewYork"
set_var EASYRSA_REQ_CITY "New York City"
set_var EASYRSA_REQ_ORG "Howtoforge"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"Сохраните и выполните:
$ ./easyrsa build-caЕсли хотите CA без пароля (менее безопасно):
$ ./easyrsa build-ca nopassСгенерируются файлы:
- ~/easy-rsa/pki/ca.crt — публичный сертификат CA.
- ~/easy-rsa/pki/private/ca.key — приватный ключ CA (держите в секрете).
Шаг 2 — Установка OpenVPN и Easy-RSA на VPN-сервер
На OpenVPN-сервере установите пакеты и подготовьте папку easy-rsa:
$ sudo apt install openvpn easy-rsa
$ mkdir ~/easy-rsa
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
$ chmod 700 ~/easy-rsaШаг 3 — Создание PKI на VPN-сервере
Каждый сервер хранит свою PKI-структуру. Инициализируйте PKI на VPN-сервере и настройте алгоритмы:
$ cd ~/easy-rsa
$ ./easyrsa init-pki
$ nano pki/varsОтредактируйте только нужные параметры:
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"Использование ECC даёт меньше вычислений и хорошие характеристики для TLS.
Шаг 4 — Создание запроса на сертификат сервера (CSR)
На VPN-сервере создайте приватный ключ и CSR:
$ cd ~/easy-rsa
$ ./easyrsa gen-req server nopassФайлы будут в:
- req: /home/
/easy-rsa/pki/reqs/server.req - key: /home/
/easy-rsa/pki/private/server.key
Копируем ключ в /etc/openvpn/server:
$ sudo cp /home//easy-rsa/pki/private/server.key /etc/openvpn/server/ CSR нужно передать на CA для подписи.
Шаг 5 — Подпись CSR на CA-сервере
Скопируйте server.req на CA-сервер (scp или вручную). На CA-сервере импортируйте и подпишите запрос:
$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/server.req server
$ ./easyrsa sign-req server serverПодтвердите “yes” и введите пароль CA, если он есть. После подписи появится:
- /home/
/easy-rsa/pki/issued/server.crt
Скопируйте обратно на VPN-сервер и поместите в /etc/openvpn/server:
$ scp pki/issued/server.crt username@your_vpn_server_ip:/tmp
$ scp pki/ca.crt username@your_vpn_server_ip:/tmp
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/serverШаг 6 — Подготовка криптоматериалов сервера
Генерируем параметры обмена ключами и tls-crypt ключ:
$ cd ~/easy-rsa
$ ./easyrsa gen-dh
$ sudo openvpn --genkey secret ta.key
$ sudo cp ta.key /etc/openvpn/server
$ sudo cp pki/dh.pem /etc/openvpn/serverПримечание: при использовании ECC Easy-RSA может генерировать pki/dh.pem как параметры для обратной совместимости. Если вы используете explicit наборы DH — убедитесь в соответствии с настройкой сервера.
Шаг 7 — Генерация клиентского сертификата и ключа
На VPN-сервере подготовьте директорию для клиентских конфигураций:
$ mkdir -p ~/client-configs/keys
$ chmod -R 700 ~/client-configs
$ cd ~/easy-rsa
$ ./easyrsa gen-req client1 nopassСкопируйте client1.key в ~/client-configs/keys:
$ cp pki/private/client1.key ~/client-configs/keys/Перенесите client1.req на CA-сервер, импортируйте и подпишите как клиентский сертификат:
$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
$ ./easyrsa import-req /tmp/client1.req client1
$ ./easyrsa sign-req client client1Скопируйте обратно client1.crt на VPN-сервер и положите в ~/client-configs/keys вместе с ca.crt и ta.key:
$ scp pki/issued/client1.crt username@your_server_ip:/tmp
$ cp /tmp/client1.crt ~/client-configs/keys/
$ sudo cp ~/easy-rsa/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
$ sudo chown username.username ~/client-configs/keys/*Шаг 8 — Настройка OpenVPN сервера
Копируем пример конфигурации и редактируем её:
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
$ sudo nano /etc/openvpn/server/server.confКлючевые изменения (переведены на русский):
- Заменяем tls-auth на tls-crypt:
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key- Переключаем cipher на AEAD (AES-256-GCM) и добавляем auth:
;cipher AES-256-CBC
cipher AES-256-GCM
auth SHA256- Переходим на dh none при ECC:
;dh dh2048.pem
dh none- Демонизация процесса под непривилегированным пользователем:
user nobody
group nogroupПеренаправление всего трафика клиента через VPN
Раскомментируйте строку, чтобы клиент перенаправлял весь трафик через сервер:
push "redirect-gateway def1 bypass-dhcp"И укажите DNS-серверы, которые будут переданы клиенту (пример OpenDNS):
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"Смена порта и протокола (опционально)
Если хотите использовать TCP на 443 (часто помогает обходить блокировки):
# Optional!
port 443
proto tcp
;proto udp
explicit-exit-notify 0Указываем имена cert/key (если отличны от server)
cert server.crt
key server.keyСохраните файл.
Шаг 9 — Сетевая конфигурация сервера
Включаем форвардинг IPv4:
$ sudo nano /etc/sysctl.confДобавляем:
net.ipv4.ip_forward = 1Применяем:
$ sudo sysctl -pЭто позволит NAT’ить трафик клиентов через публичный IP сервера.
Шаг 10 — Настройка брандмауэра (UFW)
Найдите интерфейс, через который уходит публичный трафик:
$ ip route list defaultВы увидите строку вроде:
default via 69.28.90.1 dev ens3 onlinkИнтерфейс — ens3 в примере. Откройте /etc/ufw/before.rules и добавьте в начало NAT-правила:
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to ens3 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE
COMMIT
# END OPENVPN RULESЗамените ens3 на ваш интерфейс. Затем в /etc/default/ufw поменяйте:
DEFAULT_FORWARD_POLICY="ACCEPT"Откройте порт для OpenVPN и перезапустите UFW:
$ sudo ufw allow 443/tcp
$ sudo ufw disable
$ sudo ufw enableШаг 11 — Запуск OpenVPN
Запустите сервис и проверьте статус:
$ sudo systemctl start [email protected]
$ sudo systemctl status [email protected]
$ sudo systemctl -f enable [email protected]Ожидаем, что статус будет “Active: active (running)” и в логах появится “Initialization Sequence Completed”.
Шаг 12 — Создание клиентской конфигурации
Подготовим базовый клиентский конфиг и скрипт для сборки .ovpn:
$ mkdir -p ~/client-configs/files
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
$ nano ~/client-configs/base.confИзмените remote на IP вашего сервера и порт, поставьте proto tcp (если вы так настроили сервер). Закомментируйте ca/cert/key в файле и добавьте:
cipher AES-256-GCM
auth SHA256
key-direction 1Создайте скрипт make_config.sh в ~/client-configs:
#!/bin/bash
# First argument: Client identifier
KEY_DIR=/home//client-configs/keys
OUTPUT_DIR=/home//client-configs/files
BASE_CONFIG=/home//client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '') \
${KEY_DIR}/ca.crt \
<(echo -e ' \n') \
${KEY_DIR}/${1}.crt \
<(echo -e ' \n') \
${KEY_DIR}/${1}.key \
<(echo -e ' \n') \
${KEY_DIR}/ta.key \
<(echo -e ' ') \
> ${OUTPUT_DIR}/${1}.ovpn Сделайте скрипт исполняемым:
$ chmod 700 ~/client-configs/make_config.sh
$ cd ~/client-configs
$ ./make_config.sh client1
$ ls ~/client-configs/files
client1.ovpnСкопируйте client1.ovpn на клиент.
Шаг 13 — Установка клиента и проверка подключения
На клиенте (в примере Debian 12) установите OpenVPN:
$ sudo apt install openvpnСкачайте client1.ovpn с сервера:
$ scp username@your_server_ip:/home//client-configs/files/client1.ovpn Проверьте механизм резолвинга DNS (systemd-resolved или update-resolv-conf) и отредактируйте client1.ovpn в соответствии с вашим окружением.
Для клиентов с systemd-resolved
$ sudo apt install openvpn-systemd-resolved
$ nano client1.ovpnРаскомментируйте:
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .Для клиентов с update-resolv-conf
Если в /etc/openvpn есть update-resolv-conf — раскомментируйте соответствующие строки в client1.ovpn.
Подключение клиента
$ sudo openvpn --config client1.ovpnИли в фоне:
$ sudo openvpn --config client1.ovpn --daemonПроверьте внешний IP на https://whatismyip.com — он должен показывать IP сервера OpenVPN.

Проверьте DNS-утечки на https://www.dnsleaktest.com/ — результаты должны показывать DNS-серверы, которые вы передаёте клиенту.

Чтобы завершить фоновой процесс OpenVPN, найдите PID и убейте процесс:
$ ps aux | grep openvpn
$ sudo kill -9 Шаг 14 — Отзыв сертификатов
Если нужно отозвать клиентский сертификат:
На CA-сервере:
$ cd ~/easy-rsa
$ ./easyrsa revoke client1
$ ./easyrsa gen-crlСкопируйте pki/crl.pem на OpenVPN-сервер и поместите в /etc/openvpn/server:
$ sudo cp /tmp/crl.pem /etc/openvpn/server/Добавьте в /etc/openvpn/server/server.conf:
crl-verify crl.pemПерезапустите OpenVPN:
sudo systemctl restart [email protected]Дополнительные рекомендации и практические материалы
Ниже — набор практических материалов, чек-листов, сценариев и процедур, которые помогут безопасно управлять OpenVPN-инфраструктурой.
Контроль безопасности — чек-лист для администратора
- Храните ~/easy-rsa/pki/private/ca.key только на CA-сервере и с правильными правами (chmod 600).
- Регулярно обновляйте пакеты OS и OpenVPN.
- Используйте tls-crypt для защиты управления TLS.
- Используйте AEAD шифры (AES-256-GCM) с проверкой HMAC (auth SHA256).
- Включите crl-verify и храните crl.pem в /etc/openvpn/server.
- Ограничьте доступ к /etc/openvpn/server файловыми правами.
- Логи OpenVPN храните и ротацируйте через systemd/journald или лог-файлы.
Чек-лист ролей (быстрая проверка)
Оператор CA:
- Создал CA и защитил ca.key.
- Подписал server/client CSR.
- Сгенерировал CRL после отзыва.
Администратор VPN-сервера:
- Установил и настроил openvpn и easy-rsa.
- Настроил UFW и NAT.
- Разместил ca.crt, server.crt, server.key, ta.key, crl.pem.
- Включил systemctl enable и протестировал подключение.
Клиент:
- Получил client1.ovpn и импортировал в клиент.
- Проверил внешний IP и DNS-утечки.
Руководство по устранению неполадок (runbook)
Клиент не подключается, таймаут TCP/UDP:
- Проверьте доступность порта с сервера: telnet your_server_ip 443 (или nc).
- Проверьте, что UFW разрешает порт: sudo ufw status verbose.
- Убедитесь, что OpenVPN слушает: sudo ss -ltnp | grep openvpn.
TLS: VERIFY ERROR или “certificate has expired”:
- Проверьте дату истечения server.crt и client.crt (openssl x509 -in server.crt -noout -text).
- Проверьте, что ca.crt совпадает на обеих сторонах.
DNS утечки или ошибки резолвинга:
- Убедитесь, что на клиенте корректно применён update-systemd-resolved или update-resolv-conf.
- Проверьте push “dhcp-option DNS …” в server.conf и что клиент их принял (в логах PUSH_REPLY).
Трафик не проходит через сервер (нет NAT):
- Проверьте net.ipv4.ip_forward = 1.
- Убедитесь, что правило MASQUERADE в /etc/ufw/before.rules соответствует интерфейсу.
- Проверьте iptables -t nat -L -n -v.
Клиент подключается, но нет доступа к ресурсам внутри сети сервера:
- Проверьте маршрут на клиенте (ip route).
- Проверьте, что push routes отправляются сервером.
- Убедитесь, что на сервере нет дополнительных правил UFW блокирующих FORWARD.
Критерии приёмки
- OpenVPN-сервис активно запущен и слушает на выбранном порту.
- Клиент успешно устанавливает TLS-соединение и получает push-параметры (redirect-gateway и DNS).
- Тесты на https://whatismyip.com и https://dnsleaktest.com показывают IP/ресурсы сервера.
- CRL корректно применяется при отзыве сертификата; отозванный клиент не может подключиться.
Альтернативы и когда OpenVPN не подходит
- WireGuard: проще по конфигурации, быстрее и легче в поддержке, но использует другую модель ключей (без PKI) и может быть менее контролируемым в крупных CA-сценариях.
- IPsec (strongSwan): стандарт для туннелей на уровне сети, подходит для site-to-site решений с аппаратной поддержкой.
- SSH-туннелирование: быстро и просто для редких задач, но не заменит полноценный VPN с маршрутами и DNS-пушем.
Когда не использовать OpenVPN:
- Нужна предельно простая конфигурация и очень высокая производительность для сотен тысяч сессий — рассмотрите WireGuard.
- Требуется аппаратная совместимость с IPsec — выберите strongSwan/Libreswan.
Модель принятия решений (коротко)
- Если вам нужен контроль через CA, централизованная подпись сертификатов и поддержка широкого спектра клиентов — OpenVPN.
- Если нужна максимальная простота, минимальный код и производительность — WireGuard.
Безопасность и GDPR / конфиденциальность
- Храните минимальную информацию о клиентах и журналируйте только то, что необходимо.
- Если вы обрабатываете персональные данные EU граждан, документируйте правовую основу обработки, срок хранения логов и меры защиты (шифрование хранения, доступ по RBAC).
- Регулярно обновляйте CRL/OCSP (если используете OCSP) при отзыве сертификатов.
Короткое цитирование эксперта
“Правильно настроенный TLS VPN с отдельным CA значительно повышает контроль и безопасность удалённого доступа, но требует строгой политики хранения приватных ключей и процедур отзыва.” — эксперт по сетевой безопасности.
Мини-методология управления ключами
- Генерация CA и хранение ca.key офлайн.
- Генерация CSR на нужном хосте (сервер/клиент).
- Подпись CSR на CA, передача обратно подписанного .crt.
- Установка crl.pem на сервер и регулярное обновление при отзывах.
Шаблон действий при отзыве клиента
- На CA: ./easyrsa revoke
- На CA: ./easyrsa gen-crl
- Передать pki/crl.pem на OpenVPN-сервер и поместить в /etc/openvpn/server/
- Перезапустить OpenVPN: sudo systemctl restart [email protected]
- Проверить логи на предмет попыток подключения отозванного клиента.
Короткая галерея крайних случаев
- Если потерян private key клиента, просто отозвать сертификат и сгенерировать новые ключи.
- Если скомпрометирован ca.key — восстановление требует создания новой CA и перевыпуска всех сертификатов.
Заключение
Мы прошли полный путь: от развёртывания приватного CA, генерации и подписи сертификатов, настройки OpenVPN и брандмауэра до создания клиентского .ovpn и тестирования подключения. В приложенных секциях вы найдете чек-листы, runbook и рекомендации по безопасности, которые помогут поддерживать инфраструктуру в рабочем и защищённом состоянии.
Если остались вопросы по конкретным ошибкам или вы хотите пример конфигурации для нескольких клиентов/серверов — опишите ваш сценарий, и мы поможем шаг за шагом.
Краткое анонс-сообщение (для рассылки, ~120 слов):
Настроили OpenVPN на Debian 12 с приватным CA и подробным плейбуком: генерация ключей через Easy-RSA, tls-crypt для защиты канала управления, защита UFW и NAT, сборка клиентских .ovpn и процедура отзыва сертификатов через CRL. Документ включает чек-листы ролей, runbook по устранению неполадок и рекомендации по безопасности и GDPR. Подходит для небольших команд и частных VPS. Пришлите ваш сценарий (количество клиентов, требуемые сервисы внутри сети), и мы адаптируем конфигурацию.
Похожие материалы
PUBG падает в Windows 11 — как исправить
Исправить ошибку «Oops! Something went wrong» в YouTube
Экран входа macOS — настройки и советы
Удалить историю Google Bard и отключить её
TinyLetter для блогеров: быстро и просто