Mikrotik (RouterOS) + Wireguard +14




Вступление

Один из способом сделать доступным некоторые внутренние (домашние) сервисы из Интернета является VPN. Можно, конечно, отдельные порты опубликовать и через ssh, но для более полноценной связи лучше использовать другие решения. Я уже писал и про ZeroTier, и про OpenVPN, и получил упреки, что незаслуженно забыл про Wireguard…

Так или иначе, мне стало не хватать VPN клиента (в т.ч. и Wireguard) на отдельно стоящем серверочке, потребовалось связать (в данном случае с vNet в Azure, хотя это не принципиально) всю домашнюю сеть с несколькими ресурсами. И я решил, что пора уже сделать это через роутер, для полноценного site-to-site.

Хотя Keenetic и научился поддерживать Wireguard на новых прошивках, для старенькой Ultra я такой не нашел. С OpenWRT тоже не срослось (для Ultra II есть, а моя модель старовата). Так что я решил, что пора проапгрейдиться. И, поскольку Mikrotik RouterOS выкатила бету 7 версии с Wireguard, я решил, что пора изучить это чудо.

Действительность оказалась несколько сложнее, чем я рассчитывал, однако все получилось. И сейчас опишу основные моменты, которые нигде не смог найти, и до которых пришлось доходить самому.

Основные моменты

Взял я MikroTik hAP ac2. Модель старая, без излишеств, но все, что нужно, делает.

Хотя дела с Микротиками я раньше не имел, запустил его достаточно быстро. Были некоторые сложности с тем, что в настройке DHCP Server недостаточно установить Network, чтобы IP адреса начали раздаваться из этой сети. Оказалось, что есть еще и отдельный IP Pool. Но это мелочи. Так что довольно быстро я приступил к настройкам именно Wireguard.

Конечно же, ничего не заработало. Более того, «на той стороне» я даже не видел входящих пакетов.

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

Пошел разбираться с командной строкой. Для меня, в первый раз увидевшего RouterOS, там, конечно, не сахар. Более-менее, разобрался, конечно. Но как узнать, какие вообще параметры имеются, так и не понял. Ну т.е. до /interface wireguard peers я добрался. Даже про add догадался. Только вот при этом система спрашивала только interface, public-key и allowed-address. В общем, всякими переборами подобрал команду:

add allowed-address=192.168.66.128/25,10.10.0.0/16 endpoint=66.166.166.42:51820 interface=wg0 persistent-keepalive=30 public-key="многобукв="

Т.е. порт можно указать только через командную строку. Впрочем, все равно не заработало.

Напомню, что wg0 был создан ранее через web-интерфейс. Или WinBox, не помню. Он чуток получше, чем веб-интерфейс, но порт тоже не давал указать. И тут до меня дошло, что на обычном Linux я ведь еще IP адрес своего локального хоста указываю. А тут его не задавал. Заработало только после:

/ip address
add address=192.168.66.253/24 interface=wg0 network=192.168.66.0

Собственно все. В сети есть инструкции, как установить Wireguard на Mikrotik с OpenWRT. Но как по мне, это извращение. А вот поднять его в родном RouterOS можно за несколько минут. Когда уже знаешь, как. Работает прекрасно, вообще без нареканий.

P.S. Адреса я, конечно, менял. Но allowed-address=192.168.66.128/25 и add address=192.168.66.253/24 не ошибка. Просто у меня к двум серверам подключение. Половина сети класса С на один сервер, половина на другой.

P.P.S. Почему Wireguard, а не OpenVPN? Например, производительность:

https://blog.entrostat.com/openvpn-vs-wireguard-network-performance-tests/

А еще простота настройки и кое-что по мелочи.




Комментарии (21):

  1. vandreykiv
    /#22128800

    Зачем такой изврат с endpoint и портом. Все работает и можна з веб интерфейса/winboxа натикать.

    ##### RouterOS 7.1b2: create Wireguard server
    # create the server
    /interface wireguard add listen-port=51820 mtu=1420 name=wireguard1

    # get server's public key
    /interface wireguard print

    # add IP-address to the interface
    /ip address add address=10.0.0.1/24 interface=wireguard1 network=10.0.0.0

    # allow from firewall
    /ip firewall filter add action=accept chain=input comment=«Accept WireGuard» dst-port=51820 log=yes log-prefix=WG: protocol=udp

    # configure client and get the client's public key
    [Interface]
    PrivateKey = CLIENT-PRIVATEKEY
    Address = 10.0.0.2/24
    DNS = 192.168.88.1

    [Peer]
    PublicKey = ROUTER-PUBLICKEY
    AllowedIPs = 0.0.0.0/0
    Endpoint = serverhostname.com:51820
    PersistentKeepalive = 20

    # add client to the configuration

    /interface wireguard peers add allowed-address=10.0.0.2/32 interface=wireguard1 persistent-keepalive=20 public-key=«CLIENT-PUBLICKEY»

    ##### End of Wireguard


    Правда перформанс так себе пока-что. У меня hAP ac и l2tp+ipsec дает ровно в 2 раза большую скорость по сравнению с wireguard на этом же роутере. Скорей всего сирая бета сказывается

    • Anrikigai
      /#22129284

      Можно чуть подробнее, как через веб-интерфейс настроить?
      Ну не принимаются у меня значения, когда в поле Endpoint указываю порт.

      Listen port в интерфейсе wg0 — да, могу задать. А вот для удаленного peer только через CLI

      • vandreykiv
        /#22132238

        Я не указивал endpoint, мне он не нужен, но впн работает и без него. Если вам строго необходим endpoint то да, только консоль

  2. poisons
    /#22129082

    У вас в последней картинке tcp и udp местами не перепутаны?


    Ну и да, ставить на реальное железо девелоперскую ветку это смелое решение.

    • Anrikigai
      /#22129268

      Мопед не мой, ссылка-источник картинки с производительностью прямо под ней…
      С другими данными (transfer time больше для UDP) тоже согласуется.

      В принципе даже графики не просто картинки, а реальный набор, визуализированный через внешний сервис: vpn-test.entrostat.com/public/question/6ad737cb-900d-4349-a4e1-8f8936de0511
      На вид достаточно подробно и методика описана, так что вызывает доверие.

      Хотя по идее на UDP накладные расходы должны быть меньше, а производительность выше. Т.е. для меня тоже несколько удивительно, согласен.

  3. Dobrumir
    /#22129248

    В текущих версиях RouterOS 6.**.* нет поддержки WireGuard, появилось в RouterOS 7.1beta2 (2020-Aug-21 12:29)

    • vandreykiv
      /#22132250

      И, поскольку Mikrotik RouterOS выкатила бету 7 версии с Wireguard, я решил, что пора изучить это чудо.

      Ну да, автор так и написал, только чукча не читатель?

  4. Nomad1
    /#22129886

    А у кого-нибудь получилось добавить wireguard интерфейс в bridge? Или связывать его с сеткой реально только через фаервол?

    • Anrikigai
      /#22129966

      Можно сценарий?
      Например:
      — Дом. 192.168.1.10
      — Хочу подключиться к 192.168.1.20
      — Кидаю ARP запрос
      — В локалке домашней адреса нет, но от Wireguard прихолит ответ, что этот IP за ним
      — пакет улетает далеко-далеко в зашифрованом виде.

      Т.е. зашифрованый Layer 2 нужен?
      Или все-таки маршрутизация допустима?
      Типа
      — Я 192.168.1.10
      — Удаленная машина 192.168.68.20
      — 192.168.1.1 у меня маршрут по умолчанию
      — И есть доп маршрут «192.168.68.0/24 за 192.168.1.254», где 192.168.1.254 — как раз адрес интефрейса Wireguard

      • Nomad1
        /#22130028

        Задача — соединить wg сетку и локальную. Маршрутизация допустима.

        — Домашняя сеть 192.168.1.0/24
        — Удаленная машина 192.168.68.20
        — WG сервер 192.168.1.254, WG сетка 192.168.68.0/24
        — прописан маршрут 192.168.68.0/24 через 192.168.68.254 и он не думает работать

        • DaemonGloom
          /#22130282

          Самое правильное — идти по шагам/хопам и проверять, на каком из этапов теряется пинг. Лучше через отслеживание пакетов — так можно узнать, потерялись ответы или запросы.
          Дополнительно — проверьте, что удалённая машина получила все нужные маршруты для общения с сетью 192.168.1.0/24. И в вашей ситуации не понятно — WG сервер поднят на маршрутизаторе или где-то ещё? Кто у вас default gateway?

        • Anrikigai
          /#22130446

          Упс, не в ту ветку вот этот коммент написал:

    • WGH
      /#22131656

      Wireguard это всегда L3, поэтому добавить его в бридж не получится. Можно попробовать поверх Wireguard поднять какой-нибудь gretap/eiop, и уже его засунуть в бридж. Как обычно, в таких схемах нужно следить за MTU, иначе потом дебажить это будет совсем не весело.

  5. DoMoVoY
    /#22130196

    Пробовал обновить у родителей роутер Miktotik до 7 версии. Wireguard не завелся. Ко всему прочму и routing поломан. BGP, который нужен был просто отсутствует. Так что не раньше релиза стоит ждать чуда.

    • Anrikigai
      /#22130276

      В шестерке был BGP, а теперь исчез?
      Беда…

  6. Anrikigai
    /#22130272

    Выглдяит, как совершенно стандартная конфигурация.

    > 192.168.68.0/24 через 192.168.68.254
    Наверное все-таки на 192.168.1.20 знает «192.168.68.0/24 через 192.168.1.254»

    Я бы проверял в такой последовательности:
    — wg show — а вообще поднят ли VPN туннель
    — ping удаленного адреса туннеля (условно 192.168.66.253) с машинки с wireguard (192.168.1.254). При этом пинг пойдет с адреса туннеля (192.168.66.254 или какой у вас настроен)
    — Если ОК — тот же ping, находясь так же на 192.168.1.254, но указав source IP локального интерфейса. Чтобы пинг пошел с 192.168.1.254
    — Проверить такой же пинг на 192.168.66.253, но уже с реальной машины 192.168.1.20

    Чаще всего я ошибался AllowedIPs или маршрутах.
    Недостаточно прописать «дома» маршрут «192.168.68.0/24 через 192.168.1.254»
    В удаленной сети должно быть аналогично (192.168.1.0/24 через 192.168.68.253)

    Т.е., чтобы удаленная машина 192.168.68.20 достуачалась до 192.168.1.0 нужно
    — 192.168.68.20 слала 192.168.1.0/24 на LAN wireguard'а (192.168.68.253 или какой там)
    — Тот «дальний» wirguard 192.168.1.0 отправил в туннель (причем именно этот, на 192.168.66.254)
    — и обратно аналогично

    В промежутках смотреть tcpdump. Может где-то NAT включен и нарушает AllowedIPs. Или наоборот не включен.

    • Nomad1
      /#22130572

      Наверное все-таки на 192.168.1.20 знает «192.168.68.0/24 через 192.168.1.254»

      Да, опечатался. Ясное дело, у меня ж сетки совсем иначе называются.

      Чаще всего я ошибался AllowedIPs или маршрутах.
      Недостаточно прописать «дома» маршрут «192.168.68.0/24 через 192.168.1.254»

      Итого, проблема оказалась именно тут — в AllowedIPs на сервере должен быть адрес сети клиента, которая хочет работать с этим интерфейсом.

      • Anrikigai
        /#22130642

        Ну отлично.
        Хоть у кого-то заработало :) А то вон пугают, что и не завелся, и BGP исчез…

        • Nomad1
          /#22130690

          Он у меня завелся еще N времени назад, но приходилось прописывать NAT для доступа к ресурсам сервера, а это откровенно ненормально. А как сделать двусторонний NAT (точнее, Transparent Firewall) я так и не разобрался.
          В целом, из ненормального тут только настройка endpoint и allowed-address на Mikrotik, за счет того, что конфиг WG хранится в текстовом виде и редактируется через текстовый редактор, доступный только по SSH.
          А, ну еще на старом RB750UP все настроилось, но не заработало и сильно-сильно кушало процессор. Видимо, не по нему эта задача.

        • DaemonGloom
          /#22130802

          BGP и MPLS отсутствуют в бете, чтобы народ не тестировал на рабочей магистрали сейчас. Будут добавлены позже, если верить им.

          • Asm0
            /#22132736

            Да что там про BGP говорить, если они даже routing mark пока убрали. Пришлось откатываться и продолжать сидеть на виртуалке.