Корпоративный OpenVPN на FreeBSD
Настройка сервера
Устанавливаем:
pkg update
pkg install openvpn
Подгатавливаем инфраструктуру ключей. В текущей директории будет создана директория pki:
easyrsa init-pki
cp pki/vars.example pki/vars
Настраиваем pki/vars:
# In how many days should the root CA key expire?
# Срок действия ключа корневого центра сертификации (дней)
set_var EASYRSA_CA_EXPIRE 36500
# In how many days should certificates expire?
# Срок действия сертификатов (сервера и клиентов, дней)
set_var EASYRSA_CERT_EXPIRE 36500
Создаём ключи и сертификаты:
# Создаем корневой сертификат:
easyrsa build-ca nopass
# Создаем ключ и сертификат для сервера с именем server:
easyrsa build-server-full server nopass
# Создаем ключ и сертификат для клиента с именем client:
easyrsa build-client-full client nopass
# Переходим в папку с ключами:
cd pki
# Создаем ключ для системы безопасного обмена ключами по алгоритму Диффи — Хеллмана:
openssl dhparam -out dh2048.pem 2048
# Генерируем ключ пакетной авторизации:
easytls build-tls-auth
#openvpn --genkey tls-auth ta.key
Создаем директорию с файлами конфигурации (по умолчанию в /usr/local/etc/openvpn) и копируем в неё ключи:
mkdir /usr/local/etc/openvpn
cp ca.crt dh2048.pem private/easyrsa-tls.key issued/server.crt private/server.key /usr/local/etc/openvpn
Хранить ключи клиентов на сервере не требуется - они подписаны корневым ключом, их подлинность проверяется с помощью корневого сертификата.
Копируем шаблон конфига:
cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn
Настриваем openvpn сервер через /usr/local/etc/openvpn/server.conf:
# Адрес для входящих соединений, если не задан, то соединения будут приниматься на всех интерфейсах
local a.b.c.d
# это по умолчанию, рекомендуется сменить
port 1194
# Протокол
proto tcp-server
#proto udp
# Тип виртуального интерфейса:
# tap - эмулирует сетевую карту
# tun - туннель точка-точка.
# Можно явно задать номер интерфейса, например tun0
dev tun
# Пути к ключам шифрования, сгенерированным на предыдущем шаге.
# По умолчанию ищутся в папке с конфигом
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
# Параметры безопасного обмена ключами по алгоритму Диффи — Хеллмана.
dh dh2048.pem
tls-auth easyrsa-tls.key 0
# Тип сетевой адресации, рекомендованное значение:
# subnet, работает по принципу Ethernet, c IP-адресом и сетевой маской.
# Для оптимальной производительности должно быть subnet
topology subnet
# Включает режим сервера, фактически встроенный маршрутизатор,
# позволяющий принимать несколько клиентских подключений на
# один системный туннель. Задается адрес сети и маска, первые
# два адреса будут использованы в качестве адресов сервера и
# клиента устройства tun, остальные доступны клиентам.
server 10.8.0.0 255.255.0.0
# Файл для хранения адресов, присвоенным клиентам,
# при повторном подключении клиенты получат тот же адрес.
ifconfig-pool-persist ipp.txt
# Позволить клиентам подключаться между собой.
;client-to-client
# Разрешить одновременные подключения с одинаковым ключом.
;duplicate-cn
# Пинговать клиент каждые 10 секунд, если за 120 секунд
# ответ не получен, считать соединение разорванным.
keepalive 10 120
# Включает дополнительную пакетную авторизацию,
# ключ был сгенерирован нами ранее.
tls-auth ta.key 0 # This file is secret
# Выбор алгоритма шифрования, должен совпадать с клиентом
cipher AES-256-CBC
# Число одновременных подключений
;max-clients 100
# Ограничить права демона заданным пользователем и группой
;user nobody
;group nobody
# Сохранять ключи в памяти.
# Не пересоздавать туннель при реконнекте.
# Опции требуются для работы с ограниченными правами.
persist-key
persist-tun
# Путь к файлу статуса,
# содержит список текущих соединений,
# обновляется раз в минуту
status openvpn-status.log
# Уровень детальности лога
verb 3
# Не писать в лог сообщения, повторяющиеся более заданного числа раз.
;mute 20
# Информировать клиентов о перезагрузке сервера
explicit-exit-notify 1
Настройки запуска /etc/rc.conf
openvpn_enable="YES"
openvpn_flags="--tls-server"
openvpn_if="tun"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"
Настройка клиента
Конфигурация клиента (файл client.conf / client.ovpn):
##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server. #
# #
# This configuration can be used by multiple #
# clients, however each client should have #
# its own cert and key files. #
# #
# On Windows, you might want to rename this #
# file so it has a .ovpn extension #
##############################################
# Режим клиента
# Будет применять настройки, получаемые от сервера
client
# Тип интерфейса
dev tun
# Протокол
proto tcp-client
# Адрес и порт сервера
# Можно задать несколько адресов.
remote my-server-1 1194
# Выбирать случайный адрес
# Если не указать, будет перебирать серверы в порядке перечисления.
;remote-random
# Запрашивать адрес в DNS при каждом подключении,
# Полезно, например, если у сервера динамический адрес.
resolv-retry infinite
# Для клиента привязка к определенному порту не требуется,
# использовать динамический порт, выделенный системой.
nobind
# Работать под учетной записью с ограниченными правами
;user nobody
;group nobody
# Сохранять ключи в памяти. Не пересоздавать туннель при реконнекте.
# Требуются для работы с ограниченными правами.
persist-key
persist-tun
# Подключаться через прокси-сервер
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]
# Не протоколировать сообщения о повторяющихся пакетах,
# полезно при связи через беспроводную сеть.
;mute-replay-warnings
# Кючи и сертификаты авторизации
ca ca.crt
cert client.crt
key client.key
# Проверка подлинности сервера
remote-cert-tls server
# Включает пакетную авторизацию (должно совпадать с настройками сервера)
tls-auth ta.key 1
# Алгоритмы шифрования, должны совпадать с сервером.
# Начиная с версии 2.4, по умолчанию согласуется протокол AES-256-GCM.
;cipher AES-256-CBC
# Сжатие трафика (должно совпадать с настройками сервера)
#comp-lzo
# Уровень детальности логов
verb 3
# Не писать в лог более заданного количества одинаковых сообщений подряд.
;mute 20
# Если интернет подключен через VPN, то для успешного
# прохождения пакетов, необходимо уменьшить размер пакета в туннеле.
#
# Задаем максимальный размер пакета, включаем корректировку
# размера TCP-пакетов, проходящих через туннель, и фрагментацию больших пакетов.
#
# В качестве параметра, задаем максимально допустимый размер пакета минус 50.
#
;tun-mtu 1300
;mssfix 1300
;fragment 1300
# Запрашивать адрес в DNS при каждом подключении,
# полезно, если у сервера динамический адрес.
resolv-retry infinite
# использовать динамический порт, выделенный системой.
# (для клиента привязка к определенному порту не требуется)
nobind
Запуск:
service openvpn start
Проверка, открылся ли порт:
sockstat -l4 | grep openvpn
Проверка лога:
cat /var/log/messages