From 6bbdf4ebaad069c465dc3685725ae7dfc0676ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=91=D0=B0?= =?UTF-8?q?=D0=B4=D0=BE=D0=B2=D1=81=D0=BA=D0=B8=D0=B9?= Date: Tue, 26 May 2026 12:28:27 +0000 Subject: [PATCH] Update README.md --- README.md | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 9bf10f5..60797b5 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ EOF ``` ВАЖНОЕ ЗАМЕЧАНИЕ. -Далее мы сталкиваемся с дилеммой. OpenVPN в режиме DCO не имеет встроенной маршрутизации, а смотрит только системную таблицу маршрутизации. Значит мы должны направить default gateway в сторону клиента-шлюза. Но тогда сервер перестанет отвечать на запросы с основного (физического) интерфейса. Точнее, отвечать будет, но в интерфейс OpenVPN. Значит для трафика, входящего с физического интерфейса, default gateway должен быть направлен в сторону шлюза провайдера. Поэтому далее будет применена магия FreeBSD - FIBs (таблицы маршрутизации), в которой будут запущены демоны sshd и openvpn. На линуксе аналогичных возможностей нет, только долгая и мучительная возня с iptables. Лично я убил гору времени, не получив результата. +Далее мы сталкиваемся с дилеммой. OpenVPN в режиме DCO не имеет встроенной маршрутизации, а смотрит только системную таблицу маршрутизации. Значит мы должны направить default gateway в сторону клиента-шлюза. Но тогда сервер перестанет отвечать на запросы с основного (физического) интерфейса. Точнее, отвечать будет, но в интерфейс OpenVPN. Значит для трафика, входящего с физического интерфейса, default gateway должен быть направлен в сторону шлюза провайдера. Поэтому далее создадим альтернативную таблицу маршрутизации (FIB=Forwarding information base), в которой будут запущены демоны sshd и openvpn. На линуксе нельзя направить процессу талицу маршрутизации, только долгая и мучительная возня с iptables. Лично я убил гору времени, не получив результата. #### Шаг 1. Настройка ядра FreeBSD на работу с двумя таблицами (FIB) По умолчанию во FreeBSD одна таблица маршрутизации. Добавим вторую: ``` @@ -150,26 +150,29 @@ netstat -rnF 0 Вывод не должен содержать маршрута по-умолчанию. При этом вывод есть, значит доступ к серверу мы не потеряли. Если потеряли, перезагрузка вернёт маршрут по-умолчанию. -#### Удальить до шага 4 -Поскольку сам процесс OpenVPN ничего не знает об альтернативной таблице маршрутизации, он будет пытаться добавлять маршруты в основную (FIB 0). Значит будем добавлять маршруты скриптом, запускающимсся вместе с туннелем. +#### Шаг 4. Настраиваем FIB 0 при включении openvpn. +Для этого создадим два скрипта. Они будут выполняться при включении и выключении openvpn. ``` -echo 'script-security 2' >> /usr/local/etc/openvpn/openvpn.conf -echo 'up "/usr/local/etc/openvpn/up.sh"' >> /usr/local/etc/openvpn/openvpn.conf -``` -``` -cat << 'EOF' > /usr/local/etc/openvpn/up.sh +cat << 'EOF' > /usr/local/etc/openvpn/route-up.sh #!/bin/sh -# Добавляем локальный маршрут подсети в FIB 1, чтобы ядро понимало интерфейс -setfib 1 route add 10.210.0.0/24 -iface ovpn0 -# Добавляем две половины интернета в FIB 1 -setfib 1 route add 0.0.0.0/1 -iface ovpn0 -setfib 1 route add 128.0.0.0/1 -iface ovpn0 +/sbin/route change -fib 0 default 10.210.0.254 +echo "FIB 0 default route changed to 10.210.0.254" EOF ``` ``` -chmod +x /usr/local/etc/openvpn/up.sh +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 ``` -#### Шаг 4. Включаем OpenVPN. +Сделаем скрипты исполняемыми: +``` +chmod +x /usr/local/etc/openvpn/route-up.sh +chmod +x /usr/local/etc/openvpn/route-down.sh +``` + + ``` service openvpn start ```