Как построить отказоустойчивую быструю защищенную корпоративную сеть передачи данных


Сегодня поговорим о том, как построить отказоустойчивую быструю защищенную корпоративную сеть передачи данных на OS Debian.

Итак: VxLAN ethernet-туннель поверх IP-туннеля WireGuard с динамическими маршрутами OSPF

WireGuard является туннелем третьего (сетевого) уровня.
Соответственно возможности канального уровня (логические мосты, широковещательные рассылки и т.д.) недоступны в данном туннеле.
Так же, пока, WireGuard не предоставляет возможностей автоматической передачи параметров сети (маршруты, динамические адреса) соседям.
Чтобы обойти данные ограничения можно прибегнуть к двум дополнительным решениям:

  • VxLAN – технология виртуальной сети, использующая инкапсюляцию L2 Ethernet в UDP-пакеты.
  • OSPF – не нуждающийся в представлении протокол динамической маршрутизации, основанный на технологии отслеживания состояния канала и использующий для нахождения кратчайшего пути алгоритм Дейкстры.

В примере будем предполагать, что у нас есть три площадки со своим маршрутизатором на Debian Linux:

  1. router01
    • WAN IP: 123.124.125.1
    • LAN: 10.1.1.0/24
  2. router02
    • WAN IP: 124.125.126.2
    • LAN: 10.2.2.0/24
  3. router03
    • WAN IP: 125.126.127.3
    • LAN: 10.3.3.0/24

Этап 1 – Установка шифрованного туннеля WireGuard

Для установки соответствующего ПО можно обратиться к официальной документации Debian.

В нашей конфигурации можно воспользоваться разными топологиями туннеля.
Например:

  1. Подключение многих к одному (клиенты-сервер или звезда)
  2. Подключение всех ко всем (ячеистая сеть или mesh)
  3. Смешанный тип подключений

В данной статье мы воспользуемся первым вариантом (хотя это и не принципиально).
Сеть туннеля WireGaurd назначим 10.10.10.0/24
Второй и третий маршрутизатор будут подключаться к первому.

На первом маршрутизаторе создадим конфигурацию с подключениями ко второму и третьему:

/etc/wireguard/wg0.conf

[Interface] ListenPort = 4444
PrivateKey = закрытый_ключ_первого_маршрутизатора

Второй маршрутизатор

[Peer] PublicKey = открытый_ключ_второго_маршрутизатора
AllowedIPs = 10.10.10.2/32
Endpoint = 124.125.126.2:4444

Третий маршрутизатор

[Peer] PublicKey = открытый_ключ_третьего_маршрутизатора
AllowedIPs = 10.10.10.3/32
Endpoint = 125.126.127.3:4444

На втором маршрутизаторе создадим конфигурацию с подключением к первому маршрутизатору:

/etc/wireguard/wg0.conf

[Interface] ListenPort = 4444
PrivateKey = закрытый_ключ_второго_маршрутизатора

Первый маршрутизатор

[Peer] PublicKey = открытый_ключ_первого_маршрутизатора
AllowedIPs = 10.10.10.0/24
Endpoint = 123.124.125.1:4444

На третьем маршрутизаторе, также, создадим конфигурацию с подключением к первому маршрутизатору:

/etc/wireguard/wg0.conf

[Interface] ListenPort = 4444
PrivateKey = закрытый_ключ_третьего_маршрутизатора

Первый маршрутизатор

[Peer] PublicKey = открытый_ключ_первого_маршрутизатора
AllowedIPs = 10.10.10.0/24
Endpoint = 123.124.125.1:4444

Далее на всех маршрутизаторах добавим конфигурацию сетевого интерфейса для WireGuard:

/etc/network/interfaces

auto wg0
iface wg0 inet static
address 10.10.10.1/24 # для второго и третьего – 10.10.10.2/24 и 10.10.10.3/24 соответственно
pre-up ip link add $IFACE type wireguard
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
post-down ip link del $IFACE

После этого поднимем интерфейсы туннеля на всех маршрутизаторах:

ifup wg0

На этом установка шифрованного туннеля WireGuard закончена.

Этап 2 – Установка виртуальной сети VxLAN поверх WireGuard

Определимся, что виртуальная сеть будет иметь адресацию – 10.20.20.0/24

Для начала создадим файл, в котором перечислим все пиры, которые будут участвовать в виртуальной сети.
Данный файл должен иметь одно и то же содержимое на всех маршрутизаторах (пирах).
Т.к. виртуальную сеть будем строить в туннеле WireGuard, то и адреса пиров будут в этой сети:

/etc/wireguard/vxpeers (расположение и имя файла не имеет значения)

10.10.10.1
10.10.10.2
10.10.10.3

Далее добавим конфигурацию сетевого интерфейса виртуальной сети VxLAN:

/etc/network/interfaces

auto vxlan0
iface vxlan0 inet static
address 10.20.20.1/24 # для второго и третьего – 10.20.20.2/24 и 10.20.20.3/24 соответственно
pre-up ip link add $IFACE type vxlan id 42 dev wg0 dstport 0
pre-up for peerip in $(cat /etc/wireguard/vxpeers); do \
ip a | egrep “$peerip\/” 2>&1 1> /dev/null || \
bridge fdb append to 00:00:00:00:00:00 dst $peerip dev $IFACE; done
post-down bridge fdb del 00:00:00:00:00:00 dev $IFACE
post-down ip link del $IFACE

И поднимем интерфейс:

ifup vxlan0

Этап 3 – Настройка динамической маршрутизации локальных сетей за маршрутизаторами

Для организации OSPF можно использовать Quagga или FRRouting.

Для FRRouting есть нюанс – после перезапуска конфигурация не применяется.
Чтобы решить эту проблему в файле /etc/frr/daemons надо переменную ospfd_options привести к виду:
ospfd_options=” -A 127.0.0.1 -f /etc/frr/ospfd.conf”

После установки выбранного пакета и активации ospfd подключимся к консоли OSPF:

telnet localhost ospfd

После ввода пароля вводим следующие команды:

enable
configure terminal
hostname router01 # для второго и третьего маршрутизаторов – router02 и router03 соответственно
access-list filter_connected_routes_alist permit 10.1.1.0/24 # для второго и третьего маршрутизаторов – 10.2.2.0/24 и 10.3.3.0/24 соответственно
access-list filter_connected_routes_alist deny any
route-map filter_connected_routes_rmap permit 10
match ip address filter_connected_routes_alist
interface vxlan0
ip ospf mtu-ignore
<Ctrl+D>
router ospf
ospf router-id 10.20.20.1 # для quagga – router-id 10.20.20.1 # для второго и третьего маршрутизаторов – 10.20.20.2 и 10.20.20.3 соответственно
redistribute connected metric 1 route-map filter_connected_routes_rmap
network 10.20.20.0/24 area 0
write memory

После этого выходим из консоли нажатиями Ctrl+D.
Через некоторое время (пол.минуты – минута) демоны ospfd обменяются конфигурацией и добавят динамические маршруты на всех маршрутизаторах.

Вот собственно и все – ваша корпоративная сеть готова. Осталось конечно добавить приоритезацию, мониторинг и многое другое, но об этом в следующих статьях.