Что такое 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
Краткая схема работы WireGuard

Отличия WireGuard и OpenVPN

Я не являются специалистом по сетевым протоколов и криптографических систем, поэтому не могу дать детальное сравнение этих решений. Но могу выделить несколько основных отличий для меня, как пользователя и администратора:

  • В WireGuard не нужно создавать сертификаты, в отличии от OpenVpn, и следить за ними. Это и плюс и минус в зависимости от цели использования.

  • В WireGuard создаются одноранговые соединения, где каждая точка может быть как сервером так и клиентом. Это позволяет создавать, помимо классических "звёзд", ещё и mesh сети.

  • OpenVPN позволяет более тонко управлять клиентами и их подключениями. Например, можно индивидуально раздавать маршруты и DNS-серверы для клиентов. WireGuard так не умеет.

  • Отдельно для mikrotik есть недостаток в том, что для каждой подсети нужно настраивать маршруты. Для win-клиентов они определяются и задаются исходя из AllowedAddress.

В целом я для себя сделал вывод, что для внешних пользователей удобнее и, возможно, безопаснее использовать OpenVPN. А для железных(ака аппаратных) или программных роутеров и их связи между собой удобнее WireGuard. По принципу - настроил и забыл.

Подготовка к настройке

Для начала нужно убедится в том, что наш роутер Mikrotik умеет работать с WireGuard. Далее я буду показывать на примере интерфейса winbox. Если Вы пользуете командную строку, то Вы, скорее всего, сами сможете определить наличие WireGuard.

Проверить, это можно просто взглянув на пункты меню (актуально для версии 7.5):

Обновить можно попробовать так:

стандартный способ обновления
стандартный способ обновления

Если так не получилось, то смотрите свою версию в заголовке winbox устройства

в данном случае это mipsbe
в данном случае это mipsbe

и идите на официальный сайт mikrotik для скачивания последней версии ОС.

Коротко, как обновить через загрузку файла на Mikrotik:

Если у Вас много точек и так же для удобства настройки и дальнейшего обслуживания я рекомендую создать Вам подобную таблицу:

Name

Address

Endpoint

EndpointIp

AllowedIPs

ListenPort

PrivateKey

PublicKey

PointA

10.10.10.1

www.pointA.com

222.222.222.222

10.10.11.1/32,192.168.200.0/24

13231

ucwL8IWLNYrPHOu9qk70ZOagPgjJXhzvvkg7ZLooaj4=

PointB

10.10.11.1

www.pointB.com

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

Ну или вы можете прописать всё руками по следующим скриншотам:

Создаём адрес и подсеть для нашего интерфейса
Создаём адрес и подсеть для нашего интерфейса
Создаём правило Firewall
Создаём правило Firewall
Прописываем маршруты
Прописываем маршруты
Добавляем точку к которой хотим подключится
Добавляем точку к которой хотим подключится

Надеюсь эта статья помогла кому-то быстро всё понять и настроить. Так как я на понимание, тесты и настройку потратил минимум один день, а то и больше.

И в конце добавлю общую схему со всеми параметрами:

Общая схема работы и настройки WireGuard
Общая схема работы и настройки WireGuard

Комментарии (25)


  1. empenoso
    29.11.2022 06:32
    +1

    Спасибо, а ZeroTier One тоже можно на микротике настроить?

    Чем они отличается: ZeroTier и WireGuard?


    1. 13werwolf13
      29.11.2022 07:26

      wireguard подразумевает что вы вручную своими силами обеспечите устройствам связаность либо через одно из своих устройств либо каждый с каждым, тут как фантазия разгуляется, что означает что минимум одно устройство должно иметь белый адрес или проброшенный наружу порт через устройство с белым адресом. В zerotier же устройства сами находят друг друга через сервер, трафик не ездит через сервер в этом случае, он нужен только для того чтобы устройства нашли друг друга и соединились даже если ВСЕ они сидят за NAT.


      1. Antra
        29.11.2022 09:56
        -2

        трафик не ездит через сервер в этом случае, он нужен только для того чтобы устройства нашли друг друга и соединились даже если ВСЕ они сидят за NAT

        Но если устройство A и устройство B сидят за Hide NAT, как они будут шифровать друг с другом, без участия сервера, даже если узнают друг о друге через сервер? А если не Hide NAT, а статический, тогда все равно, что NAT отстутсвует, если есть полноценный публичный IP, доступный извне.

        Для Wireguard у меня поднят маленький VPS с публичным адресом. И все клиенты за Hide NAT к нему подключаются, и через него взаимодействуют уже друг с другом.


  1. Doctor5772
    29.11.2022 07:40
    +2

    Если честно, ожидал более подробную статью (например, с ipv6 клиентам). По данным шагам из статьи, имхо, быстро разберётся любой кто хоть немного с микротиками работает, больше на интуитивном плане (и может немного гугла).

    А ещё не обязательно в том же микроте прописывать endpoint ip, что удобно если нужно подключиться к домашнему микроту находясь где нибудь ещё.


    1. NilghtN
      29.11.2022 10:01

      Извините, что не совсем соответствует ожиданиям. Я старался сделать HowTo для начинающих, к коим собственно и себя отношу. Поэтому старался излагать максимально просто и только основные настройки, для начальной работы.
      В любом случае, учту ваше пожелание, и, возможно, сделаю отдельную advanced статью в которую ещё добавлю пару фишек из личного опыта с mikrotik'ами.

      Согласен, с тем, что endpoint не обязательно прописывать в каждой точке, т.к. подключение одноранговое. Особенно если роутер находится за NAT. Но, имхо, так надёжнее, т.к. при наличии 2х белых IP, подключение пройдёт с большей вероятность. Ведь иногда с этим бывают проблемы у mikrotik'ов.


      1. Doctor5772
        29.11.2022 10:48

        Да нет, вы правы, новичкам тоже нужна помощь. Буду рад если в дальнейшем напишете что нибудь ещё более продвинутое по микротикам


      1. Z7D
        29.11.2022 13:04

        Да, а ещё не у всех есть средства и время на курсы. Обычное высокомерие, их жизнь на место поставит.


  1. Alekseyz
    29.11.2022 10:29
    +1

    Из плюсов WireGuard по сравнению с OpenVPN это то что он способен загрузить все ядра роутера если у такового они имеются, в отличии от последнего который однопоточный отсюда высокая скорость


    1. blind_oracle
      29.11.2022 12:06

      Не знаю как WG реализован в микротиках, но в линуксе он в ядре и хорошая скорость в т.ч. из-за этого т.к. не нужно переключать контекст в юзерспейс как с OpenVPN.

      И из того факта что он в ядре уже вытекает что работа идёт через многопоточные kworker.

      А в Роутерос он вполне может оказаться в юзерспейсе...


    1. NilghtN
      29.11.2022 12:29

      Вы абсолютно правы, это как раз одна из интересных "фишек". Т.к. OpenVPN в mikrotik действительно работает крайне странно и, похоже, использует аппаратное ускорение с определенными типами шифрования, которое довольно медленное. Хотя, должно быть наоборот.
      Но есть еще один нюанс, чтобы в mikrotik использовать всю мощь процессора необходимо выключать fasttrack в IP -> Firewall. Если конечно, он уже не отключен.

      Без этих изменений WireGuard работает еще хуже чем OpenVPN. А с отключенным fasstrack скорость передачи через WireGuard очень высокая, но и нагрузка на процессор тоже.


      1. DaemonGloom
        29.11.2022 14:19
        +1

        Могу посоветовать не отключать fasttrack полностью, а добавить в нём ограничения на интерфейс и routing mark (или иным способом исключить пакеты, уходящие в vpn) — тогда работа основной сети не будет задействовать процессор, что освободит порядочно ресурсов.


        1. loskiq
          01.12.2022 12:52

          /ip/firewall/filter/add chain=forward action=fasttrack-connection
          

          живу с этим правилом уже много лет и все прекрасно работает. поэтому, думаю, не нужно указывать конкретные интерфейсы и метить пакеты


          1. DaemonGloom
            01.12.2022 12:56

            Проблема fasttrack в том, что если вы уже помечаете пакеты и используете разные таблицы маршрутизации, то его приходится для этих пакетов отключать — иначе они не всегда помечаются.
            Но пока вы используете единую таблицу маршрутизации без меток — fasttrack будет работать нормально.


  1. dimsoft
    29.11.2022 12:16

    Для соединения точка-точка (как выше написано железные маршрутизаторы) может проще и с аппаратной разгрузкой IPIP с IPSEC ?


    1. NilghtN
      29.11.2022 12:34

      Конечно, возможен и такой вариант, и он вполне хорошо работает. Из плюсов, используя как раз аппаратное ускорение. Но там есть определенные недостатки в шифровании и, кмк, настройка будет несколько сложнее, особенно для новичков.


      1. dimsoft
        29.11.2022 12:46

        В настройке IPIP одна галка использовать IPSEC и ввести пароль - всё готово. Политики микротик создаст сам.


        1. NilghtN
          29.11.2022 13:06

          Можно и так. Но как я читал в других источниках, на текущий момент это не совсем безопасно, т.к. существуют MitM-атаки по типу Evil clones, которые вполне просто реализуемы и в таком случае IPsec требует дополнительной и довольно сложной настройки безопасности.


          1. DaemonGloom
            29.11.2022 14:16

            Если ваш ключ никто не знает — то и клона они поднять не смогут. А если кто-то получил доступ к вашему роутеру, чтобы узнать секрет ipsec — то вас уже никакой протокол не спасёт.


    1. lokkiuni
      30.11.2022 00:04

      Роман Козлов тестировал, wireguard быстрее, если уж на то пошло. А уж без аппаратной поддержки разница совсем неприличная выходит. Ну, минусы тоже очевидны, универсальных решений не бывает.

      @empenosohttps://help.mikrotik.com/docs/display/ROS/ZeroTier тут официальная дока по зеротир, не уверен что это то же что Zerotier One, но фича если не готова - то в разработке и в течение какого-то времени появится.


  1. Nday001
    29.11.2022 23:07
    +1

    Отдельно для mikrotik есть недостаток в том, что для каждой подсети нужно настраивать маршруты. Для win-клиентов они определяются и задаются исходя из AllowedAddress.

    Это не недостаток. Эта фича позволяет:

    1. Создать несколько Wireguard туннелей типа Site2site и использовать динамическую маршрутизацию (ospf) в этих туннелях. На основе только AllowedIPs невозможно построить несколько site2site без NAT и с ospf.

    2. Гранулированно управлять трафиком, например через маркировку трафика и Policy Based Routing.

    Для Windows это допустимое упрощение в случае, если Windows является конечным узлом, а не роутером.


  1. Terranz
    30.11.2022 11:11

    Всё бы хорошо, но мой микротик уходит в бутлуп при обновлении до последней версии :(

    Пришлось познать всё прелести прошивки микротика через tftp


    1. loskiq
      01.12.2022 12:55

      есть готовая официальная утилитка от mikrotik для его прошивки в режиме восстановления. называется netinstall


      1. Terranz
        01.12.2022 12:57

        ну вот через неё я и восстанавливал микротик ушедший в бутлуп


  1. net_racoon
    30.11.2022 11:43

    А точно обновление железки в текущих условиях- это хорошая идея?


  1. Cirick
    01.12.2022 16:35

    Спасибо за статью, но вот по самой настройке wireguard статей в интернете не мало. Сдейте лучше статью где допустим есть главный офис с микротиком, на котором поднят 1 сервер wireguard, к нему подключаются филиалы. А вот вся маршрутизация между всеми точками должна быть через OSPF.