2026-05-21 11:42:50 +00:00
2026-05-22 18:29:26 +00:00
2026-05-26 12:28:27 +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

Разрешим использование OpenVPN в системе:

echo 'openvpn_enable="YES"' >> /etc/rc.conf

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

sysctl net.inet.ip.forwarding=1

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

echo 'gateway_enable="YES"' >> /etc/rc.conf

И создадим структуру папок OpenVPN:

mkdir -p /usr/local/etc/openvpn/ccd

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

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

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 1443
topology subnet
server 10.210.0.0 255.255.255.0
client-config-dir /usr/local/etc/openvpn/ccd
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
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
explicit-exit-notify 1
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
EOF

ВАЖНОЕ ЗАМЕЧАНИЕ. Далее мы сталкиваемся с дилеммой. OpenVPN в режиме DCO не имеет встроенной маршрутизации, а смотрит только системную таблицу маршрутизации. Значит мы должны направить default gateway в сторону клиента-шлюза. Но тогда сервер перестанет отвечать на запросы с основного (физического) интерфейса. Точнее, отвечать будет, но в интерфейс OpenVPN. Значит для трафика, входящего с физического интерфейса, default gateway должен быть направлен в сторону шлюза провайдера. Поэтому далее создадим альтернативную таблицу маршрутизации (FIB=Forwarding information base), в которой будут запущены демоны sshd и openvpn. На линуксе нельзя направить процессу талицу маршрутизации, только долгая и мучительная возня с iptables. Лично я убил гору времени, не получив результата.

Шаг 1. Настройка ядра FreeBSD на работу с двумя таблицами (FIB)

По умолчанию во FreeBSD одна таблица маршрутизации. Добавим вторую:

echo 'net.fibs="2"' >> /boot/loader.conf

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

sysctl net.fibs=2

Шаг 2. Заполним альтернативную таблицу (FIB 1) при старте.

Узнайте имя своего физического интерфейса, а также локальную сеть и адрес шлюза сс помощью команды ifconfig и netstat -rn

nano /etc/rc.local

Если файл уже существует, добавьте туда две команды (без шебанга). Но на чистой системе он должен отсутствовать. И естественно, замените имя интерфейса, сеть и адрес шлюза на свои.

#!/bin/sh
/sbin/route add -fib 1 -net 157.22.241.0/24 -interface vtnet0
route add -fib 1 default 157.22.241.1

Перезагрузимся и проверим обе таблицы маршрутизации.

netstat -rn -F 0
netstat -rn -F 1

Вторая таблица должна приссутствовать и в ней должны быть два маршрута из /etc/rc.local

Шаг 3. Перемещение нужных процессов в FIB 1

Выполним команду:

setfib service sshd restart

Это единоразово переместит ssh в fib 1. Переподключимся к серверу по ssh. Проверим, какую таблицу ммаршрутизации использует наш демон.

ps -ax -o pid,fib,command | grep -E 'sshd'

Если во второй колонке мы видим единицы, значит мы вссё сделали правильно, и доступ к серверу через FIB 1 есть. Можно модифицировать FIB 0 под наши цели. Применим изменения перманентно. Для этого добавим в /etc/rc.conf следующие строки:

sshd_fib="1"
openvpn_fib="1"

Перезагрузимся и проверим, что мы точно имеем доступ к серверу именно благодаря альтернативной таблице.

ps -ax -o pid,fib,command | grep -E 'sshd|openvpn'

Должна показывать единицы во второй колонке, ессли это так, удалим маршрут по-умолчанию в основной таблице:

route del -fib 0 default

И проверим саму таблицу:

netstat -rnF 0

Вывод не должен содержать маршрута по-умолчанию. При этом вывод есть, значит доступ к серверу мы не потеряли. Если потеряли, перезагрузка вернёт маршрут по-умолчанию.

Шаг 4. Настраиваем FIB 0 при включении openvpn.

Для этого создадим два скрипта. Они будут выполняться при включении и выключении openvpn.

cat << 'EOF' > /usr/local/etc/openvpn/route-up.sh
#!/bin/sh
/sbin/route change -fib 0 default 10.210.0.254
echo "FIB 0 default route changed to 10.210.0.254"
EOF
cat << 'EOF' > /usr/local/etc/openvpn/route-down.sh
#!/bin/sh
/sbin/route change -fib 0 default 157.22.241.1
echo "FIB 0 default route restored to provider gateway"
EOF

Сделаем скрипты исполняемыми:

chmod +x /usr/local/etc/openvpn/route-up.sh
chmod +x /usr/local/etc/openvpn/route-down.sh
service openvpn start

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%