Объединение двух маршрутизаторов между собой при помощи туннеля #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
.
- Добавляем профиль #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"
|
- Добавляем профиль #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"
|
Сделал небольшой скрипт, который позволяет быстро развернуть туннель между двумя маршрутизаторами. Скрипт запускается отдельно на каждом из маршрутизаторов со своими настройками.
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/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"
|