Гид по технологиям

Установка и настройка OpenVPN на Ubuntu 22.04 — пошаговое руководство

9 min read Сеть Обновлено 27 Nov 2025
OpenVPN на Ubuntu 22.04: установка и настройка
OpenVPN на Ubuntu 22.04: установка и настройка

Это пошаговое руководство показывает, как установить и настроить OpenVPN на Ubuntu 22.04: создать изолированный CA, выпустить и подписать сертификаты, настроить сервер и клиента, включить проброс трафика и защитить инфраструктуру. Содержит чек-листы, сценарии отказа и рекомендации по безопасности.

Иллюстрация архитектуры OpenVPN: клиент, сервер и отдельный CA

Виртуальная частная сеть (VPN) позволяет скрыть местоположение, безопасно выходить в интернет в ненадёжных сетях и обходить гео-ограничения и цензуру. OpenVPN — открытое TLS-решение для организации VPN.

В этом руководстве мы установим OpenVPN на сервер с Ubuntu 22.04, настроим отдельный сервер как приватный центр сертификации (CA), подпишем сертификаты сервера и клиента, настроим проброс всего трафика через VPN и приведём проверенные практики безопасности и эксплуатации.

Краткие определения

  • CA: центр сертификации — сервер, который выпускает и подписывает сертификаты.
  • PKI: инфраструктура публичных ключей — набор ключей/сертификатов и сопутствующих файлов.
  • CSR: запрос на подпись сертификата (Certificate Signing Request).
  • ta.key / tls-crypt: пред-расшаренный ключ для защиты TLS-канала OpenVPN.

Требования

  • Сервер с Ubuntu 22.04 для OpenVPN (с поддержкой IPv4 и IPv6). На нём включён и запущен UFW.
  • Отдельный сервер с Ubuntu 22.04, выделенный как CA (не запускать на нём другие сетевые сервисы по возможности).
  • Нератизированный пользователь с sudo на обоих серверах.
  • Клиентская машина (мы используем Ubuntu 22.04 как пример клиента). OpenVPN поддерживает Windows, macOS, Android и iOS.
  • Обновлённые пакеты на обоих серверах:
$ sudo apt update && sudo apt upgrade

Важно: держите закрытый ключ CA (ca.key) только на CA-сервере, по возможности — офлайн, когда он не используется.

Шаг 1 — Подготовка CA-сервера

CA (Certification Authority) отвечает за выпуск и отзыв сертификатов. В этом руководстве CA — отдельный сервер, используемый только для задач PKI: генерации, подписи и отзыва сертификатов.

Установка Easy-RSA

Easy-RSA — набор скриптов для управления CA и генерации ключей.

$ sudo apt install easy-rsa

Создание директории 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//easy-rsa/pki.

Создание корневого сертификата CA

Создайте файл vars и задайте значения организации (локальные значения можно изменить):

$ cd ~/easy-rsa
$ nano vars

Поместите в 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 (распространяется на сервер VPN и клиентам).
  • ~/easy-rsa/pki/private/ca.key — приватный ключ CA (держите только на CA-сервере).

Важно: компрометация ca.key означает необходимость аннулирования всей PKI и выпуска новых сертификатов.

Шаг 2 — Установка OpenVPN и Easy-RSA на сервере OpenVPN

На сервере OpenVPN установите пакеты:

$ sudo apt install openvpn easy-rsa
$ mkdir ~/easy-rsa
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
$ chmod 700 ~/easy-rsa

Шаг 3 — Создание PKI на сервере OpenVPN

Даже если PKI уже создан на CA-сервере, на сервере OpenVPN нужно инициализировать собственный каталог PKI для хранения локальных ключей/запросов:

$ cd ~/easy-rsa
$ nano vars

Добавьте минимум:

set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"

И выполните:

$ ./easyrsa init-pki

Этот каталог будет содержать приватный ключ сервера и CSR, которые вы перешлёте в CA для подписи.

Шаг 4 — Генерация запроса сервера и приватного ключа

На OpenVPN-сервере создайте CSR и приватный ключ (пример CN = server):

$ cd ~/easy-rsa
$ ./easyrsa gen-req server nopass

В результате появятся:

  • req: ~/easy-rsa/pki/reqs/server.req
  • key: ~/easy-rsa/pki/private/server.key

Скопируйте закрытый ключ в каталог OpenVPN:

$ sudo cp /home//easy-rsa/pki/private/server.key /etc/openvpn/server/

CSR (server.req) нужно отправить на CA для подписи.

Шаг 5 — Подписание CSR на CA и возврат сертификатов

Скопируйте CSR на CA-сервер (scp или вручную):

$ scp /home/username/easy-rsa/pki/reqs/server.req username@your_ca_server_ip:/tmp

На CA-сервере импортируйте и подпишите:

$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/server.req server
$ ./easyrsa sign-req server server

Подтвердите подпись и введите пароль CA. Результат: ~/easy-rsa/pki/issued/server.crt.

Скопируйте server.crt и ca.crt обратно на OpenVPN-сервер:

$ 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 (ta.key), который защищает TLS-канал от неаутентифицированного трафика и затрудняет обнаружение OpenVPN-трафика:

$ cd ~/easy-rsa
$ openvpn --genkey secret ta.key
$ sudo cp ta.key /etc/openvpn/server

Шаг 7 — Генерация клиентских сертификатов и ключей

Создайте директорию для клиентских конфигураций:

$ mkdir -p ~/client-configs/keys
$ chmod -R 700 ~/client-configs
$ cd ~/easy-rsa
$ ./easyrsa gen-req client1 nopass

Скопируйте приватный ключ клиента в ~/client-configs/keys:

$ cp pki/private/client1.key ~/client-configs/keys/

Отправьте client1.req на CA, подпишите её как клиентский сертификат и верните client1.crt:

$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
# на CA
$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/client1.req client1
$ ./easyrsa sign-req client client1
# затем вернуть client1.crt на OpenVPN сервер и поместить в ~/client-configs/keys/

Также скопируйте ca.crt и ta.key в ~/client-configs/keys и установите владельца на файлы:

$ 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
  • Используйте AEAD-шифр и HMAC:
;cipher AES-256-CBC
cipher AES-256-GCM

auth SHA256
  • Отключите Diffie-Hellman для ECC:
;dh dh2048.pem
dh none
  • Запустите процесс под непривилегированным пользователем:
user nobody
group nogroup
  • Перенаправление всего трафика клиента через VPN (push):
push "redirect-gateway def1 bypass-dhcp"
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
  • Укажите файлы сертификатов и ключей (по умолчанию server — корректно):
cert server.crt
key server.key

Сохраните файл.

Важно: изменения в криптографии и протоколе влияют на совместимость клиентов — обновите клиентские конфиги соответствующе.

Шаг 9 — Настройка сетевой маршрутизации (ip_forward)

Разрешите проброс IPv4-трафика на сервере:

$ sudo nano /etc/sysctl.conf
# Добавьте в конец
net.ipv4.ip_forward = 1
$ sudo sysctl -p

Это позволяет серверу выполнять NAT и передавать трафик клиентов в интернет.

Шаг 10 — Настройка UFW и правил NAT

Найдите сетевой интерфейс по умолчанию:

$ ip route list default
# например: default via 64.225.64.1 dev eth0 proto static

Отредактируйте /etc/ufw/before.rules и добавьте NAT-правила в начало файла (замените eth0 на ваш интерфейс):

# START OPENVPN RULES
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES

Разрешите форвард пакетов по умолчанию, отредактировав /etc/default/ufw:

DEFAULT_FORWARD_POLICY="ACCEPT"

Откройте порт 443/tcp в UFW:

$ sudo ufw allow 443/tcp
$ sudo ufw disable
$ sudo ufw enable

Примечание: если вы используете другой порт, откройте соответствующий порт/протокол.

Шаг 11 — Запуск OpenVPN сервиса

Включите сервис в автозапуск и запустите его:

$ sudo systemctl -f enable [email protected]
$ sudo systemctl start [email protected]
$ sudo systemctl status [email protected]

Проверяйте вывод журнала: служба должна перейти в состояние 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, proto, user/group, ciphers, auth, закомментируйте директивы ca/cert/key и tls-auth, потому что мы их вставим внутрь .ovpn.

Добавьте key-direction 1 и при необходимости строки для управления DNS (update-systemd-resolved или update-resolv-conf).

Скрипт сборки make_config.sh:

#!/bin/bash
 
# First argument: Client identifier
 
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/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 — готовый конфиг для импорта в OpenVPN клиент.

Шаг 13 — Установка и тестирование клиента

Пример: клиент на Ubuntu 22.04.

$ sudo apt install openvpn
$ cat /etc/resolv.conf

