Установка и настройка OpenVPN на FreeBSD 12.0 с сертификатной аутентификацией

В этом руководстве пошагово описано, как установить OpenVPN на FreeBSD 12.0, сгенерировать сертификаты с помощью easy-rsa, настроить сервер и pf, включить маршрутизацию (port forwarding) и проверить подключение клиента. Приведены рекомендации по безопасности, чек-листы для администратора и отладочные сценарии.
Важное: процедура предполагает root-доступ и базовые навыки работы с FreeBSD и командной строкой. Перед началом сделайте бэкап конфигураций и ключевых файлов.
О чём статья
Основная цель: настроить сервер OpenVPN на FreeBSD 12.0 с использованием сертификатной аутентификации (PKI), обеспечить NAT через pf и включить пересылку пакетов. Варианты: можно адаптировать конфигурацию под другие версии FreeBSD и под другие топологии (например, TAP вместо TUN).
Краткие варианты запроса (SEO-подсказки): установить OpenVPN на FreeBSD, настроить OpenVPN FreeBSD 12, OpenVPN с сертификатами, pf NAT для OpenVPN, как настроить client.ovpn.
Предварительные требования
- Система: FreeBSD 12.0. Локализовано: минимально рекомендуется 512 МБ оперативной памяти и 1 ядро CPU.
- Доступ: root (или права sudo).
- Установленный pf (firewall) и доступ к редактированию /etc/rc.conf, /etc/sysctl.conf.
- Понимание IP-маршрутизации и базовый опыт работы с OpenSSL/PKI будет полезен.
Что мы сделаем
- Установим OpenVPN на FreeBSD 12.0
- Настроим переменные easy-rsa для генерации сертификатов
- Сгенерируем CA, серверный и клиентский сертификаты, DH и CRL
- Настроим OpenVPN (openvpn.conf)
- Настроим pf: NAT и правила для UDP/1194
- Включим пересылку пакетов (port-forwarding)
- Подготовим клиентский .ovpn и выполним тестирование
Шаг 1 — Установка OpenVPN
Обновите локальный кэш пакетов и установите openvpn:
pkg update
pkg install openvpn
Добавьте сервис OpenVPN в автозагрузку и укажите интерфейс туннеля ‘tun’:
sysrc openvpn_enable="YES"
sysrc openvpn_if="tun"
Теперь пакет OpenVPN установлен и включён для автозагрузки.
Шаг 2 — Подготовка переменных для сертификатов (easy-rsa)
Создайте директорию для конфигурации OpenVPN и скопируйте туда easy-rsa:
mkdir -p /usr/local/etc/openvpn/
cp -R /usr/local/share/easy-rsa /usr/local/etc/openvpn/
Перейдите в папку easy-rsa и отредактируйте файл vars (используйте ваш любимый редактор):
cd /usr/local/etc/openvpn/easy-rsa/
vim vars
Ниже — пример настроек. Подставьте свои значения (страна, город, email и т. п.). Значения локализованы в русской транслитерации или сохранены как в оригинале, где критично:
set_var EASYRSA "$PWD"
set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "DE"
set_var EASYRSA_REQ_PROVINCE "Frankfurt"
set_var EASYRSA_REQ_CITY "Frankfurt"
set_var EASYRSA_REQ_ORG "hakase-labs CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "HAKASE-LABS EASY CA"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "HAKASE-LABS CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST "sha256"
Сделайте vars исполняемым и переходите к генерации PKI:
chmod +x vars
Шаг 3 — Генерация сертификатов
Инициализируйте PKI и создайте корневой CA, серверные и клиентские сертификаты, DH и CRL.
cd /usr/local/etc/openvpn/easy-rsa/
./easyrsa.real init-pki
Генерация CA:
./easyrsa.real build-ca
Вас попросят задать пароль для CA-ключа. Сохраните этот пароль в безопасном месте.
Генерация и подпись серверного сертификата:
./easyrsa.real gen-req openvpn-bsd nopass
./easyrsa.real sign-req server openvpn-bsd
При подписи потребуется ввести пароль CA.
Проверка сертификата:
openssl verify -CAfile pki/ca.crt pki/issued/openvpn-bsd.crt
Генерация клиентского сертификата (пример client01):
./easyrsa.real gen-req client01 nopass
./easyrsa.real sign-req client client01
Проверка клиентского сертификата:
openssl verify -CAfile pki/ca.crt pki/issued/client01.crt
Генерация CRL и DH-параметров:
./easyrsa.real gen-crl
./easyrsa.real gen-dh
Теперь скопируйте сертификаты в соответствующие каталоги OpenVPN:
mkdir -p /usr/local/etc/openvpn/{server,client}
cp pki/ca.crt /usr/local/etc/openvpn/server/
cp pki/issued/openvpn-bsd.crt /usr/local/etc/openvpn/server/
cp pki/private/openvpn-bsd.key /usr/local/etc/openvpn/server/
cp pki/dh.pem /usr/local/etc/openvpn/server/
cp pki/crl.pem /usr/local/etc/openvpn/server/
cp pki/ca.crt /usr/local/etc/openvpn/client/
cp pki/issued/client01.crt /usr/local/etc/openvpn/client/
cp pki/private/client01.key /usr/local/etc/openvpn/client/
Шаг 4 — Конфигурация OpenVPN
Перейдите в /usr/local/etc/openvpn и создайте openvpn.conf:
cd /usr/local/etc/openvpn/
vim openvpn.conf
Пример конфигурации сервера. Настройте под свою сеть (IP, интерфейсы, значения):
# OpenVPN Port, Protocol, and the Tun
port 1194
proto udp
dev tun
# OpenVPN Server Certificate - CA, server key and certificate
ca /usr/local/etc/openvpn/server/ca.crt
cert /usr/local/etc/openvpn/server/openvpn-bsd.crt
key /usr/local/etc/openvpn/server/openvpn-bsd.key
#DH and CRL key
dh /usr/local/etc/openvpn/server/dh.pem
crl-verify /usr/local/etc/openvpn/server/crl.pem
# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.5.5.0 255.255.255.0
push "redirect-gateway def1"
# Using the DNS from https://dns.watch
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"
#Enable multiple clients to connect with the same certificate key
duplicate-cn
# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache
# Other Configuration
keepalive 20 60
explicit-exit-notify 1
persist-key
persist-tun
comp-lzo yes
daemon
user nobody
group nobody
# OpenVPN Log
log-append /var/log/openvpn.log
verb 3
Сохраните и запустите сервис:
service openvpn start
service openvpn status
Проверьте открытые сокеты (порт по умолчанию UDP/1194):
sockstat -l4
Шаг 5 — Настройка pf (файрвол) для OpenVPN
Мы будем создавать NAT-правило, чтобы трафик из VPN (10.5.5.0/24) выходил в интернет через внешний интерфейс (например, vtnet0). Перед началом убедитесь, что pf установлен и включён.
Отредактируйте /usr/local/etc/pf.conf или основной pf.conf в /etc (в примере — /usr/local/etc/pf.conf):
cd /usr/local/etc/
vim pf.conf
Добавьте переменные и правила (пример):
# vpn interface
vpn_if="tun0"
vpn_net = "10.5.5.0/24"
# reassemble all fragmented packets before filtering them
scrub in on $ext_if all fragment reassemble
# route traffic from VPN interface out to the internet
nat on ! $vpn_if from $vpn_net to any -> $ext_ip
# Allow Connection to VPN Server
pass in on $ext_if proto udp from any to ($ext_if) port 1194 keep state
# Pass all connection on the VPN Interface
pass in on $vpn_if from any to any
Сохраните и проверьте конфигурацию pf:
service pf check
service pf reload
pfctl -sr
pfctl -sn
Важное: корректно укажите $ext_if и $ext_ip — это внешний интерфейс и внешний IP вашей машины. Ошибки в этих переменных могут привести к потере доступа.
Шаг 6 — Включение пересылки пакетов (port forwarding)
Отредактируйте /etc/sysctl.conf и добавьте параметры:
vim /etc/sysctl.conf
Вставьте:
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
Примените настройки и включите систему как gateway:
sysctl -f /etc/sysctl.conf
sysrc gateway_enable="YES"
reboot
После перезагрузки проверьте, что net.inet.ip.forwarding = 1.
Шаг 7 — Подготовка клиентской конфигурации
Создайте файл клиента /usr/local/etc/openvpn/client/client01.ovpn и поместите туда сертификаты (ca.crt, client01.crt, client01.key) или инлайньте их при желании.
Пример client01.ovpn:
client
dev tun
proto udp
remote xxx.xxx.xxx.xxx 1194
ca ca.crt
cert client01.crt
key client01.key
cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3
Измените remote xxx.xxx.xxx.xxx на реальный внешний IP или DNS-имя вашего сервера. Скачайте все нужные файлы на клиентскую машину и подключитесь.
Шаг 8 — Тестирование
На клиенте выполните:
openvpn --config client01.ovpn
Проверьте интерфейс tun0:
ifconfig tun0
Проверьте пинг до сервера внутри VPN и доступ к интернету через VPN:
ping -c3 10.5.5.1
curl ipinfo.io
Если внешний IP в ответе curl совпадает с IP сервера — туннель работает и трафик идёт через VPN.
Частые ошибки и их устранение
- OpenVPN не поднимает туннель: проверьте логи /var/log/openvpn.log и права на ключи (ключи не должны быть доступны всем). Права для приватного ключа: 600, владелец root.
- Клиент не получает IP: проверьте директиву server в openvpn.conf и наличие push “route”; проверьте, что pf не блокирует трафик внутри VPN.
- Нет доступа в интернет с клиента: проверьте nat-правило pf, включена ли маршрутизация (net.inet.ip.forwarding=1), корректно ли указан $ext_if и $ext_ip.
- Ошибка верификации сертификата: убедитесь, что ca.crt совпадает на клиенте и в серверной папке, и что вы подписали запрос верно.
Безопасность и жёсткая настройка
Рекомендации по усилению безопасности:
- Используйте RSA-ключи длиной 4096 бит для CA и сервера, если это допустимо по производительности.
- Отключите duplicate-cn, чтобы каждому клиенту соответствовал свой сертификат.
- Храните CA-ключ оффлайн; для подписи создавайте отдельную рабочую машину для CA.
- Регулярно обновляйте CRL при отзыве сертификатов: ./easyrsa.real gen-crl и копируйте crl.pem на сервер.
- Рассмотрите использование tls-auth/tls-crypt для защиты TLS-рукопожатия от DoS и раффликации портов.
- Логи: ограничьте доступ к /var/log/openvpn.log и настраивайте ротацию логов.
Чек-листы по ролям
Чек-лист для системного администратора (быстрый):
- Установлен пакет openvpn
- easy-rsa настроен и vars сохранён
- CA сгенерирован и ключ надёжно защищён
- Сертификаты сервера и клиента созданы и проверены
- Конфигурация openvpn.conf отредактирована и протестирована
- pf содержит NAT-правила и правила доступа
- net.inet.ip.forwarding включён и перезагрузка выполнена
- Клиентский .ovpn протестирован из внешней сети
Чек-лист для пользователя/клиента:
- Получены ca.crt, client.crt, client.key и client.ovpn
- client.ovpn содержит правильный remote
- Подключение проходит без ошибок в логах
- Проверен доступ к внутренним ресурсам и интернету через VPN
Мини-методология управления сертификатами
- Создайте оффлайн CA на отдельной изолированной машине.
- Подписывайте только CSR, полученные от доверенных администраторов.
- Храните CRL на сервере и обновляйте после каждого отзыва.
- Введите процесс ротации сертификатов (например, ежегодный) и процедуру отзыва для утерянных ключей.
Сценарии тестирования и критерии приёмки
Критерии приёмки:
- OpenVPN демон запускается и слушает UDP/1194.
- Клиент успешно устанавливает туннель и получает IP из 10.5.5.0/24.
- Клиент может пинговать 10.5.5.1 и выходить в интернет через сервер (curl ipinfo.io показывает IP сервера).
- pf выполняет NAT для VPN-сети и не блокирует установленные соединения.
Тестовые кейсы:
- Подключение одного клиента, проверка маршрутизации и доступа в интернет.
- Подключение двух клиентов (если duplicate-cn отключён, у каждого — свой cert).
- Откат и отзыв сертификата: сгенерировать CRL и проверить, что отозванный клиент не может подключиться.
- Нагрузочный тест: проверить влияние шифрования на загрузку CPU при множественных клиентах (количественные значения зависят от среды).
Когда стоит выбрать альтернативы
- WireGuard: проще в настройке, выше производительность и современный дизайн криптографии; если вам нужен простой и быстрый VPN — рассмотрите WireGuard.
- OpenVPN с username/password (auth-user-pass): полезно при централизованной аутентификации (LDAP/Radius). Но сертификаты дают более надёжную проверку клиентов.
- IPSec (StrongSwan): предпочтителен в корпоративных сетях, где требуется взаимодействие с аппаратными VPN-концентраторами.
Решение распространённых проблем (короткие инструкции)
- Если клиент видит TLS Error: verify that the server certificate and CA match; проверьте временные метки и правильность часов на сервере/клиенте.
- Если NAT не работает: проверьте pfctl -s nat и pfctl -sr, убедитесь в отсутствии конфликтов интерфейсов.
- Если логи пусты: убедитесь, что openvpn запущен от root и daemon опция включена, и что /var/log/openvpn.log доступен для записи.
Рекомендации по эксплуатации и резервированию
- Резервируйте pki/ директорию в защищённом хранилище (шифрование бэкапа).
- Введите журнал операций: кто и когда подписал сертификат, кто отзывал.
- План ротации ключей и сертификатов: периодический контроль сроков истечения (EASYRSA_CERT_EXPIRE).
Заключение
В статье показаны все ключевые шаги для развёртывания OpenVPN на FreeBSD 12.0 с сертификатной аутентификацией: установка пакета, генерация PKI, настройка сервера и pf, включение маршрутизации и проверка клиента. При выполнении рекомендаций по безопасности и процессам управления сертификатами вы получите надёжный VPN-сервер.
Ссылки
Краткое резюме
- Установка OpenVPN и easy-rsa на FreeBSD 12.0.
- Генерация CA, серверных и клиентских сертификатов, DH и CRL.
- Конфигурация openvpn.conf и pf NAT; включение net.inet.ip.forwarding.
- Подготовка client.ovpn и проверка подключения.
Похожие материалы

Как стримить Netflix в Discord — полный гайд

Отключить уведомления Get Office в Windows 10

Исправить отсутствие звука в Windows 10 (KB5015878)

Операции над аудиосигналами в Octave

Виджет контакта на главный экран Android
