Корпоративный 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