Если система использует systemd-resolved (в /etc/resolv.conf есть 127.0.0.53), установите пакет openvpn-systemd-resolved для корректной настройки DNS:

$ sudo apt install openvpn-systemd-resolved

Отредактируйте client1.ovpn, раскомментируйте строки для update-systemd-resolved:

script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .

Или при использовании resolvconf — раскомментируйте update-resolv-conf.

Подключение:

$ sudo openvpn --config client1.ovpn

Вы должны увидеть сообщения о TLS-рукопожатии, PUSH_REPLY и создание tun-интерфейса. Для фонового режима:

sudo openvpn --config client1.ovpn --daemon

Чтобы остановить фоновый процесс, найдите PID и завершите его:

$ ps aux | grep openvpn
$ sudo kill -9 

Проверка DNS и IP: посетите https://whatismyip.com или https://www.dnsleaktest.com/.

Вывод сайта WhatIsMyIP с IP и местоположением сервера

Стандартный тест на утечку DNS, отображающий OpenDNS-серверы

Шаг 14 — Отзыв сертификатов (CRL)

Если нужно отозвать доступ клиента:

На CA-сервере:

$ cd ~/easy-rsa
$ ./easyrsa revoke client1
$ ./easyrsa gen-crl

Получите pki/crl.pem и скопируйте на OpenVPN-сервер:

$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
$ sudo cp /tmp/crl.pem /etc/openvpn/server/

В server.conf добавьте:

crl-verify crl.pem

Перезапустите OpenVPN:

sudo systemctl restart [email protected]

После этого отозванный клиент не сможет подключиться.

Критерии приёмки

  • Сервис OpenVPN активен и возвращает “Initialization Sequence Completed”.
  • Клиент получает IP из пула (например 10.8.x.x) и видно правило маршрутизации 0.0.0.0/1 и 128.0.0.0/1.
  • DNS на клиенте настроены на OpenDNS (208.67.222.222 / 208.67.220.220) или на выбранные вами резолверы.
  • При отзыве сертификата через CRL — соответствующий клиент не подключается.
  • Логи не содержат ошибок TLS и ошибок прав доступа.

Чек-листы по ролям

Администратор CA

  • Держите CA-сервер изолированным от общедоступных сервисов.
  • Храните ca.key офлайн, делайте резервную копию только в безопасном хранилище.
  • Регулярно проверяйте и обновляйте политику выпуска/отзыва сертификатов.

Администратор сервера OpenVPN

  • Убедитесь, что ip_forward включён.
  • Настройте UFW/iptables с MASQUERADE правилом.
  • Ограничьте доступ по порту/протоколу (используйте firewall и fail2ban, если нужно).
  • Внедрите мониторинг и алерты на падение сервиса.

Пользователь клиента

  • Всегда импортируйте .ovpn из доверенного источника.
  • Храните приватный ключ клиента в безопасном месте, с правами 600.
  • При компрометации — сообщите администратору и попросите отозвать сертификат.

Тесты и критерии приёмки (миксы)

  • Проверка маршрутов: ip route — присутствует 0.0.0.0/1 и 128.0.0.0/1.
  • Проверка DNS: systemd-resolve --status tun0 (если systemd-resolved) — DNS сервера из push.
  • Тест утечки DNS: выполните запросы к известным сервисам и сравните IP.
  • Проверка CRL: отозовите тестовый сертификат и попытайтесь подключиться.

Технические рекомендации и варианты

Когда этот подход подходит:

  • Необходим защищённый удалённый доступ и маршрутизация трафика через сервер.
  • Требуется централизованное управление сертификатами и возможность отзыва.

