0 Votes
Version 1.1 by Сергей Коршунов on 2023/01/27 08:43

Hide last authors
Сергей Коршунов 1.1 1 == Настройка WireGuard VPN на роутерах Mikrotik ==
2
3
4 Следующий очень важный момент: Wireguard доступен только в версии **RouterOS 7**, которая не смотря на статус **stable** все еще имеет достаточно "детских болезней" и прочих проблем, поэтому не стоит переходить на новую версию без вдумчивого анализа всех плюсов и минусов, а также предварительного тестирования.
5
6 В нашем случае будет использоваться **CHR** с **RouterOS 7.2.1** запущенная в виртуальной машине нашей тестовой лаборатории.
7
8 Как мы уже говорили, WireGuard - это простой туннель без сохранения состояния, к нему не применимы понятия **клиент** и **сервер**, каждый узел WireGuard способен подключаться к другим узлам и сам принимать соединения. Более правильно называть узлы сети - **пиры** (//peer//) - **инициатором** и **респондером**. Первый инициирует соединение, второй его принимает. Хотя даже в среде профессионалов к узлам WireGuard продолжают применяться термины клиент и сервер, первый подключается, второй принимает подключения. Большой беды в этом нет, но вы должны понимать, что любой узел WireGuard способен выполнять обе роли одновременно.
9
10 === Mikrotik как респондер (сервер) ===
11
12 В RouterOS 7 появился новый пункт меню - **WireGuard**, переходим в него на одноименную закладку и создаем новый интерфейс. Заполняем поля **Name** и **Listen Port**, их назначения понятны, советуем использовать осмысленные названия интерфейсов, чтобы вы могли понимать, для чего тот или иной предназначен. Ключи будут созданы автоматически.
13
14 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-001.png||alt="mikrotik-wireguard-001.png" height="452" width="488"]]Если вы предпочитаете работать в терминале, то выполните команду:
15
16 {{{/interface wireguard
17 add listen-port=34567 mtu=1420 name=wireguard-sts}}}
18
19 Затем присвоим созданному интерфейсу IP-адрес, для чего перейдем в **IP - Addresses** и просто добавим нужный адрес.
20
21 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-002.png||alt="mikrotik-wireguard-002.png" height="350" width="548"]]Или:
22
23 {{{/ip address
24 add address=10.10.0.1/24 interface=wireguard-sts network=10.10.0.0}}}
25
26 Также не забудьте разрешить входящие соединения на указанный при создании интерфейса порт, в нашем случае 34567. Это можно сделать в **IP - Firewall - Filter Rules** добавив правило: **Chain - input, Protocol - udp, Dst. Port - 34567, In. Interface - ether1** - в его качестве следует указать внешний интерфейс роутера. Действие можно не выбирать, так как по умолчанию - **accept**.
27
28 [[~[~[image:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-005-thumb-600xauto-14746.png~|~|alt="mikrotik-wireguard-005.png" height="267" width="600"~]~]>>url:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-005-14746.html]]Это же можно сделать командой:
29
30 {{{/ip firewall filter
31 add action=accept chain=input dst-port=34567 in-interface=ether1 protocol=udp}}}
32
33 Данное правило следует расположить перед запрещающим принимать входящие подключения на внешний интерфейс.
34
35 Чтобы к нашему роутеру могла подключаться другие узлы нужно создать для каждого из них пир, для этого возвращаемся в **WireGuard - Peers** и создаем новую запись. Здесь нам потребуется **открытый ключ** пира, который следует внести в поле **Public Key** и указать разрешенные сети в **Allowed Address**. В нашем случае мы реализуем сценарий удаленного доступа или объединения сетей, поэтому укажем там внутренний адрес в WireGuard сети, который мы выделили пиру и сеть за ним.
36
37 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-003.png||alt="mikrotik-wireguard-003.png" height="309" width="428"]]В терминале:
38
39 {{{/interface wireguard peers
40 add allowed-address=10.10.0.2/32,192.168.233.0/24 interface=wireguard-sts public-key="9pVP67ehKtQEr6BV46X9SuQrdvys+1QeVT0oeUg71wo="}}}
41
42 Еще раз напомним, что вся адресация внутри WireGuard сети назначается администратором вручную и явно прописывается для каждого пира с обоих сторон. Это один из недостатков WireGuard, который следует из его простоты.
43
44 С другой стороны, у нас, допустим, будет Windows. Быстро настраиваем там новый туннель, в разделе **Interface** добавляем выделенный узлу адрес, а в разделе **Peer** указываем публичный ключ Mikrotik, его адрес и порт, а в разделе разрешенных адресов добавим адрес WireGuard интерфейса и сети за роутером.
45
46 [[~[~[image:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-004-thumb-600xauto-14743.png~|~|alt="mikrotik-wireguard-004.png" height="470" width="600"~]~]>>url:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-004-14743.html]]Если вы нигде не ошиблись, то подключение будет установлено, и вы сможете получить доступ к сети за роутером. В случае нахождения пира за NAT не забывайте добавить опцию **PersistentKeepalive**.
47
48 [[~[~[image:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-006-thumb-600x384-14749.png~|~|alt="mikrotik-wireguard-006.png" height="384" width="600"~]~]>>url:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-006-14749.html]]Как видим, ничего сложного нет, но при большом количестве пиров прибавляется ручной работы: вы должны сами распределить адреса и прописать настройки с обоих сторон. Никаких средств автоматизации для этого не предусмотрено.
49
50 === Mikrotik как инициатор (клиент) ===
51
52 В данном разделе мы рассмотрим иной сценарий - использование WireGuard для доступа в интернет, но принципиальной разницы нет, если вы соединяете сети, то можно точно также настроить роутер и все будет работать. Просто мы дополнительно рассмотрим некоторые вопросы касающиеся маршрутизации.
53
54 Снова переходим в раздел WireGuard и создаем новый интерфейс. В данном случае достаточно только указать имя, порт нас не интересует, так как мы не собираемся принимать соединения, но его все-таки требуется указать, выбираем любой.
55
56 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-007.png||alt="mikrotik-wireguard-007.png" height="279" width="497"]]
57
58 Или вводим команду:
59
60 {{{/interface wireguard
61 add listen-port=13231 mtu=1420 name=wireguard-inet}}}
62
63 Затем назначаем интерфейсу адрес, если все узлы ваши - то назначаете сами, если подключаетесь к чужому респондеру, то вводите адрес, выданный его администратором. Это действие производится в **IP - Addresses**.
64
65 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-008.png||alt="mikrotik-wireguard-008.png" height="350" width="548"]]Это же действие в терминале:
66
67 {{{/ip address
68 add address=10.20.0.105/24 interface=wireguard-inet network=10.20.0.0}}}
69
70 Чтобы наш роутер смог куда-то подключиться мы снова должны создать пир. В WireGuard пир - это просто вторая сторона туннеля и не важно мы подключаемся к ней, или она к нам. В любом случае у нас должен быть интерфейс - наша сторона, и пир - противоположная сторона.
71
72 Переходим в **WireGuard - Peers** и создаем новый пир, настроек тут будет побольше, указываем:** Interface** - созданный нами интерфейс, **Public Key** - публичный ключ респондера, получаем с той стороны, **Endpoint** и **Endpoint Port** - адрес респондера и его порт, **Allowed Address** - 0.0.0.0/0 - т.е. разрешаем любой трафик в туннеле. Если вы находитесь за NAT, то обязательно добавьте опцию **Persistent Keepalive**, рекомендуемое значение - 25 секунд.
73
74 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-009.png||alt="mikrotik-wireguard-009.png" height="309" width="428"]]В терминале тоже достаточно длинная команда:
75
76 {{{/interface wireguard peers
77 add allowed-address=0.0.0.0/0 endpoint-address=x.x.x.x endpoint-port=34567 interface=wireguard-inet persistent-keepalive=25s public-key="kKxQ4wF+kUrpsTGwjMvlSwX45WV4nixG76/+sKlzEQA="}}}
78
79 Также не забудьте включить маскарадинг для созданного интерфейса, переходим в **IP - Firewall - NAT** и создаем новое правило, на закладке **General**: **Chain** - srcnat, **Src. Address** диапазон локальной сети, например, 192.168.72.0/24, **Out. Interface** - интерфейс WireGuard, в нашем случае wireguard-inet, на закладке **Action** выбираем действие **masquerade**.
80
81 Либо в терминале:
82
83 {{{/ip firewall nat
84 add action=masquerade chain=srcnat out-interface=wireguard-inet src-address=192.168.72.0/24}}}
85
86 Затем, с другой стороны, также потребуется создать пир для нашего роутера, вам понадобится публичный ключ и назначенный адрес.
87
88 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-010.png||alt="mikrotik-wireguard-010.png" height="72" width="516"]]
89
90
91 Перезапускаем службу и соединение будет установлено. Но трафик как шел через основного провайдера - так и идет. Почему так? Заглянем в таблицу маршрутизации, которая находится в IP - Routes, как видим нулевой маршрут как был через основного провайдера - так и остался. В отличие от официальных пакетов WireGuard, которые управляют маршрутами на хосте, в Mikrotik все отдано в руки администратора.
92
93 [[~[~[image:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-011-thumb-600xauto-14758.png~|~|alt="mikrotik-wireguard-011.png" height="249" width="600"~]~]>>url:https://interface31.ru/tech_it/assets_c/2022/04/mikrotik-wireguard-011-14758.html]]
94
95
96 А дальше все зависит от того, что именно мы хотим получить. Если нам нужен доступ через туннель к отдельным узлам, то просто достаточно создать для них отдельные маршруты. Создаем новое правило, в котором указываем нужный адрес и шлюз, в качестве которого будет выступать противоположный конец WireGuard туннеля.
97
98 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-012.png||alt="mikrotik-wireguard-012.png" height="278" width="429"]]
99
100 Теперь снова проверяем (мы добавили маршрут к сервису проверки IP) - все хорошо, мы обращаемся к данному узлу через VPN-сервер.
101
102 Добавить маршрут из командной строки можно следующим образом:
103
104 {{{/ip route
105 add disabled=yes distance=1 dst-address=172.67.74.128/32 gateway=10.20.0.1 pref-src=0.0.0.0 routing-table=main scope=30 suppress-hw-offload=no target-scope=10}}}
106
107 Если же мы хотим направить весь интернет трафик в туннель, то нам нужно изменить нулевой маршрут, казалось бы, все просто, но не будем спешить. Обратим внимание на флаги текущего маршрута:** DAd** - динамический, активный, получен по DHCP, можно, конечно отключить получение маршрутов в DHCP-клиенте, но мы пойдем другим путем.
108
109 Вспомним, что если к одной цели ведут несколько маршрутов, то будет выбран тот, у которого самая узкая маска. Поэтому вместо одного нулевого маршрута добавим два, к сетям** 0.0.0.0/1** и **128.0.0.0/1**.
110
111 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-014.png||alt="mikrotik-wireguard-014.png" height="280" width="429"]]В терминале выполните две команды:
112
113 {{{/ip route
114 add disabled=no distance=1 dst-address=0.0.0.0/1 gateway=10.20.0.1 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
115 add disabled=no distance=1 dst-address=128.0.0.0/1 gateway=10.20.0.1 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10}}}
116
117 Вроде бы все сделано правильно, но интернет вообще перестал работать. Что случилось? Мы только что завернули в туннель **весь** исходящий трафик, в том числе и к нашему VPN-серверу, естественно, что соединение будет невозможно.
118
119 Поэтому добавим еще один маршрут к респондеру через основного провайдера.
120
121 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-015.png||alt="mikrotik-wireguard-015.png" height="277" width="429"]]
122
123 Или:
124
125 {{{/ip route
126 add disabled=no dst-address=x.x.x.x/32 gateway=192.168.3.1 routing-table=main suppress-hw-offload=no}}}
127
128 Где **192.168.3.1** - шлюз основного провайдера.
129
130 После чего все снова заработает. При этом уже только по одному внешнему виду сайтов несложно понять, что мы работаем через VPN с точкой выхода в Германии.
131
132
133 Более подробные настройки для того или иного конкретного сценария выходят за рамки данной статьи и, как таковые, уже не относятся к настройкам WireGuard. Сам же WireGuard в RouterOS 7 есть и работает, при этом достаточно несложен в настройке, в чем мы только что убедились.