К контенту
habrforever
СКРЫТА #openvpn ≈2015 · ~9 мин чтения

Развертывание собственного OpenVPN — актуализация 2026

автор оригинала: Igor Balezin (bigov)

оригинал на Хабре habr.com/…/267841
снимок Wayback web.archive.org
статус на Хабре (ноябрь 2026) скрыта (403/451)
права © автор, переиздание в архивных целях с указанием источника

Развертывание собственного OpenVPN

Архивное переиздание с актуализацией. Оригинал опубликован на Habr (≈2015), автор — Igor Balezin (bigov). оригинал скрыт на Habr (HTTP 403/451), доступен только через Wayback Machine Снимок: Wayback Machine. Ниже — редакция ноября 2026: что работает сейчас, что изменилось и как правильно повторить рецепт сегодня. Полный текст оригинала — в конце, без купюр.

TL;DR — версия 2026

OpenVPN для обхода блокировок в 2026 не годится — сигнатуры известны DPI. Но как корпоративный remote-access за TLS-фронтендом или на порту 443/tcp он жив и поддерживается.

Оригинал был написан, когда OpenVPN был синонимом слова «VPN». В 2026 у него узкая, но честная роль: корпоративный доступ, там, где обфускация не нужна, а нужна зрелость — PKI, MFA, аудиты, клиент под каждую платформу. Для обхода цензуры он проигрывает по всем пунктам: ТСПУ (DPI-боксы) стоят у всех крупных российских провайдеров и умеют резать VPN-хендшейки WireGuard, OpenVPN и «голый» Shadowsocks, а классический OpenVPN-хендшейк — первый в их списке: Египет, Иран, Китай и РФ режут его годами. фактическим стандартом антицензурного туннелирования в 2026 стал VLESS + REALITY (Xray-core): он маскируется под обычный HTTPS-трафик к крупному сайту и не требует собственного домена и сертификата.

Статус оригинала

Что менять срочно

  • UDP/1194 → TCP/443 за nginx/stunnel, либо shared secret в cloaking;
  • tls-auth → tls-crypt (метаданные рукопожатия больше не видны);
  • директивы cipher в старых конфигах игнорируются OpenVPN 2.6+ — всё задаётся data-ciphers;
  • добавьте MFA (pam + TOTP или Keycloak), парольные фразы сертификатов в 2026 не защита;
  • Docker-сети из «админ удаленку облегчал»-статей — проверяйте --cap-add NET_ADMIN и подсеть не конфликтует с k8s CNI.

Куда мигрировать, если задача — антицензура

Простая табличка 2026: обфусцированный туннель = AmneziaWG; маскировка под HTTPS = VLESS+REALITY; корпоративный remote access = OpenVPN/TLS или Headscale/Tailscale поверх WG; мобильные сотрудники = AmneziaVPN self-hosted. Оригинальные shell-скрипты «openvpn-do-安装» в 2026 почти все мертвы — авторы их удалили вместе со статьями.

Что оставить из оригинального гайда

Всё про PKI честно и сейчас: корневой CA, сертификаты сервера/клиента, CRL — та же связка easy-rsa 3, что и в статье. tls-crypt вместо tls-auth (скрывает сам факт OpenVPN на порту), data-ciphers AES-256-GCM:CHACHA20-POLY1305, топология subnet, push "block-outside-dns" для Windows-клиентов — базовый скелет 2026 тот же.

Иллюстрации из оригинала

Иллюстрация из оригинала статьи Иллюстрация из оригинала статьи Иллюстрация из оригинала статьи Иллюстрация из оригинала статьи

Что изменилось с ≈2015 года

  • OpenVPN 2.6/2.7: data-ciphers, tls-crypt по умолчанию ожидаемо, поддержка DCO (ускорение в ядре)
  • EasyRSA 3.2, /etc/openvpn/easy-rsa переехал — пути из старых статей не совпадают
  • провайдеры VPS массово закрывают 1194/udp для новых аккаунтов
  • старые клиенты OpenVPN Connect не понимают современные конфиги без обновления
  • в тексте оригинала: классический OpenVPN легко детектится DPI (используется в корпсредах, но не для обхода блокировок)

Чек-лист 2026

  • TCP/443 + tls-crypt
  • data-ciphers без устаревших CBC
  • MFA на подключение
  • CRL и автоматический отзыв
  • логи — минимум, и не в РФ-юрисдикцию

Вердикт

Если вы читаете это, чтобы «настроить VPN как в статье» — не надо: берите WireGuard/AWG или VLESS. Если вы админ и вам нужен remote-access с PKI и аудитом — оригинальная статья после микро-правок выше всё ещё рабочий документ.


