MikroTik: Туннель WireGuard (Site-to-Site) + OSPF

MikroTik: Туннель WireGuard (Site-to-Site) + OSPF

Объединение двух маршрутизаторов между собой при помощи туннеля #WireGuard. При этом, обмениваться маршрутами эти маршрутизаторы будут через протокол #OSPF.

В качестве WAN IP я использую суб-домены. #WireGuard позволяет использовать суб-домены как EndPoint’ы, а уже к суб-доменам приписываются IP-адреса маршрутизаторов. Подобная схема наиболее универсальная, так как не в каждом случае имеется внешний статический IP-адрес, но при использовании скрипта из статьи MikroTik и CloudFlare: Динамический IP для домена любой адрес маршрутизатора можно превратить в статический через суб-домен.

Вводные данные

  • Маршрутизатор R1:
    • WAN IP: gw1.example.com.
    • LAN IP: 10.1.0.1.
    • Network: 10.1.0.0/16.
  • Маршрутизатор R2:
    • WAN IP: gw2.example.com.
    • LAN IP: 10.2.0.1.
    • Network: 10.2.0.0/16.

Настройка маршрутизаторов

Router #1

  • Создаём интерфейс #WireGuard:
    • Номер порта: 51820.
    • Название интерфейса: wireguard-sts.
    • Комментарий: WireGuard (Site-to-Site).
1
2
/interface wireguard
add listen-port=51820 name=wireguard-sts comment="WireGuard (Site-to-Site)"
  • Прописываем интерфейсу IP-адрес 10.255.255.1/24:
    • Адрес интерфейса: 10.255.255.1/24.
    • Интерфейс: wireguard-sts.
    • Комментарий: [WG] WireGuard (Site-to-Site).
1
2
/ip address
add address=10.255.255.1/24 interface=wireguard-sts comment="[WG] WireGuard (Site-to-Site)"
  • Указываем маршрут до удалённой сети R2:
    • Адрес удалённой сети R2: 10.2.0.0/16.
    • Шлюз R2: 10.255.255.2.
    • Комментарий: [WG] GW1-GW2.
1
2
/ip route
add dst-address=10.2.0.0/16 gateway=10.255.255.2 comment="[WG] GW1-GW2"
  • Настраиваем фильтры брандмауэра:
    • Открыть порт 51820.
    • Разрешить трафик из удалённой сети R2 10.2.0.0/16 в локальную сеть R1 10.1.0.0/16.
    • Разрешить трафик из локальной сети R1 10.1.0.0/16 в удалённую сеть R2 10.2.0.0/16.
1
2
3
4
/ip firewall filter
add action=accept chain=input dst-port=51820 in-interface-list=WAN protocol=udp comment="[WG] WireGuard (Site-to-Site)"
add action=accept chain=forward src-address=10.2.0.0/16 dst-address=10.1.0.0/16 comment="[WG] GW2-GW1"
add action=accept chain=forward src-address=10.1.0.0/16 dst-address=10.2.0.0/16 comment="[WG] GW1-GW2"

Router #2

  • Создаём интерфейс #WireGuard:
    • Номер порта: 51820.
    • Название интерфейса: wireguard-sts.
    • Комментарий: WireGuard (Site-to-Site).
1
2
/interface wireguard
add listen-port=51820 name=wireguard-sts comment="WireGuard (Site-to-Site)"
  • Прописываем интерфейсу IP-адрес 10.255.255.2/24:
    • Адрес интерфейса: 10.255.255.2/24.
    • Интерфейс: wireguard-sts.
    • Комментарий: [WG] WireGuard (Site-to-Site).
1
2
/ip address
add address=10.255.255.2/24 interface=wireguard-sts comment="WireGuard (Site-to-Site)"
  • Указываем маршрут до удалённой сети R1:
    • Адрес удалённой сети R1: 10.1.0.0/16.
    • Шлюз R1: 10.255.255.1.
    • Комментарий: [WG] GW2-GW1.
1
2
/ip route
add dst-address=10.1.0.0/16 gateway=10.255.255.1 comment="[WG] GW2-GW1"
  • Настраиваем фильтры брандмауэра:
    • Открыть порт 51820.
    • Разрешить трафик из удалённой сети R1 10.1.0.0/16 в локальную сеть R2 10.2.0.0/16.
    • Разрешить трафик из локальной сети R2 10.2.0.0/16 в удалённую сеть R1 10.1.0.0/16.
1
2
3
4
/ip firewall filter
add action=accept chain=input dst-port=51820 in-interface-list=WAN protocol=udp comment="[WG] WireGuard (Site-to-Site)"
add action=accept chain=forward src-address=10.1.0.0/16 dst-address=10.2.0.0/16 comment="[WG] GW1-GW2"
add action=accept chain=forward src-address=10.2.0.0/16 dst-address=10.1.0.0/16 comment="[WG] GW2-GW1"

Автоматизация

Написал небольшой сценарий для разворачивания интерфейса WireGuard на маршрутизаторах. Настройки сценария, естественно, разные под каждый из маршрутизаторов. А вот добавлять peer’ы придётся вручную.

