вступление... В ИНСТРУКЦИИ ПРЕПОЛАГАЕТСЯ, ЧТО ВЫ РАБОТАЕТЕ ОТ РУТА. ## Подготовка ОБНОВИТЬ СИСТЕМУ (отдельный гайд) Поскольку многм линуксовые утилиты привычнее, установим знакомый редактор ``` pkg install nano ``` Установим OpenVPN и easy-rsa: ``` pkg install openvpn easy-rsa ``` Загрузим модуль ядра для поддержки DCO: ``` kldload if_ovpn ``` Чтобы модуль ядра подгружался автоматически, выполним: ``` echo 'if_ovpn_load="YES"' >> /boot/loader.conf ``` Разрешим использование OpenVPN в системе: ``` echo 'openvpn_enable="YES" >> /etc/rc.conf' ``` Включим OpenVPN для инициализации: ``` service openvpn start ``` Разрешим маршрутизацию трафика: ``` sysctl net.inet.ip.forwarding=1 ``` Чтобы это делалось автоматически при загрузке, выполним: ``` echo 'gateway_enable="YES"' >> /etc/rc.conf ``` ## Ключи и сертификаты Создадим структуру: ``` mkdir /root/openvpn-ca && cd /root/openvpn-ca && easyrsa init-pki ``` По-умолчанию сроки действия сертификатов невелики, создадим файл с переменными: ``` cat << 'EOF' > vars set_var EASYRSA_CERT_EXPIRE 3650 set_var EASYRSA_CA_EXPIRE 7300 EOF ``` Далее создадим CA: ``` easyrsa build-ca ``` И теперь создадим сертификаты сервера и шлюза: ``` easyrsa build-server-full server nopass ``` ``` easyrsa build-client-full gateway-client nopass ``` Скопируем сертификаты в рабочую папку OpenVPN: ``` cp pki/ca.crt pki/issued/server.crt pki/private/server.key /usr/local/etc/openvpn/ ``` ## Настройка сервера Создаём конфиг сервера: ``` cat << 'EOF' > /usr/local/etc/openvpn/openvpn.conf dev ovpn0 dev-type tun proto udp port 443 topology subnet server 10.210.0.0 255.255.255.0 client-config-dir /usr/local/etc/openvpn/ccd route 0.0.0.0 0.0.0.0 push "redirect-gateway def1 bypass-dhcp" client-to-client cipher AES-128-GCM data-ciphers AES-128-GCM ca /usr/local/etc/openvpn/ca.crt cert /usr/local/etc/openvpn/server.crt key /usr/local/etc/openvpn/server.key dh none keepalive 10 120 persist-key persist-tun status /var/log/openvpn-status.log verb 3 EOF ``` Также ссоздадим директоррию для индивидуальных настроек клиентов (client specific overrides): ``` mkdir -p /usr/local/etc/openvpn/ccd ``` ВАЖНОЕ ЗАМЕЧАНИЕ. Обратите внимание на строку `route 0.0.0.0 0.0.0.0` в конфиге. Это значит, весь трафик будет перенаправлен в интерфейс ovpn0. Поэтому далее будет применена магия FreeBSD - FIBs (таблицы маршрутизации) и PF (фильтрация пакетов), с помощью которых легко и элегантно можно применить policy-based routing. #### Шаг 1. Настройка ядра FreeBSD на работу с двумя таблицами (FIB) По умолчанию во FreeBSD одна таблица маршрутизации. Добавим вторую: ``` echo 'net.fibs="2"' >> /boot/loader.conf ``` *Чтобы применить это без перезагрузки всего сервера, выполните команду в консоли:* ``` sysctl net.fibs=2 ``` #### Шаг 2. Включаем Packet Filtering: ``` nano /etc/pf.conf ``` Если создался новый файл - это нормально. Значит pf на данной системе ещё не применялся. Добавим в файл следующее: ``` # Разрешаем весь трафик на vpn-интерфейсе и принудительно переключаем его на rtable 1 (FIB 1) match in on ovpn0 rtable 1 # Пропускаем трафик (базовое правило, если у вас нет других ограничений) pass all ``` Включаем PF в автозагрузку и запускаем его: ``` sysrc pf_enable="YES" ``` ``` service pf start ``` #### Шаг 3. Включаем OpenVPN. ``` service openvpn restart ``` SSH-сессия должна остаться активной, так как дефолтная таблица маршрутизации (FIB 0) сервера не изменилась. Проверить, что интерфейс поднялся, можно стандартно: `ifconfig ovpn0` Проверить, как выглядят маршруты внутри изолированной таблицы, можно командой: ``` netstat -rn -F 1 ``` Осталось добавить директивы для нашего клиента-шлюза: ``` cat << 'EOF' > /usr/local/etc/openvpn/ccd/gateway-client ifconfig-push 10.210.0.254 255.255.255.0 iroute 0.0.0.0 0.0.0.0 push-remove "redirect-gateway def1 bypass-dhcp" EOF ``` На этом настройку сервера можно считать завершённой.