0 Голосов
Редактировал(а) Сергей Коршунов 2023/01/27 12:33

Последние авторы
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 Если вы предпочитаете работать в терминале, то выполните команду:
17
18 {{{/interface wireguard
19 add listen-port=34567 mtu=1420 name=wireguard-sts}}}
20
21 Затем присвоим созданному интерфейсу IP-адрес, для чего перейдем в **IP - Addresses** и просто добавим нужный адрес.
22
23 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-002.png||alt="mikrotik-wireguard-002.png" height="350" width="548"]]
24
25 Или:
26
27 {{{/ip address
28 add address=10.10.0.1/24 interface=wireguard-sts network=10.10.0.0}}}
29
30 Также не забудьте разрешить входящие соединения на указанный при создании интерфейса порт, в нашем случае 34567. Это можно сделать в **IP - Firewall - Filter Rules** добавив правило: **Chain - input, Protocol - udp, Dst. Port - 34567, In. Interface - ether1** - в его качестве следует указать внешний интерфейс роутера. Действие можно не выбирать, так как по умолчанию - **accept**.
31
32 [[~[~[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]]Это же можно сделать командой:
33
34 {{{/ip firewall filter
35 add action=accept chain=input dst-port=34567 in-interface=ether1 protocol=udp}}}
36
37 Данное правило следует расположить перед запрещающим принимать входящие подключения на внешний интерфейс.
38
39
40 **Добавление клиента с телефона:**
41
42
43 1) на телефона создаем новое подключение, вносим ip адрес vpn соединения (подсеть выделенная для vpn)
44
45 2) Генерим приватный и публичный ключ и публичный вносим на Mikrotik в созданный Peer
46
47 Чтобы к нашему роутеру могла подключаться другие узлы нужно создать для каждого из них пир, для этого возвращаемся в **WireGuard - Peers** и создаем новую запись. Здесь нам потребуется **открытый ключ** пира, который следует внести в поле **Public Key** и указать разрешенные сети в **Allowed Address**. В нашем случае мы реализуем сценарий удаленного доступа или объединения сетей, поэтому укажем там внутренний адрес в WireGuard сети, который мы выделили пиру и сеть за ним.
48
49 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-003.png||alt="mikrotik-wireguard-003.png" height="309" width="428"]]
50
51 В терминале:
52
53 {{{/interface wireguard peers
54 add allowed-address=10.10.0.2/32,192.168.233.0/24 interface=wireguard-sts public-key="9pVP67ehKtQEr6BV46X9SuQrdvys+1QeVT0oeUg71wo="}}}
55
56 3) Берем публичнй ключ с интерфейса сервера на Mikrotik и добавляем его в ПИР мобильного клиента:
57
58 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-001.png||alt="mikrotik-wireguard-001.png"]]
59
60 4) В ПИР вводим в поле Конечная точка, iP:порт сервера; разрешенные Ip-адреса 0.0.0.0/0
61
62 5) Сохраняем и подключаемся.
63
64
65 Чтобы к нашему роутеру могла подключаться другие узлы нужно создать для каждого из них пир, для этого возвращаемся в **WireGuard - Peers** и создаем новую запись. Здесь нам потребуется **открытый ключ** пира, который следует внести в поле **Public Key** и указать разрешенные сети в **Allowed Address**. В нашем случае мы реализуем сценарий удаленного доступа или объединения сетей, поэтому укажем там внутренний адрес в WireGuard сети, который мы выделили пиру и сеть за ним.
66
67 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-003.png||alt="mikrotik-wireguard-003.png" height="309" width="428"]]
68
69 В терминале:
70
71 {{{/interface wireguard peers
72 add allowed-address=10.10.0.2/32,192.168.233.0/24 interface=wireguard-sts public-key="9pVP67ehKtQEr6BV46X9SuQrdvys+1QeVT0oeUg71wo="}}}
73
74 Еще раз напомним, что вся адресация внутри WireGuard сети назначается администратором вручную и явно прописывается для каждого пира с обоих сторон. Это один из недостатков WireGuard, который следует из его простоты.
75
76 С другой стороны, у нас, допустим, будет Windows. Быстро настраиваем там новый туннель, в разделе **Interface** добавляем выделенный узлу адрес, а в разделе **Peer** указываем публичный ключ Mikrotik, его адрес и порт, а в разделе разрешенных адресов добавим адрес WireGuard интерфейса и сети за роутером.
77
78 [[~[~[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**.
79
80 [[~[~[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]]Как видим, ничего сложного нет, но при большом количестве пиров прибавляется ручной работы: вы должны сами распределить адреса и прописать настройки с обоих сторон. Никаких средств автоматизации для этого не предусмотрено.
81
82 === Mikrotik как инициатор (клиент) ===
83
84 В данном разделе мы рассмотрим иной сценарий - использование WireGuard для доступа в интернет, но принципиальной разницы нет, если вы соединяете сети, то можно точно также настроить роутер и все будет работать. Просто мы дополнительно рассмотрим некоторые вопросы касающиеся маршрутизации.
85
86 Снова переходим в раздел WireGuard и создаем новый интерфейс. В данном случае достаточно только указать имя, порт нас не интересует, так как мы не собираемся принимать соединения, но его все-таки требуется указать, выбираем любой.
87
88 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-007.png||alt="mikrotik-wireguard-007.png" height="279" width="497"]]
89
90 Или вводим команду:
91
92 {{{/interface wireguard
93 add listen-port=13231 mtu=1420 name=wireguard-inet}}}
94
95 Затем назначаем интерфейсу адрес, если все узлы ваши - то назначаете сами, если подключаетесь к чужому респондеру, то вводите адрес, выданный его администратором. Это действие производится в **IP - Addresses**.
96
97 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-008.png||alt="mikrotik-wireguard-008.png" height="350" width="548"]]Это же действие в терминале:
98
99 {{{/ip address
100 add address=10.20.0.105/24 interface=wireguard-inet network=10.20.0.0}}}
101
102 Чтобы наш роутер смог куда-то подключиться мы снова должны создать пир. В WireGuard пир - это просто вторая сторона туннеля и не важно мы подключаемся к ней, или она к нам. В любом случае у нас должен быть интерфейс - наша сторона, и пир - противоположная сторона.
103
104 Переходим в **WireGuard - Peers** и создаем новый пир, настроек тут будет побольше, указываем:** Interface** - созданный нами интерфейс, **Public Key** - публичный ключ респондера, получаем с той стороны, **Endpoint** и **Endpoint Port** - адрес респондера и его порт, **Allowed Address** - 0.0.0.0/0 - т.е. разрешаем любой трафик в туннеле. Если вы находитесь за NAT, то обязательно добавьте опцию **Persistent Keepalive**, рекомендуемое значение - 25 секунд.
105
106 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-009.png||alt="mikrotik-wireguard-009.png" height="309" width="428"]]В терминале тоже достаточно длинная команда:
107
108 {{{/interface wireguard peers
109 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="}}}
110
111 Также не забудьте включить маскарадинг для созданного интерфейса, переходим в **IP - Firewall - NAT** и создаем новое правило, на закладке **General**: **Chain** - srcnat, **Src. Address** диапазон локальной сети, например, 192.168.72.0/24, **Out. Interface** - интерфейс WireGuard, в нашем случае wireguard-inet, на закладке **Action** выбираем действие **masquerade**.
112
113 Либо в терминале:
114
115 {{{/ip firewall nat
116 add action=masquerade chain=srcnat out-interface=wireguard-inet src-address=192.168.72.0/24}}}
117
118 Затем, с другой стороны, также потребуется создать пир для нашего роутера, вам понадобится публичный ключ и назначенный адрес.
119
120 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-010.png||alt="mikrotik-wireguard-010.png" height="72" width="516"]]
121
122
123 Перезапускаем службу и соединение будет установлено. Но трафик как шел через основного провайдера - так и идет. Почему так? Заглянем в таблицу маршрутизации, которая находится в IP - Routes, как видим нулевой маршрут как был через основного провайдера - так и остался. В отличие от официальных пакетов WireGuard, которые управляют маршрутами на хосте, в Mikrotik все отдано в руки администратора.
124
125 [[~[~[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]]
126
127
128 А дальше все зависит от того, что именно мы хотим получить. Если нам нужен доступ через туннель к отдельным узлам, то просто достаточно создать для них отдельные маршруты. Создаем новое правило, в котором указываем нужный адрес и шлюз, в качестве которого будет выступать противоположный конец WireGuard туннеля.
129
130 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-012.png||alt="mikrotik-wireguard-012.png" height="278" width="429"]]
131
132 Теперь снова проверяем (мы добавили маршрут к сервису проверки IP) - все хорошо, мы обращаемся к данному узлу через VPN-сервер.
133
134 Добавить маршрут из командной строки можно следующим образом:
135
136 {{{/ip route
137 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}}}
138
139 Если же мы хотим направить весь интернет трафик в туннель, то нам нужно изменить нулевой маршрут, казалось бы, все просто, но не будем спешить. Обратим внимание на флаги текущего маршрута:** DAd** - динамический, активный, получен по DHCP, можно, конечно отключить получение маршрутов в DHCP-клиенте, но мы пойдем другим путем.
140
141 Вспомним, что если к одной цели ведут несколько маршрутов, то будет выбран тот, у которого самая узкая маска. Поэтому вместо одного нулевого маршрута добавим два, к сетям** 0.0.0.0/1** и **128.0.0.0/1**.
142
143 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-014.png||alt="mikrotik-wireguard-014.png" height="280" width="429"]]В терминале выполните две команды:
144
145 {{{/ip route
146 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
147 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}}}
148
149 Вроде бы все сделано правильно, но интернет вообще перестал работать. Что случилось? Мы только что завернули в туннель **весь** исходящий трафик, в том числе и к нашему VPN-серверу, естественно, что соединение будет невозможно.
150
151 Поэтому добавим еще один маршрут к респондеру через основного провайдера.
152
153 [[image:https://interface31.ru/tech_it/images/mikrotik-wireguard-015.png||alt="mikrotik-wireguard-015.png" height="277" width="429"]]
154
155 Или:
156
157 {{{/ip route
158 add disabled=no dst-address=x.x.x.x/32 gateway=192.168.3.1 routing-table=main suppress-hw-offload=no}}}
159
160 Где **192.168.3.1** - шлюз основного провайдера.
161
162 После чего все снова заработает. При этом уже только по одному внешнему виду сайтов несложно понять, что мы работаем через VPN с точкой выхода в Германии.
163
164
165 Более подробные настройки для того или иного конкретного сценария выходят за рамки данной статьи и, как таковые, уже не относятся к настройкам WireGuard. Сам же WireGuard в RouterOS 7 есть и работает, при этом достаточно несложен в настройке, в чем мы только что убедились.