MikroTik: Туннель IPsec (Site-to-Site)

MikroTik: Туннель IPsec (Site-to-Site)

Объединение двух маршрутизаторов между собой при помощи туннеля #IPsec.

В WAN IP у меня используются суб-домены. К суб-доменам через A-запись в #DNS прописаны внешние IP-адреса маршрутизаторов. При помощи скрипта из статьи MikroTik и CloudFlare: Динамический IP для домена у меня каждый маршрутизатор имеет актуальный 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

  • Добавляем профиль #IPsec:
    • Имя профиля: ipsec-sts.
    • Группа Diffie-Hellman (стойкость шифрования): ecp384.
    • Алгоритм шифрования: aes-256.
1
2
/ip ipsec profile
add dh-group=ecp384 enc-algorithm=aes-256 name=ipsec-sts
  • Добавляем представление #IPsec:
    • Имя представления: ipsec-sts.
    • Алгоритм аутентификации: sha256.
    • Алгоритм шифрования: aes-256-cbc.
    • Группа Diffie-Hellman (стойкость шифрования): ecp384.
1
2
/ip ipsec proposal
add auth-algorithms=sha256 enc-algorithms=aes-256-cbc name=ipsec-sts pfs-group=ecp384
  • Добавляем #IPsec peer:
    • Имя peer’а: GW2.
    • Внешний адрес R2: gw2.example.com.
    • Профиль: ipsec-sts.
    • Режим обмена: ike2.
    • Комментарий: GW2.
1
2
/ip ipsec peer
add address="gw2.example.com" exchange-mode=ike2 name=GW2 profile=ipsec-sts comment="GW2"
  • Добавляем идентификацию:
    • Peer: GW2.
    • Секретная фраза: PassWord.
      Секретная фраза должна быть одинаковой на обоих маршрутизаторах.
    • Комментарий: GW2.
1
2
/ip ipsec identity
add peer=GW2 secret="PassWord" comment="GW2"
  • Добавляем политику #IPsec:
    • Peer: GW2.
    • Туннель: yes.
    • Адрес локальной сети R1: 10.1.0.0/16.
    • Адрес удалённой сети R2: 10.2.0.0/16.
    • Действие: encrypt.
    • Представление: ipsec-sts.
    • Комментарий: GW1-GW2.
1
2
/ip ipsec policy
add src-address=10.1.0.0/16 dst-address=10.2.0.0/16 tunnel=yes action=encrypt proposal=ipsec-sts peer=GW2 comment="GW1-GW2"
  • Исключаем обработку трафика #IPsec:
    • Адрес локальной сети R1: 10.1.0.0/16.
    • Адрес удалённой сети R2: 10.2.0.0/16.
    • Комментарий: [IPsec] GW1-GW2.
1
2
/ip firewall nat
add chain=srcnat action=accept src-address=10.1.0.0/16 dst-address=10.2.0.0/16 place-before=0 comment="[IPsec] GW1-GW2"
  • Настраивает фильтры брандмауэра:
    • Открыть порты 500 и 4500 по протоколу UDP.
    • Разрешить трафик по протоколу ipsec-esp.
1
2
3
/ip firewall filter
add action=accept chain=input dst-port=500,4500 in-interface-list=WAN protocol=udp comment="[ROS] IPsec"
add action=accept chain=input in-interface-list=WAN protocol=ipsec-esp comment="[ROS] IPsec"
  • Настраиваем обход отслеживания соединений #IPsec для снижения нагрузки на CPU маршрутизатора:
    • Пакеты из удалённой сети 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
/ip firewall raw
add action=notrack chain=prerouting src-address=10.2.0.0/16 dst-address=10.1.0.0/16 comment="[IPsec] GW2-GW1"
add action=notrack chain=prerouting src-address=10.1.0.0/16 dst-address=10.2.0.0/16 comment="[IPsec] GW1-GW2"

Router #2

  • Добавляем профиль #IPsec:
    • Имя профиля: ipsec-sts.
    • Группа Diffie-Hellman (стойкость шифрования): ecp384.
    • Алгоритм шифрования: aes-256.
1
2
/ip ipsec profile
add dh-group=ecp384 enc-algorithm=aes-256 name=ipsec-sts
  • Добавляем представление #IPsec:
    • Имя представления: ipsec-sts.
    • Алгоритм аутентификации: sha256.
    • Алгоритм шифрования: aes-256-cbc.
    • Группа Diffie-Hellman (стойкость шифрования): ecp384.
1
2
/ip ipsec proposal
add auth-algorithms=sha256 enc-algorithms=aes-256-cbc name=ipsec-sts pfs-group=ecp384
  • Добавляем #IPsec peer:
    • Имя peer’а: GW1.
    • Внешний адрес R1: gw1.example.com.
    • Профиль: ipsec-sts.
    • Режим обмена: ike2.
    • Комментарий: GW1.
1
2
/ip ipsec peer
add address="gw1.example.com" exchange-mode=ike2 name=GW1 profile=ipsec-sts comment="GW1"
  • Добавляем идентификацию:
    • Peer: GW1.
    • Секретная фраза: PassWord.
      Секретная фраза должна быть одинаковой на обоих маршрутизаторах.
    • Комментарий: GW1.
