Update README.md

This commit is contained in:
2026-05-26 12:28:27 +00:00
parent dc3c6f2b8d
commit 6bbdf4ebaa

View File

@@ -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
```