Что такое WireGuard
Если не касаться wiki и официального сайта, и объяснять как можно проще, то это VPN туннелирование через UDP.
Это возможность быстро, максимально просто и надёжно, с хорошим уровнем безопасности соединить две точки между собой.
Соединение одноранговое, открытый исходный код, и полу-автоматизированное создание маршрутов(для некоторых клиентов) - что еще нужно, для счастья ;)
Возможность использовать WireGuard появилась в mikrotik начиная с седьмой версии RouterOS.
Как работает подключение (простым языком)
У нас есть две точки:
Точка А с внешним адресом 111.111.111.111
Точка Б с внешним адресом 222.222.222.222
С точки зрения WireGuard эти адреса называются Endpoint
.
Также у точек есть внутренние сети или LAN:
Точка А. 192.168.100.0/24
Точка Б. 192.168.200.0/24
Эти сети мы и хотим связать между собой. Для WireGuard это называется AllowedAddress
, или разрешенные адреса для точки. Для Точки А нам нужно будет указать разрешенные адреса - 192.168.200.0/24. Для Точки Б, соответственно - 192.168.100.0/24
Помимо этого мы должны определить для точек А и Б их адреса. Они используются для интерфейса, который создает WireGuard и передачи внутри протокола. В настройках большинства клиентов это будет называться Address
. В mikrotik мы создадим отдельный адрес.
Точка А. 10.10.10.1
Точка Б. 10.10.11.1
Всё! Этого достаточно для создания подключения и его работы.
В итоге всё это будет выглядеть так:
Отличия WireGuard и OpenVPN
Я не являются специалистом по сетевым протоколов и криптографических систем, поэтому не могу дать детальное сравнение этих решений. Но могу выделить несколько основных отличий для меня, как пользователя и администратора:
В WireGuard не нужно создавать сертификаты, в отличии от OpenVpn, и следить за ними. Это и плюс и минус в зависимости от цели использования.
В WireGuard создаются одноранговые соединения, где каждая точка может быть как сервером так и клиентом. Это позволяет создавать, помимо классических "звёзд", ещё и mesh сети.
OpenVPN позволяет более тонко управлять клиентами и их подключениями. Например, можно индивидуально раздавать маршруты и DNS-серверы для клиентов. WireGuard так не умеет.
Отдельно для mikrotik есть недостаток в том, что для каждой подсети нужно настраивать маршруты. Для win-клиентов они определяются и задаются исходя из
AllowedAddress
.
В целом я для себя сделал вывод, что для внешних пользователей удобнее и, возможно, безопаснее использовать OpenVPN. А для железных(ака аппаратных) или программных роутеров и их связи между собой удобнее WireGuard. По принципу - настроил и забыл.
Подготовка к настройке
Для начала нужно убедится в том, что наш роутер Mikrotik умеет работать с WireGuard. Далее я буду показывать на примере интерфейса winbox. Если Вы пользуете командную строку, то Вы, скорее всего, сами сможете определить наличие WireGuard.
Проверить, это можно просто взглянув на пункты меню (актуально для версии 7.5):
Обновить можно попробовать так:
Если так не получилось, то смотрите свою версию в заголовке winbox устройства
и идите на официальный сайт mikrotik для скачивания последней версии ОС.
Коротко, как обновить через загрузку файла на Mikrotik:
Если у Вас много точек и так же для удобства настройки и дальнейшего обслуживания я рекомендую создать Вам подобную таблицу:
Name |
Address |
Endpoint |
EndpointIp |
AllowedIPs |
ListenPort |
PrivateKey |
PublicKey |
PointA |
10.10.10.1 |
222.222.222.222 |
10.10.11.1/32,192.168.200.0/24 |
13231 |
ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4= |
||
PointB |
10.10.11.1 |
111.111.111.111 |
10.10.10.1/32,192.168.100.0/24 |
13231 |
FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys= |
Вам так будет проще ориентироваться в дальнейшем
Настройка WireGuard на Mikrotik
Итак, у Вас есть WireGuard на Mikrotik, и теперь мы можем начать настройку.
Прежде всего нам нужно создать интерфейс, чтобы получить публичный ключ или Public Key
. Я ранее про него не писал умышленно, чтобы было проще понять принцип работы WireGuard.
Но без публичного ключа установить соединение не получится. Он служит ключом шифрования и, можно сказать, паролем точки и для каждой точки он должен быть уникальным. При создании интерфейса он генерируется автоматически, так что Вам не нужно об этом переживать:
Создаем интерфейсы и копируем себе публичные ключи.
Скрипт для быстрой настройки
Далее я дам два варианта настройки простой и быстрый, и немного подольше. Для начала простой, которым пользуюсь сам. Вот скрипт который, я сделал для Вашего удобства:
# EXAMPLE start
# Peer A params
# Name peerAname "PointA"
# Interaface Address peerAifAddress "10.10.10.1/24"
# AllowedIPs peerAallowed 10.10.11.1/32,192.168.200.0/24
# EndPoint peerAendAddress "111.111.111.111"
# EndPort peerAendPort 13231
# PublicKey peerAkey "ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4="
# Peer B params
# Name peerBname "PointB"
# Interaface peerBif "PointB"
# AllowedIPs peerBallowed 10.10.10.1/32,192.168.100.0/24
# EndPoint peerBendAddress "222.222.222.222"
# EndPort 13231
# PublicKey "FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys="
# EXAMPLE end
{
# Peer A params
# SET PARAMS HERE
:local peerAname "PointA"
:local peerAifAddress "10.10.10.1/24"
:local peerAallowed 10.10.11.1/32,192.168.200.0/24
:local peerAendAddress "111.111.111.111"
:local peerAendPort 13231
:local peerAkey "ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4="
# Peer B params
:local peerBname "PointB"
:local peerBifAddress "10.10.11.1/24"
:local peerBallowed 10.10.10.1/32,192.168.100.0/24
:local peerBendAddress "222.222.222.222"
:local peerBendPort 13231
:local peerBkey "FxNwKIFINspWh5pkoFpS5LzNKMDjkqcAV/Ypo2Ed8ys="
# start select
:local input do={:put $input;:return}
:local selectedPeer [$input "Enter current Peer A or B"]
:put "You select is $selectedPeer. Finished!"
# end select
{
# start for A
:if ($selectedPeer = "A") do={
# add address
/ip address
add address=$peerAifAddress interface=$peerAname comment=$peerAname
# add firewall rule
/ip firewall filter
add action=accept chain=input dst-port=$peerAendPort in-interface-list=WAN protocol=udp comment="WireGuard $peerAname"
# add peer
/interface/wireguard/peers
add allowed-address=$peerBallowed endpoint-address=$peerBendAddress endpoint-port=$peerBendPort interface=$peerAname public-key=$peerBkey persistent-keepalive=10 comment=$peerBname
# add route
/ip/route
:foreach peer in=$peerBallowed do={
add dst-address=$peer gateway=$peerAname comment=$peerBname
}
}
# end for A
# start for B
:if ($selectedPeer = "B") do={
# add address
/ip address
add address=$peerBifAddress interface=$peerBname comment=$peerBname
# add firewall rule
/ip firewall filter
add action=accept chain=input dst-port=$peerBendPort in-interface-list=WAN protocol=udp comment="WireGuard $peerBname"
# add peer
/interface/wireguard/peers
add allowed-address=$peerAallowed endpoint-address=$peerAendAddress endpoint-port=$peerAendPort interface=$peerBname public-key=$peerAkey persistent-keepalive=10 comment=$peerAname
# add route
/ip/route
:foreach peer in=$peerAallowed do={
add dst-address=$peer gateway=$peerBname comment=$peerAname
}
}
# end for B
}
}
Его можно запускать прямо из терминала, либо из winbox открыв терминал. Так же вы можете добавить его в System -> Scripts
и запустить из терминала, но так как это разовая процедура, не вижу в этом особого смысла.
Для начала внесите все необходимые параметры в строки переменных :local
, затем скопируйте и вставьте скрипт в терминал. Вам нужно будет только выбрать точку в которой вы находитесь А
или B
. Введите её и нажмите Enter
.
Так нужно будет повторить в каждой точке!
Скрипт создаёт address
, правило firewall для доступа из вне по списку interface list
WAN
. Список интерфейсов WAN
создаётся по умолчанию. Если его нет, то добавьте.
Далее, скрипт создаёт настройки точки Peers
для подключения и добавляет все необходимые маршруты Routes
, которые берёт из Allowed Address
Ну или вы можете прописать всё руками по следующим скриншотам:
Надеюсь эта статья помогла кому-то быстро всё понять и настроить. Так как я на понимание, тесты и настройку потратил минимум один день, а то и больше.
И в конце добавлю общую схему со всеми параметрами:
Комментарии (25)
Doctor5772
29.11.2022 07:40+2Если честно, ожидал более подробную статью (например, с ipv6 клиентам). По данным шагам из статьи, имхо, быстро разберётся любой кто хоть немного с микротиками работает, больше на интуитивном плане (и может немного гугла).
А ещё не обязательно в том же микроте прописывать endpoint ip, что удобно если нужно подключиться к домашнему микроту находясь где нибудь ещё.
NilghtN Автор
29.11.2022 10:01Извините, что не совсем соответствует ожиданиям. Я старался сделать HowTo для начинающих, к коим собственно и себя отношу. Поэтому старался излагать максимально просто и только основные настройки, для начальной работы.
В любом случае, учту ваше пожелание, и, возможно, сделаю отдельную advanced статью в которую ещё добавлю пару фишек из личного опыта с mikrotik'ами.
Согласен, с тем, что endpoint не обязательно прописывать в каждой точке, т.к. подключение одноранговое. Особенно если роутер находится за NAT. Но, имхо, так надёжнее, т.к. при наличии 2х белых IP, подключение пройдёт с большей вероятность. Ведь иногда с этим бывают проблемы у mikrotik'ов.Doctor5772
29.11.2022 10:48Да нет, вы правы, новичкам тоже нужна помощь. Буду рад если в дальнейшем напишете что нибудь ещё более продвинутое по микротикам
Z7D
29.11.2022 13:04Да, а ещё не у всех есть средства и время на курсы. Обычное высокомерие, их жизнь на место поставит.
Alekseyz
29.11.2022 10:29+1Из плюсов WireGuard по сравнению с OpenVPN это то что он способен загрузить все ядра роутера если у такового они имеются, в отличии от последнего который однопоточный отсюда высокая скорость
blind_oracle
29.11.2022 12:06Не знаю как WG реализован в микротиках, но в линуксе он в ядре и хорошая скорость в т.ч. из-за этого т.к. не нужно переключать контекст в юзерспейс как с OpenVPN.
И из того факта что он в ядре уже вытекает что работа идёт через многопоточные kworker.
А в Роутерос он вполне может оказаться в юзерспейсе...
NilghtN Автор
29.11.2022 12:29Вы абсолютно правы, это как раз одна из интересных "фишек". Т.к. OpenVPN в mikrotik действительно работает крайне странно и, похоже, использует аппаратное ускорение с определенными типами шифрования, которое довольно медленное. Хотя, должно быть наоборот.
Но есть еще один нюанс, чтобы в mikrotik использовать всю мощь процессора необходимо выключатьfasttrack
вIP -> Firewall
. Если конечно, он уже не отключен.Без этих изменений WireGuard работает еще хуже чем OpenVPN. А с отключенным
fasstrack
скорость передачи через WireGuard очень высокая, но и нагрузка на процессор тоже.DaemonGloom
29.11.2022 14:19+1Могу посоветовать не отключать fasttrack полностью, а добавить в нём ограничения на интерфейс и routing mark (или иным способом исключить пакеты, уходящие в vpn) — тогда работа основной сети не будет задействовать процессор, что освободит порядочно ресурсов.
loskiq
01.12.2022 12:52/ip/firewall/filter/add chain=forward action=fasttrack-connection
живу с этим правилом уже много лет и все прекрасно работает. поэтому, думаю, не нужно указывать конкретные интерфейсы и метить пакеты
DaemonGloom
01.12.2022 12:56Проблема fasttrack в том, что если вы уже помечаете пакеты и используете разные таблицы маршрутизации, то его приходится для этих пакетов отключать — иначе они не всегда помечаются.
Но пока вы используете единую таблицу маршрутизации без меток — fasttrack будет работать нормально.
dimsoft
29.11.2022 12:16Для соединения точка-точка (как выше написано железные маршрутизаторы) может проще и с аппаратной разгрузкой IPIP с IPSEC ?
NilghtN Автор
29.11.2022 12:34Конечно, возможен и такой вариант, и он вполне хорошо работает. Из плюсов, используя как раз аппаратное ускорение. Но там есть определенные недостатки в шифровании и, кмк, настройка будет несколько сложнее, особенно для новичков.
dimsoft
29.11.2022 12:46В настройке IPIP одна галка использовать IPSEC и ввести пароль - всё готово. Политики микротик создаст сам.
NilghtN Автор
29.11.2022 13:06Можно и так. Но как я читал в других источниках, на текущий момент это не совсем безопасно, т.к. существуют MitM-атаки по типу Evil clones, которые вполне просто реализуемы и в таком случае IPsec требует дополнительной и довольно сложной настройки безопасности.
DaemonGloom
29.11.2022 14:16Если ваш ключ никто не знает — то и клона они поднять не смогут. А если кто-то получил доступ к вашему роутеру, чтобы узнать секрет ipsec — то вас уже никакой протокол не спасёт.
lokkiuni
30.11.2022 00:04Роман Козлов тестировал, wireguard быстрее, если уж на то пошло. А уж без аппаратной поддержки разница совсем неприличная выходит. Ну, минусы тоже очевидны, универсальных решений не бывает.
@empenosohttps://help.mikrotik.com/docs/display/ROS/ZeroTier тут официальная дока по зеротир, не уверен что это то же что Zerotier One, но фича если не готова - то в разработке и в течение какого-то времени появится.
Nday001
29.11.2022 23:07+1Отдельно для mikrotik есть недостаток в том, что для каждой подсети нужно настраивать маршруты. Для win-клиентов они определяются и задаются исходя из AllowedAddress.
Это не недостаток. Эта фича позволяет:
Создать несколько Wireguard туннелей типа Site2site и использовать динамическую маршрутизацию (ospf) в этих туннелях. На основе только AllowedIPs невозможно построить несколько site2site без NAT и с ospf.
Гранулированно управлять трафиком, например через маркировку трафика и Policy Based Routing.
Для Windows это допустимое упрощение в случае, если Windows является конечным узлом, а не роутером.
Terranz
30.11.2022 11:11Всё бы хорошо, но мой микротик уходит в бутлуп при обновлении до последней версии :(
Пришлось познать всё прелести прошивки микротика через tftp
Cirick
01.12.2022 16:35Спасибо за статью, но вот по самой настройке wireguard статей в интернете не мало. Сдейте лучше статью где допустим есть главный офис с микротиком, на котором поднят 1 сервер wireguard, к нему подключаются филиалы. А вот вся маршрутизация между всеми точками должна быть через OSPF.
empenoso
Спасибо, а ZeroTier One тоже можно на микротике настроить?
Чем они отличается: ZeroTier и WireGuard?
13werwolf13
wireguard подразумевает что вы вручную своими силами обеспечите устройствам связаность либо через одно из своих устройств либо каждый с каждым, тут как фантазия разгуляется, что означает что минимум одно устройство должно иметь белый адрес или проброшенный наружу порт через устройство с белым адресом. В zerotier же устройства сами находят друг друга через сервер, трафик не ездит через сервер в этом случае, он нужен только для того чтобы устройства нашли друг друга и соединились даже если ВСЕ они сидят за NAT.
Antra
Но если устройство A и устройство B сидят за Hide NAT, как они будут шифровать друг с другом, без участия сервера, даже если узнают друг о друге через сервер? А если не Hide NAT, а статический, тогда все равно, что NAT отстутсвует, если есть полноценный публичный IP, доступный извне.
Для Wireguard у меня поднят маленький VPS с публичным адресом. И все клиенты за Hide NAT к нему подключаются, и через него взаимодействуют уже друг с другом.