1
2
/ip ipsec identity
add peer=GW1 secret="PassWord" comment="GW1"
  • Добавляем политику #IPsec:
    • Peer: GW1.
    • Туннель: yes.
    • Адрес локальной сети R2: 10.2.0.0/16.
    • Адрес удалённой сети R1: 10.1.0.0/16.
    • Действие: encrypt.
    • Представление: ipsec-sts.
    • Комментарий: GW2-GW1.
1
2
/ip ipsec policy
add src-address=10.2.0.0/16 dst-address=10.1.0.0/16 tunnel=yes action=encrypt proposal=ipsec-sts peer=GW1 comment="GW2-GW1"
  • Исключаем обработку трафика #IPsec:
    • Адрес локальной сети R2: 10.2.0.0/16.
    • Адрес удалённой сети R1: 10.1.0.0/16.
    • Комментарий: [IPsec] GW2-GW1.
1
2
/ip firewall nat
add chain=srcnat action=accept src-address=10.2.0.0/16 dst-address=10.1.0.0/16 place-before=0 comment="[IPsec] GW2-GW1"
  • Настраивает фильтры брандмауэра:
    • Открыть порты 500 и 4500 по протоколу UDP.
    • Разрешить трафик по протоколу ipsec-esp.
1
2
3
/ip firewall filter
add action=accept chain=input dst-port=500,4500 in-interface-list=WAN protocol=udp comment="[ROS] IPsec"
add action=accept chain=input in-interface-list=WAN protocol=ipsec-esp comment="[ROS] IPsec"
  • Настраиваем обход отслеживания соединений #IPsec для снижения нагрузки на CPU маршрутизатора:
    • Пакеты из удалённой сети 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
/ip firewall raw
add action=notrack chain=prerouting src-address=10.1.0.0/16 dst-address=10.2.0.0/16 comment="[IPsec] GW1-GW2"
add action=notrack chain=prerouting src-address=10.2.0.0/16 dst-address=10.1.0.0/16 comment="[IPsec] GW2-GW1"

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

Сделал небольшой скрипт, который позволяет быстро развернуть туннель между двумя маршрутизаторами. Скрипт запускается отдельно на каждом из маршрутизаторов со своими настройками.

ros.ipsec.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# @package    MikroTik / RouterOS / IPsec
# @author     Kai Kimera <mail@kai.kim>
# @copyright  2024 Library Online
# @license    MIT
# @version    0.1.0
# @link       https://lib.onl/ru/articles/2024/03/54a2b39f-38b4-5f0c-9b54-310f853da38f/
# -------------------------------------------------------------------------------------------------------------------- #

# IPsec secret phrase.
:local ipsSecret "PassWord"

# IPsec external interface.
:local ipsInterface "WAN"

# IPsec profile name.
:local ipsProfileName "ipsec-sts"

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

# Local router name.
:local ipsLocalName "GW1"

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

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

# Remote router name.
:local ipsRemoteName "GW2"

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

# Remote external IP address.
:local ipsRemoteWanIp "gw2.example.com"

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

/ip ipsec profile
add dh-group=ecp384 enc-algorithm=aes-256 name=$ipsProfileName

/ip ipsec proposal
add auth-algorithms=sha256 enc-algorithms=aes-256-cbc pfs-group=ecp384 name=$ipsProfileName

/ip ipsec peer
add address=$ipsRemoteWanIp exchange-mode=ike2 name=$ipsRemoteName profile=$ipsProfileName \
  comment="$ipsRemoteName"

/ip ipsec identity
add peer=$ipsRemoteName secret="$ipsSecret" \
  comment="$ipsRemoteName"

/ip ipsec policy
add src-address=$ipsLocalNetwork dst-address=$ipsRemoteNetwork tunnel=yes action=encrypt \
  proposal=$ipsProfileName peer=$ipsRemoteName \
  comment="$ipsLocalName-$ipsRemoteName"

/ip firewall nat
add chain=srcnat action=accept src-address=$ipsLocalNetwork dst-address=$ipsRemoteNetwork place-before=0 \
  comment="[IPsec] $ipsLocalName-$ipsRemoteName"

/ip firewall filter
add action=accept chain=input dst-port=500,4500 in-interface-list=$ipsWan protocol=udp \
  comment="[ROS] IPsec"
add action=accept chain=input in-interface-list=$ipsWan protocol=ipsec-esp \
  comment="[ROS] IPsec"

# Use IP/Firewall/Raw to bypass connection tracking, that way eliminating need of filter rules and reducing load on CPU
# by approximately 30%.
/ip firewall raw
add action=notrack chain=prerouting src-address=$ipsRemoteNetwork dst-address=$ipsLocalNetwork \
  comment="[IPsec] $ipsRemoteName-$ipsLocalName"
add action=notrack chain=prerouting src-address=$ipsLocalNetwork dst-address=$ipsRemoteNetwork \
  comment="[IPsec] $ipsLocalName-$ipsRemoteName"
Категории
Авторы
Мета
Лицензия
ID файла
UUID
Системный путь
Тип
Статистика
Количество слов
Время чтения
мин.