ros.wg.rsc
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# @package    MikroTik / RouterOS / WireGuard
# @author     Kai Kimera <mail@kai.kim>
# @copyright  2024 Library Online
# @license    MIT
# @version    0.1.0
# @link       https://lib.onl/ru/articles/2024/04/146e83d5-f571-5273-9a29-172bf5dc10fe/
# -------------------------------------------------------------------------------------------------------------------- #

# WireGuard interface name.
:local wgName "wireguard-sts"

# WireGuard interface IP address.
:local wgIp "10.255.255.1/24"

# WireGuard port number.
:local wgPort "51820"

# -------------------------------------------------------------------------------------------------------------------- #
# Local router.
# -------------------------------------------------------------------------------------------------------------------- #

# Local router name.
:local wgLocalName "GW1"

# Local network address.
:local wgLocalNetwork "10.1.0.0/16"

# -------------------------------------------------------------------------------------------------------------------- #
# Remote router.
# -------------------------------------------------------------------------------------------------------------------- #

# Remote router name.
:local wgRemoteName "GW2"

# Remote network address.
:local wgRemoteNetwork "10.2.0.0/16"

# -------------------------------------------------------------------------------------------------------------------- #
# -----------------------------------------------------< SCRIPT >----------------------------------------------------- #
# -------------------------------------------------------------------------------------------------------------------- #

/interface wireguard
add listen-port=$wgPort name=$wgName \
  comment="[WG] $wgName:$wgPort"

/ip address
add address=$wgIp interface=$wgName \
  comment="[WG] $wgName:$wgPort"

/ip route
add dst-address=$wgRemoteNetwork gateway=$wgName \
  comment="[WG] $wgLocalName-$wgRemoteName"

/ip firewall filter
add action=accept chain=input dst-port=$wgPort in-interface-list=WAN protocol=udp \
  comment="[WG] $wgName:$wgPort"
add action=accept chain=forward src-address=$wgRemoteNetwork dst-address=$wgLocalNetwork \
  comment="[WG] $wgRemoteName-$wgLocalName"
add action=accept chain=forward src-address=$wgLocalNetwork dst-address=$wgRemoteNetwork \
  comment="[WG] $wgLocalName-$wgRemoteName"

Добавление peer’ов

Router #1

  • Добавить маршрутизатор R2 в Peers:
    • Интерфейс: wireguard-sts.
    • Публичный ключ маршрутизатора R2: <public-key>.
      Публичный ключ берём от маршрутизатора R2.
    • Адрес EndPoint маршрутизатора R2: gw2.example.com.
    • Порт EndPoint маршрутизатора R2: 51820.
    • Разрешённые адреса:
      • 10.2.0.0/16 - адрес удалённой сети маршрутизатора R2.
      • 10.255.255.0/24 - общий адрес интерфейсов wireguard-sts обоих маршрутизаторов.
      • 224.0.0.5/32 - мультикастовый адрес протокола #OSPF.
        Без этого параметра не будет работать протокол #OSPF.
    • Комментарий: [WG] GW2.
1
2
/interface wireguard peers
add allowed-address=10.2.0.0/16,10.255.255.0/24,224.0.0.5/32 endpoint-address=gw2.example.com endpoint-port=51820 interface=wireguard-sts public-key="<public-key>" comment="[WG] GW2"

Router #2

  • Добавить маршрутизатор R1 в Peers:
    • Интерфейс: wireguard-sts.
    • Публичный ключ маршрутизатора R1: <public-key>.
      Публичный ключ берём от маршрутизатора R1.
    • Адрес EndPoint маршрутизатора R1: gw1.example.com.
    • Порт EndPoint маршрутизатора R1: 51820.
    • Разрешённые адреса:
      • 10.1.0.0/16 - адрес удалённой сети маршрутизатора R1.
      • 10.255.255.0/24 - общий адрес интерфейсов wireguard-sts обоих маршрутизаторов.
      • 224.0.0.5/32 - мультикастовый адрес протокола #OSPF.
        Без этого параметра не будет работать протокол #OSPF.
    • Комментарий: [WG] GW1.
1
2
/interface wireguard peers
add allowed-address=10.1.0.0/16,10.255.255.0/24,224.0.0.5/32 endpoint-address=gw1.example.com endpoint-port=51820 interface=wireguard-sts public-key="<public-key>" comment="[WG] GW1"

Настройка OSPF

  • Создаём инстанс:
    • Название: ospf-instance-wg.
1
2
/routing ospf instance
add name=ospf-instance-wg
  • Добавляем Area:
    • Название Area: backbone.
    • Название инстанса: ospf-instance-wg.
1
2
/routing ospf area
add instance=ospf-instance-wg name=backbone
  • Настраиваем шаблоны:
    • Интерфейс bridge1.
      • Area: backbone.
    • Интерфейс wireguard-sts.
      • Area: backbone.
      • Type: PTP (Point-to-Point).
1
2
3
/routing ospf interface-template
add area=backbone interfaces=bridge1
add area=backbone interfaces=wireguard-sts type=ptp
  • Настраиваем фильтры брандмауэра:
    • Разрешить протокол #OSPF на интерфейсе wireguard-sts.
1
2
/ip firewall filter
add action=accept chain=input in-interface=wireguard-sts protocol=ospf comment="[WG] OSPF"
Категории
Авторы
Мета
Лицензия
ID файла
UUID
Системный путь
Тип
Статистика
Количество слов
Время чтения
мин.