Объединение двух маршрутизаторов между собой при помощи туннеля #IPsec.
В WAN IP у меня используются суб-домены. К суб-доменам через A-запись в #DNS прописаны внешние IP-адреса маршрутизаторов. При помощи скрипта из статьи MikroTik и CloudFlare: Динамический IP для домена у меня каждый маршрутизатор имеет актуальный IP-адрес в суб-домене.
- Маршрутизатор
R1:- WAN IP:
gw1.example.org. - LAN IP:
10.1.0.1. - Network:
10.1.0.0/16.
- Маршрутизатор
R2:- WAN IP:
gw2.example.org. - 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.org. - Профиль:
ipsec-sts. - Режим обмена:
ike2. - Комментарий:
GW2.
1
2
| /ip ipsec peer
add address="gw2.example.org" 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.org. - Профиль:
ipsec-sts. - Режим обмена:
ike2. - Комментарий:
GW1.
1
2
| /ip ipsec peer
add address="gw1.example.org" 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.org"
# -------------------------------------------------------------------------------------------------------------------- #
# -----------------------------------------------------< 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"
|