2026-05-21 11:42:50 +00:00
2026-05-22 18:29:26 +00:00
2026-05-22 19:54:46 +00:00

вступление...

Подготовка

ОБНОВИТЬ СИСТЕМУ (отдельный гайд) Поскольку многм линуксовые утилиты привычнее, установим знакомый редактор

pkg install nano

Установим OpenVPN и easy-rsa:

pkg install openvpn easy-rsa

Загрузим модуль ядра для поддержки DCO:

kldload if_ovpn

Чтобы модуль ядра подгружался автоматически, выполним:

echo 'if_ovpn_load="YES"' > /boot/loader.conf

Разрешим маршрутизацию трафика:

sysctl net.inet.ip.forwarding=1

Чтобы это делалось автоматически при загрузке, выполним:

echo 'gateway_enable="YES"' > gateway_enable="YES"

Ключи и сертификаты

Создадим структуру:

mkdir /root/openvpn-ca && cd /root/openvpn-ca && easyrsa init-pki

Далее создадим CA:

easyrsa build-ca

По-умолчанию сроки действия сертификатов невелики, создадим файл с переменными:

cat << 'EOF' > vars
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_CA_EXPIRE   7300
EOF

И теперь создадим сертификаты сервера и шлюза:

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

На этом настройку сервера можно считать завершённой.

Description
No description provided
Readme 169 KiB
Languages
Shell 100%