waqur: (Евро)
[personal profile] waqur
Продолжаем тему углублённого изучения OpenVPN.

Если вы подключены к интернету одновременно через два провайдера, для повышения надёжности OpenVPN сервер можно настроить таким образом, чтобы он принимал входящие подключения через любой аплинк.

Это делается так: два роутера от разных провайдеров заводятся в один L2 сегмент сети (в простейшем случае — в один свитч), им назначается одна и та же сеть (например 172.21.13.0/24), но разный последний октет в IP-адресе (например .1 и .2). DHCP-сервер для LAN-интерфейса на одном из этих роутеров нужно отключить, а можно и на обоих. Физический сервер, на котором будет выполняться демон openvpn в режиме сервера, тоже включается в эту сеть и настраивается на статический IP-адрес (например, .3).

Нужно выбрать два порта со случайными номерами, большими чем 1024, и пробросить их с провайдерских роутеров .1 и .2 (путём настройки NAT через web-интерфейс) на внутренний сервер .3.

Далее на внутреннем сервере нужно будет запустить два экземпляра openvpn-демона, слушающие два разных TCP-порта, и работающие каждый со своим виртуальным сетевым интерфейсом, tap0 или tap1. Эти два виртуальных интерфейса и вашу реальную сетевую карту на сервере следует объединить в трёхсторонний бридж (программный свитч).

Также на внутреннем сервере нужно соорудить скрипт или на внешних роутерах настроить опцию для поддержки динамического DNS, чтобы вашу сеть можно было как-то адресовать снаружи. Раньше для этой цели был хорош DynDNS.org, а после того, как он скурвился, я предпочитаю Amazon Route 53 + AWS CLI. IP-адреса на WAN-интерфейсах провайдерских роутеров обычно можно получить несложным пайпом из curl, grep и sed, а специфические для вашего устройства запросы покажет Burp Suite или любой другой удобный для вас http прокси. Если оба ваших провайдера предоставляют вам статические IP-адреса, тогда этот абзац можно пропустить.

Далее в дело вступает специфическая, чисто FreeBSDшная магия под названием setfib. Суть проблемы заключается в том, ваш openvpn-сервер, получив NATированный TCP-пакет от роутера-гейтвея, должен отправить ответ ему же, а не гейтвею по умолчанию. Ведь NAT в ваших роутерах односторонний, он подменяет IP-адреса отправителей в TCP-пакетах только для исходящего трафика, но не для входящего, и следовательно, openvpn-демоны, которые крутятся на вашем сервере, никак не могут различать провайдера, от которого пришёл TCP-пакет, кроме как по номеру локального TCP-порта, на который он пришёл. И ответные пакеты эти демоны обязаны слать только в соответствующий гейтвей. Линуксоиды в этом месте обычно начинают хачить файерволл, и, как правило безуспешно; а виндузятники просто бессильно рыдают в уголочке.

В FreeBSD же можно настроить несколько таблиц маршрутизации (FIBs). Эти таблицы существуют в ядре параллельно, и командой "setfib 1 ..." или "setfib 2 ..." можно запускать процесс "...", который будет видеть первую или вторую картину окружающей реальности. В качестве "..." может выступать абсолютно любая команда, например netstat -rn, route add, ping, curl, wget, aws, openvpn и так далее. Процессы, видящие разную картину окружающей реальности, могут выполняться на сервере одновременно и никак не мешают друг другу.

Эта фича включается в /boot/loader.conf добавлением параметра net.fibs="4". После перезагрузки можно проверить, что всё получилось, с помощью команды "sysctl net.fibs" (по умолчанию FIB только один — тот, что с номером ноль).

Далее в скрипт автозагрузки следуют включить команды, которые задают default gateway в каждом FIBе, наподобие таких:
setfib 1 route add -net default 172.21.13.1
setfib 2 route add -net default 172.21.13.2


а в /etc/rc.conf настроить одновременный запуск двух экземпляров openvpn с FIBами:
cloned_interfaces="tap0 tap1 bridge0"
ifconfig_tap0="up"
ifconfig_tap1="up"
ifconfig_bridge0="addm tap0 addm tap1 addm re0"
openvpn1_enable="YES"
openvpn1_configfile="/usr/local/etc/openvpn/server1.conf"
openvpn1_dir="/usr/local/etc/openvpn"
openvpn1_fib="1"
openvpn2_enable="YES"
openvpn2_configfile="/usr/local/etc/openvpn/server2.conf"
openvpn2_dir="/usr/local/etc/openvpn"
openvpn2_fib="2"


Разумеется, openvpn должен быть установлен из портов или из пакетов, а в директории /usr/local/etc/rc.d должны быть симлинки openvpn1 и openvpn2, указывающие на openvpn. server1.conf и server2.conf содержат разные номера слушающих TCP-портов, разные интерфейсы (tap0/tap1), и разные имена журнальных файлов на диске, а все остальные настройки и ключи совпадают.

Клиентская конфигурация содержит несколько экземпляров опции remote, благодаря чему клиент перебирает сервера по кругу, пока не найдёт работающий.

March 2024

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Автор стиля

Развернуть

No cut tags
Page generated 2026-01-27 02:58 pm
Powered by Dreamwidth Studios