Введение
После недавнего приобретения роутера MikroTik, у меня встала задача настроить на нём WireGuard сервер для удалённых клиентов (не для обхода блокировок). Я не являюсь продвинутым системным или сетевым администратором. До этого мои познания ограничивались первичной настройкой роутера от интернет-провайдера через UI, и потому я обратился к Интернету.
Несмотря на документацию по RouterOS, на обилие статей по настройке WireGuard на MikroTik, у меня возникли сложности. Подавляющее большинство статей предполагает, что вы знаете, что такое WireGuard, принципы его работы и настройки, и сфокусированы исключительно на командах и/или интерфейсе MikroTik.
Если вы, как и я, никогда до этого не настраивали сервер WireGuard, то это статья для вас.
WireGuard доступен начиная с версии RouterOS 7. Если у вас версия ниже, то вам сначала надо обновить RouterOS.
Немного о WireGuard
Совсем немного. Только то, что нам понадобится для настройки:
WireGuard работает с отдельной подсетью - нам надо определиться с размером подсети, её адресом и маской;
WireGuard не раздает IP адреса - нам надо определиться со статическими IP адресами для сервера и клиента, которые входят в подсеть;
WireGuard устанавливает безопасное соединение, используя асимметричные ключи - нам нужно будет создать ключ для клиента; ключ для сервера MikroTik создает сам;
WireGuard работает через отдельный виртуальный сетевой интерфейс - нам будет нужно создать такой интерфейс;
WireGuard использует Peer-To-Peer соединение - соответственно, нам нужно настроить два пира: один - на сервере, другой - на клиенте;
WireGuard работает по UDP протоколу - этот факт нам нужен для настройки фаервола.
Планируем сеть
Если вы не знаете или забыли, что такое IP адрес, адрес подсети и маска подсети, то рекомендую прочитать Еще раз про IP-адреса, маски подсетей и вообще.
Это - увлекательная тема сама по себе.
Сколько клиентов?
Сначала, что такое - клиент? Клиент, это устройство, которое будет устанавливать соединение с нашим сервером. Это может быть WireGuard клиент на компьютере пользователя, WireGuard клиент на роутере или WireGuard клиент, запущенный в докере.
Т.е. мы считаем только прямые подключения. Если компьютеры, подключаются к роутеру, а уже роутер подключается как WireGuard клиент, то у вас только один клиент - роутер.
Итак, сколько у вас будет клиентов? В моём случае один. Значит мне достаточно двух адресов: один для сервера, другой для клиента. Мне подходит любая сеть, у которой есть два адреса.
Подсеть
В моём случае я выбрал 192.168.99.4/30
. Почему?
192.168.x.x
- внутренний диапазон, который используется во внутренних сетях. Существуют и другие внутренние диапазоны. Выбирайте на ваш вкус.
x.x.99.x
- я решил, что это будет диапазон для VPN сетей. Вы можете выбрать любое другое число, в пределах разрешенных.
x.x.x.4/30
- это номер и размер конкретной подсети. 30
определяет размер сети. Считается следующим образом:
32 - 30 = 2
- то есть на адрес узла у нас 2 бита.2 бита - - нам дают четыре варианта. Первый и последний (
00
и11
) не используем (см. Еще раз про IP-адреса, маски подсетей и вообще). Остается01
и10
, т.е. два узла - сервер и один клиент.Соответственно, все числа, у которых последние два бита
0
, могут быть номером сети:0000
,0100
,1000
,1100
и т.д. Можно брать любое. Я взял второе -0100
или4
в десятеричной системе.
Четыре бита использовались для краткости. Не забываем, что в адресе 32 бита.
Если у вас будет больше клиентов, то и размер сети должен быть больше. Например, x.x.x.x/29
дает шесть доступных адресов:
Для сервера выбираем 192.168.99.5
(адрес сети 4
+ 1); для клиента - 192.168.99.6
(адрес сети 4
+ 2).
Почему не выбрал
192.168.99.0/24
? Если мне понадобиться добавить еще VPN сети, то я могу использовать тот же диапазон:192.168.99.x
. В случае с192.168.99.0/24
, мне придется использовать другой диапазон, например192.168.98.0/24
. Это не большая проблема в моём случае, но я люблю, когда есть какая-то организация.
Создаем ключ для клиента
Каждый WireGuard клиент должен иметь свой асимметричный ключ. Этот ключ может быть создан несколькими способами. Самый простой - использовать WireGuard Client или утилиту wg.
Если вы знакомы с OpenSSL, то можете использовать её для создания ключа.
Создаём ключ и сохраняем его для каждого клиента. В моём случае всего один.
Настройка WireGuard сервера
Наконец-то потрогаем MikroTik!
Трогать MikroTik буду через терминал. Честно говоря, мне очень понравилось работать через терминал: цветовое выделение кода и автозаполнение по Tab делают жизнь гораздо легче. RouterOS UI регулярно обновляется, что делает скриншоты быстро устаревшими.
Итак, открываем терминал и подключаемся к роутеру через ssh
.
Немного про терминал RouterOS
RouterOS имеет иерархическую систему команд. Если вы войдете в Web UI, то на верхнем уровне вы увидите
WiFi
Wireless
Interfaces
WireGuard
и т.д.
Если вы войдете в Interfaces
, то увидите несколько закладок, соответствущие второму уровню.
Терминал имеет похожую иерархию в виде "директорий". Например, набирая /interface/wireguard/
и нажимая Enter
вы попадаете в подменю:
[admin@MikroTik] /interface/wireguard>
После это все набранные команды относятся к этому подменю и вам не надо набирать /interface/wireguard/
снова и снова.
Чтобы попасть на верхний уровень набираете /
и жмёте Enter
.
Чтобы выйти из терминала набираете /quit
и жмёте Enter
.
Создаем сетевой интерфейс
/interface/wireguard/
add listen-port=51820 name=wireguard1 comment="Test WireGuard Interface"
Я взял стандартный порт, но вы можете указать любой свободный. Имя интерфейса и комментарий указываете по вашему вкусу.
Если теперь набрать команду print
, то вы увидите информацию о созданных WireGuard интерфейсах, включая их ключи.
Эта информация нам понадобится при создании конфигурации для клиента.
Теперь войдём в меню IP адресов и назначим только что созданному интерфейсу адрес и сеть, которые мы ранее определили для сервера.
/ip/address/
add address=192.168.99.5/30 interface=wireguard1 network=192.168.99.4 comment="IP Address for WireGuard Server"
Создаём пир (peer) для клиента
/interface/wireguard/peers/
add endpoint-address=<public IP address> endpoint-port=51820 interface=wireguard1 allowed-address=192.168.99.4/30 public-key="<public client key>" comment="WireGuard Client Peer"
Что откуда берётся:
endpoint-address
- это статический IP адрес, выданный вам вашим интернет-провайдером. Это внешний адрес, к которому будет обращаться клиент;endpoint-port
- это порт, который мы назначили сетевому интерфейсу;interface
- это имя, созданного сетевого интерфейса;allowed-address
- это подсеть, которую мы ранее определили.public-key
- это публичный ключ клиента, который мы создали ранее.
Если у вас несколько клиентов, то для каждого надо создать свой пир (peer). Каждый пир будет отличаться публичным ключом клиента.
Разрешаем клиенту общаться с нашим сервером
/ip/firewall/filter/
add action=accept chain=input dst-port=51820 in-interface=ether1 protocol=udp place-before=1 comment="Filter for WireGuard Client"
Что откуда берётся:
action
- мы принимаем -accept
- сетевой траффик;chain
- мы принимаем входной -input
- сетевой траффик;dst-port
- это порт, который мы назначили сетевому интерфейсу;in-interface
- это сетевой интерфейс, через который у нас приходит внешний траффик. Обычно этоether1
;protocol
- вспоминаем, что WireGuard работает по UDP протоколу;place-before
- правила фаервола упорядочены и проверяются начиная с первого. Как только встречается срабатывание, проверка останавливается. Поэтому нам важно поместить это разрешающее правило перед запрещающими. Я его поместил первым.
Вместо in-interface
можно указать in-interface-list=WAN
.
Если ваш MikroTik роутер находится за фаерволом, то не забудьте настроить Port Forwarding и перенаправить траффик с вашего фаервола на ваш роутер для UDP порта, который вы указали выше.
Промежуточная остановка
На этом моменте настройку WieGuard на MikroTik можно считать законченной.
Дальнейшие шаги зависят от вашего конкретного случая и заключаются в настройке фаервола на MikroTik.
Возможные сценарии:
нужен доступ к внутренней сети по доменному имени (мой случай) - разрешаем доступ к внутреннему DNS серверу для разрешения доменных имен;
нужно заблокировать клиентам доступ к внутренней сети - запрещаем доступ к конкретным адрес с конкретного интерфейса (
wireguard1
);нужно заблокировать клиентам доступ в интернет - запрещаем доступ к выходному интерфейсу.
Далее мы рассмотрим только один сценарий - доступ к внутренней сети по доменному имени.
Доступ к внутренней сети по доменному имени
Продолжаем, с того места, где остановились - /ip/firewall/filter/
.
Разрешаем запросы в нашему DNS серверу.
add chain=input action=accept protocol=tcp src-address=192.168.99.4/30 dst-port=53 comment="DNS Access for WireGuard Client"
add chain=input action=accept protocol=udp src-address=192.168.99.4/30 dst-port=53 comment="DNS Access for WireGuard Client"
Что откуда берётся:
protocol
- вспоминаем, что DNS работает по TCP и UDP;src-address
- это подсеть, которую мы ранее определили;dst-port
- вспоминаем, что DNS использует порт 53.
Создание файла конфигурации для клиента
С сервером мы закончили. Переходим к настройке клиента.
Нам нужно создать файл конфигурации. Файл конфигурации - это текстовый файл в INI формате:
[Interface]
Address = 192.168.99.6/30
PrivateKey = <private client key>
DNS = 192.168.88.1
MTU = 1420
[Peer]
PublicKey = <public server key>
Endpoint = <public IP address>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
Interface - что откуда берётся:
Address
- адрес клиента, который мы определили ранее;PrivateKey
- помните, мы создали ключ для клиента? Берёмprivate key
;DNS
- в примере я указал адрес внутреннего DNS сервера. Вы можете указать адрес ISP DNS или любого публичного DNS сервера;MTU
- при создании сетевого интерфейса, мы вывели информацию о нём после создания. Один из параметров -mtu
. Берём значение оттуда.
Peer - что откуда берётся:
PublicKey
- при создании сетевого интерфейса, мы вывели информацию о нём после создания. Один из параметров -public-key
. Берём значение оттуда;Endpoint
- беремendpoint-address
иendpoint-port
из конфигурации пира;AllowedIPs
- это интересный параметр и непонятный для меня. Теоретически, мы указываем адреса, к которым клиент имеет доступ; т.е. если нужна только внутрення сетка, то мы указываем её. Но если мы отдаем файл клиенту, то клиент может поменять адреса на что угодно. Поэтому я разрешаю все адреса -0.0.0.0/0, ::/0
, а доступом управляю на стороне роутера;PersistentKeepalive
- это значение я взял из других рекомендаций. Пробовал другие значения, например10
. Тоже работает. Поэтому углубляться не стал.
Конечная!
Всё! Теперь осталось импортировать файл конфигурации в клиента WireGuard и пробовать установить соединение. Всё должно работать.
Эта статья - попытка объединить минимальный объём знаний для конфигурации WireGuard сервера, с объяснением взаимосвязи между отдельными частями конфигурации и без отвлечения на "а что, если ещё и так надо". Этакий быстрый старт с нуля до рабочего состояния.
Был выбран конкретный сценарий на конкретной платформе - роутере MikoTik. Теперь замена платформы не должна представлять проблемы: команды будут другие, но шаги, схема действий сохраниться. А сценарий в данной статье можно использовать как базовый, расширяя и дополняя конкретные шаги.