ОРИГИНАЛ СТАТЬИ (без изменений)

Инструкция описывает процесс установки и настройки серверной и клиентской частей OpenVPN. Решение предназначено для подключения удаленных клиентов к сети предприятия. После подключения у клиента сохраняется собственный шлюз по-молчанию и не блокируется выход в интернет. Решение показало простоту в настройке клиентской части, было опробовано (и используется в настоящее время) на Windows-XP, Windows-7, Andriod 3.x, Archlinux, Ububnu. Есть информация об успешном подключении и iPad.

[]

[]Установка OpenVPN сервера (FreeBSD).

Устанавливаем пакет из портов. Опции можно оставить по умолчанию. Главное, не отключайте ‘easy-rsa’, так как он потребуется для настройки и генерации сертификатов:

# cd /usr/ports/security/openvpn
# make configure-recursiv install clean

Или:

# make configure-recursiv install clean -С /usr/ports/security/openvpn

Создаем каталоги для конфигов:

 # mkdir /usr/local/etc/openvpn/
 # mkdir /usr/local/etc/openvpn/ccd

Копируем каталог easy-rsa в каталог конфигов OpenVPN:

 # cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/

Переходим в скопированный каталог:

 # cd /usr/local/etc/openvpn/easy-rsa/

Переходим в оболочку sh:

 # sh

Выполняем команду для генерации собственного сертификата:

 # . ./vars
 # ./clean-all
 # ./build-ca

Данные для сертификата заполните в соотвествии с вопросами.

 # ./build-key-server vpn0.example.com

‘Common name’ должно соответствовать DNS имени вашего VPN-сервера, например: ‘vpn0.example.com’. На последние вопросы отвечаем ‘Y’.

 # ./build-dh

Теперь делаем сертификат для клиента с именем ‘client’. Тут также на последние вопросы отвечаем ‘Y’

 # ./build-key client

Выходим из sh оболочки:

 # exit

Cоздаем ключ для tls-аутификации:

 # /usr/local/sbin/openvpn --genkey --secret /usr/local/etc/openvpn/easy-rsa/keys/ta.key

Создаем файл server.conf (ниже под спойлером). Не забудьте в нем указать адрес внутреннего DNS-сервера, которых знает имена ваших локальных хостов.

/usr/local/etc/openvpn/server.conf

 # cat /usr/local/etc/openvpn/server.conf
 local vpn0.example.com
 port 1194
 proto udp
 dev tun
 ca /usr/local/etc/openvpn/easy-rsa/keys/ca.crt
 cert /usr/local/etc/openvpn/easy-rsa/keys/vpn0.example.com.crt
 key /usr/local/etc/openvpn/easy-rsa/keys/vpn0.example.com.key
 dh /usr/local/etc/openvpn/easy-rsa/keys/dh1024.pem
 tls-server
 tls-auth /usr/local/etc/openvpn/easy-rsa/keys/ta.key 0
 server 172.17.0.0 255.255.255.0
 ifconfig-pool-persist ipp.txt
 client-config-dir ccd
 push "route 10.10.210.72 255.255.255.248"
 push "route 172.27.102.0 255.255.255.0"
 push "route 172.27.103.0 255.255.255.0"
 push "route 172.27.105.0 255.255.255.0"
 push "dhcp-option DNS 192.168.100.1"
 keepalive 10 120
 comp-lzo
 user nobody
 group nobody
 persist-key
 persist-tun
 status openvpn-status.log
 verb 3

Для каждого клиента надо будет создавать на сервере файл-конфиг пользователя, где указывается назначаемый клиенту IP адрес и шлюз. Например, для клиента с именем ‘client’:

 # cat /usr/local/etc/openvpn/ccd/client
 ifconfig-push 172.17.0.2 172.17.0.1

Для запуска даймона OpenVPN при загрузке операционной системы добавим в ‘/etc/rc.conf’ строки:

 openvpn_enable="YES"
 openvpn_if="tun"
 openvpn_configfile="/usr/local/etc/openvpn/server.conf"
 openvpn_dir="/usr/local/etc/openvpn"

Запуск сервиса:

 # /usr/local/etc/rc.d/openvpn start
 Starting openvpn.
 add net 172.17.0.0: gateway 172.17.0.2

Если стоит задача предоставлять пользователям через OpenVPN Интернет, то потребуется наличие NAT. Можно включить его поддержку через загружаемые модули, для этого в файл ‘/boot/loader.conf’ надо добавить строки:

ipfw_nat_load="YES"
libalias_load="YES"

Пример настройки NAT IPFW:

${ipfw} nat 1 config if re0 reset same_ports
${ipfw} add nat 1 ip from 172.17.0.0/24 to any via $INT_if
${ipfw} add nat 1 ip from any to $EXT_ip
${ipfw} add allow all from any to any

Все, сервер OpenVPN установлен, настроен и запущен. Теперь можно заняться клиентами.

[]Создание клиентского сертификата OpenVPN

Описание приведено для сервера на операционной системе FreeBSD с установленным и настроеным, как описано выше, сервисом OpenVPN.

Сертификат генерируется из системной консоли сервера с правами суперпользователя из каталога easy-rsa:

cd /usr/local/etc/openvpn/easy-rsa/

 $ cd /usr/local/etc/openvpn/easy-rsa/
 $ sudo /bin/sh
 # . ./vars
 NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/local/etc/openvpn/easy-rsa/keys
 # ./build-key ЛОГИН_ПОЛЬЗОВАТЕЛЯ
 Generating a 1024 bit RSA private key
 ......++++++
 ....++++++
 writing new private key to 'ЛОГИН_ПОЛЬЗОВАТЕЛЯ.key'
 -----
 You are about to be asked to enter information that will be incorporated
 into your certificate request.
 What you are about to enter is what is called a Distinguished Name or a DN.
 There are quite a few fields but you can leave some blank
 For some fields there will be a default value,
 If you enter '.', the field will be left blank.
 -----
 Country Name (2 letter source) [US]:RU
 State or Province Name (full name) [CA]:ZC
 Locality Name (eg, city) [SanFrancisco]:Zabubensk
 Organization Name (eg, company) [Fort-Funston]:JSC Zabuba
 Organizational Unit Name (eg, section) [changeme]:ITD
 Common Name (eg, your name or your server's hostname) [ЛОГИН_ПОЛЬЗОВАТЕЛЯ]:
 !----------------------------------------------------------------------!
 ! ВНИМАНИЕ ! использовать только латинские буквы. Кирилица не работает !
 !----------------------------------------------------------------------!
 Name [changeme]:ИМЯ ФАМИЛИЯ
 Email Address [mail@host.domain]:ЛОГИН_ПОЛЬЗОВАТЕЛЯ@zabubensk.example.com

 Please enter the following 'extra' attributes
 to be sent with your certificate request
 A challenge password []:
 An optional company name []:
 Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-0.9.8.cnf
 Check that the request matches the signature
 Signature ok
 The Subject's Distinguished Name is as follows
 countryName           :PRINTABLE:'RU'
 stateOrProvinceName   :PRINTABLE:'ZC'
 localityName          :PRINTABLE:'Zabubensk'
 organizationName      :PRINTABLE:'JSC Zabuba'
 organizationalUnitName:PRINTABLE:'ITD'
 commonName            :PRINTABLE:'ЛОГИН_ПОЛЬЗОВАТЕЛЯ'
 name                  :PRINTABLE:'ИМЯ ФАМИЛИЯ'
 emailAddress          :IA5STRING:'ЛОГИН_ПОЛЬЗОВАТЕЛЯ@zabubensk.example.com'
 Certificate is to be certified until Nov 12 06:24:49 2023 GMT (3650 days)
 Sign the certificate? [y/n]:y

 1 out of 1 certificate requests certified, commit? [y/n]y
 Write out database with 1 new entries
 Data Base Updated
 #
 # exit

В результате будут сгенерированы клиентские файлы сертификатов для подключения. Далее, необходимо создать файл /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ с одной строкой вида:

 $ sudo ee /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ
 ifconfig-push 172.17.0.118 172.17.0.117

Каждая пара адресов в ifconfig-push соответствует виртуальным IP-адресам конечных точек (клиента и сервера) — каждому клиенту в момент подключения назначается своя подсеть. Сюда-же можно добавить дополнительные маршруты, если клиенты подключаются к разным подсетям (филиалы, технические специалисты)

 $ sudo ee /usr/local/etc/openvpn/ccd/ЛОГИН_ПОЛЬЗОВАТЕЛЯ
ifconfig-push 172.17.0.118 172.17.0.117
push "route 10.12.1.0 255.255.255.0"
push "route 10.12.2.0 255.255.255.0"
push "route 192.168.10.0 255.255.255.0"

Чтобы сохранить совместимость с Windows-клиентами и драйвером TAP-Win32 эти адреса должны быть взяты из следующих друг за другом подсетей с маской /30. Например, для диапазона 172.17.0.1-172.17.0.254 последний октет IP-адреса каждой пары клиент-сервер следует назначать из набора:

  [  1,  2] [  5,  6] [  9, 10] [ 13, 14] [ 17, 18]
  [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
  [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
  [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
  [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
  [101,102] [105,106] [109,110] [113,114] [117,118]
  [121,122] [125,126] [129,130] [133,134] [137,138]
  [141,142] [145,146] [149,150] [153,154] [157,158]
  [161,162] [165,166] [169,170] [173,174] [177,178]
  [181,182] [185,186] [189,190] [193,194] [197,198]
  [201,202] [205,206] [209,210] [213,214] [217,218]
  [221,222] [225,226] [229,230] [233,234] [237,238]
  [241,242] [245,246] [249,250] [253,254]

Для удобства работы я создал текстовый файл «/usr/local/etc/openvpn/not_use_ip.txt» в котором перечислены свободные пары адресов, удаляемые по мере раздачи клиентам. Обратите внимание, что в конфигурационном фале первым задается назначаемый клиенту IP адрес (старший), вторым — адрес сервера (на единицу меньше).

После добавления клиента желательно перезапустить сервис OpenVPN:

 $ sudo /usr/local/etc/rc.d/openvpn restart
 Stopping openvpn.
 Waiting for PIDS: 62293.
 Starting openvpn.
 add net 172.17.0.0: gateway 172.17.0.2

Клиенту необходимо передать пять файлов (ca.crt, vpn0.crt, vpn0.key, ta.key, vpn0.example.com.ovpn):

  • /usr/local/share/doc/openvpn/easy-rsa/keys/ca.crt

  • /usr/local/share/doc/openvpn/easy-rsa/keys/ЛОГИН_ПОЛЬЗОВАТЕЛЯ.crt → vpn0.crt

  • /usr/local/share/doc/openvpn/easy-rsa/keys/ЛОГИН_ПОЛЬЗОВАТЕЛЯ.key → vpn0.key

  • /usr/local/etc/openvpn/easy-rsa/keys/ta.key

  • /usr/local/etc/openvpn/vpn0.example.com.ovpn

Перечисленные файлы копируются в отдельную (временную) папку с именем «config», файлы вида «ЛОГИН_ПОЛЬЗОВАТЕЛЯ.» в ней переименовываются в «vpn0.», папка упаковывается в архив и высылается пользователю электронной почтой со ссылкой на инструкцию по настройке клиентского подключения OpenVPN (см. ниже).

[]Инструкция по настройка клиентского подключения OpenVPN

(Для пользователей не имеющих технической подготовки)

Для установки и настройки OpenVPN соединения необходимо вначале определить разрядность своей операционной системы. Для 32-разрядных систем установочный файл клиента OpenVPN оканчивается на “-i686.exe”. Если же у Вас 64-разрядная MS-Windows, то Вам нужен файл, в названии которого есть “-x86_64.exe”. Кроме того, для VPN подключения к сети Вам потребуются клиентские сертификаты и файл настройки, которые можно получить у системного администратора.

Для MS-Windows cкачайте и установите соответствующую клиентскую программу OpenVPN (для Android и iOS есть пакеты в собственных репозиториях market/store). Перейдите в каталог программы OpenVPN (C:Program Files\OpenVPN) и скопируте в него папку config со всем содержимым, полученную у системного администратора. В этой папке расположены ваши клиентские сертификаты и настройки подключения к серверу VPN.

Иллюстрация из оригинала статьи

Названия файлов в папке config у Вас могут незначительно отличаться. Запустите OpenVPN клиент от имени Администратора или измените свойства ярлыка на Рабочем столе (установить галочку “выполнять от имени администратора”).

Иллюстрация из оригинала статьи

Иллюстрация из оригинала статьи

Подключение к локальной сети предприятия через Интернет производися через контекстное меню или двойным кликом на иконке OpenVPN в системной области панели задач. Подключиться можно только находясь за пределами сети предприятия. Соединения изнутри сети сервер OpenVPN не принимает.

Иллюстрация из оригинала статьи

После успешного завершения процедуры подключения иконка OpenVPN в панели задач изменит цвет на зеленый и появится всплывающая подсказка с назначенным VPN-клиенту IP адресом. Адрес «привязыватся» к сертификату, поэтому с одним и тем-же сертификатом одновременно с двух и более рабочих мест работать не получится из-за конфликта адресов.

После подключения Вам станут доступны все сервисы (RDP, FTP, HTTP …) как по IP адресу так и по доменному имени в разрешенном системным администратором сегменте локальной сети, за исключением возможности подключения сетевых дисков, заблокированной по соображениям безопасности.

Документация и дистрибутив:

по теме #openvpn