Когда это не лучший выбор / альтернативы:

  • Для простой защиты отдельных сервисов может быть достаточно SSH-туннелей.
  • Если нужна масштабируемость для тысяч клиентов — рассмотрите коммерческие решения с автоматическим управлением сертификатами (например, какие-то решения на базе PKI/PKCS#11).
  • WireGuard может предложить более простую конфигурацию и лучшую пропускную способность для статичных сценариев.

Модель зрелости PKI (кратко)

  • Уровень 1 — базовый: один CA, ключи на CA-сервере, отсутствие автоматизации.
  • Уровень 2 — надёжность: оффлайн-CA, оффлайн-хранение ca.key, регулярные бэкапы.
  • Уровень 3 — производство: автоматизация подписей, интеграция с HSM/TPM, централизованное логирование и ротация.

Меры безопасности (жёсткая версия)

  • Храните ca.key только на CA-сервере, по возможности физически изолированном.
  • Используйте сильные парольные фразы или HSM для CA.
  • Регулярно генерируйте и публикуйте CRL при каждом отзыве.
  • Отключите лишние сервисы на CA-сервере.
  • Используйте TLS шифрование AEAD (AES-256-GCM), auth SHA256 и tls-crypt.
  • Включите строгие права на файлы: 600 для приватных ключей.
  • Рассмотрите внедрение fail2ban для защиты SSH и порта OpenVPN (TCP 443) от переборов.

Частые ошибки и устранение (runbook)

  1. Клиент не подключается — ошибка VERIFY FAILED
  • Причина: несовпадение ca.crt или подписи. Проверьте, что клиент использует тот же ca.crt, что и сервер.
  1. Нет проброса трафика через сервер
  • Проверьте sysctl net.ipv4.ip_forward и /proc/sys/net/ipv4/ip_forward.
  • Убедитесь, что правило MASQUERADE добавлено в /etc/ufw/before.rules и интерфейс указан верно.
  1. DNS не изменился
  • Убедитесь, что клиент применил push-опции DNS (проверьте systemd-resolve --status tun0 или resolv.conf).
  • Для systemd-resolved установите openvpn-systemd-resolved и раскомментируйте соответствующие строки.
  1. Клиент подключается, но нет интернета
  • Проверьте правила NAT, маршрут по умолчанию на сервере, и конфликт с локальными маршрутами клиента.
  1. После изменения server.conf служба не стартует
  • Проверяйте синтаксис и логи: journalctl -u [email protected] -e.

Решение проблем при миграции и совместимость версий

  • При переходе на ECC/AEAD убедитесь, что клиенты поддерживают OpenVPN версии 2.5+.
  • Если у вас старые клиенты, используйте совместимые cipher/auth или планируйте обновление клиентов.
  • При переносе CA: экспортируйте ca.crt и ca.key (только если надёжно храните), но лучше не переносить ca.key на общие машины.

Небольшая диаграмма принятия решений (Mermaid)

flowchart TD
    A[Выбор протокола] --> B{Нужна маскировка под HTTPS?}
    B -- Да --> C[Использовать TCP порт 443]
    B -- Нет --> D[Использовать UDP порт 1194]
    C --> E[Увеличенная нагрузка на CPU, но вероятность обхода блокировок выше]
    D --> F[Лучшее время отклика и производительность]

Глоссарий (1 строка на термин)

  • CA — сервер/служба, подписывающая сертификаты.
  • CSR — запрос на подпись сертификата.
  • CRL — список отозванных сертификатов.
  • PKI — инфраструктура публичных ключей.
  • ta.key/tls-crypt — пред-расшаренный ключ для защиты TLS-канала OpenVPN.

Советы по обслуживанию и TCO/ROI (качественно)

  • Поддержка собственной PKI требует операций по выпуску/отзыву, резервированию, хранению ключей — это накладные расходы по времени и безопасности.
  • Альтернатива — использовать централизованные решения с управлением сертификатами (упрощение, но дополнительные затраты на сервис).

Краткое объявление (100–200 слов)

В этом руководстве показаны шаги по установке и безопасной конфигурации OpenVPN на Ubuntu 22.04 с использованием отдельного сервера CA. Вы научитесь создавать PKI, подписывать серверные и клиентские сертификаты, настраивать tls-crypt, проброс трафика и правила NAT через UFW. Включены практические советы по безопасности, чек-листы для разных ролей, runbook для отказов и рекомендации по миграции. Руководство подходит для небольших и средних инфраструктур, где важен контроль над сертификатами и возможность гибкой настройки протоколов и шифров.

Социальная предпросмотрка

OG title: OpenVPN на Ubuntu 22.04 — установка и настройка OG description: Полное руководство по развёртыванию OpenVPN с отдельным CA, выпуском сертификатов, настройкой NAT и рекомендациями по безопасности.

Заключение

Вы прошли полный цикл: от создания CA и PKI до генерации клиентских конфигураций и проверки подключения. Внедрите предложенные меры безопасности, следите за CRL и логами, а также регулярно тестируйте процедуру отзыва сертификатов. Если остались вопросы — задавайте конкретные сценарии и мы поможем с отладкой.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро