Wiki source code of Настройка WireGuard VPN на роутерах Mikrotik
Version 1.1 by Сергей Коршунов on 2023/01/27 08:43
Show last authors
author | version | line-number | content |
---|---|---|---|
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 есть и работает, при этом достаточно несложен в настройке, в чем мы только что убедились. |