Ще одна з (багатьох) приємних можливостей MikroTik – вбудована підтримка WireGuard (хоча вона є навіть на дешевому TP-Link Archer).
В моєму сетапі MikroTik RB4011 грає роль такого собі “VPN Hub” – всі клієнти підключаються до нього і об’єднуються в єдину мережу, і роль VPN трохи перебільшена тут дійсно важлива – бо це такий собі gateway, через які всі хости комунікують один з одним, і саме через VPN-тунелі з NAS мій скрипт для створення бекапів (про автоматизацію бекапів буде окремим великим постом, вже є в чернетках) підключається до всіх хостів, аби запустити rsync і стягнути до себе дані.
Крім того, Syncthing теж працює виключно в межах внутрішніх мереж і синхронізує дані між FreeBSD/NAS, ноутбуках з Arch Linux та мобільним телефоном – див. FreeBSD: Home NAS, part 12: синхронізація даних з Syncthing.
Власне сьогодні – налаштування WireGuard на самому MikroTik та на Debian (сервер rtfm.co.ua).
На Arch Linux (домашній ноутбук) все аналогічно до Debian, а для телефона є офіційний клієнт WireGuard, і там все в принципі схоже.
Див. також перший пост по MikroTik – MikroTik: перше знайомство та Getting Started, і далі буде ще, мабуть, ціла серія – вже пачка чернеток є.
Що будемо робити:
- на MikroTik створимо інтерфейс для WireGuard, назначимо йому IP
- налаштуємо MikroTik Firewall для трафіку між всіма хостами
- налаштуємо роути – додамо в домашню мережу
- створимо WireGuard ключі, додамо WireGuard Peer на MikroTik
Хоча пост вийшов довгий – але насправді все доволі просто.
Головне не плутати приватні і публічні ключі в конфігах – в мене на початку з цим було трохи складностей.
Зміст
Архітектура мереж і хостів
Схематично вся мережа виглядає так:
- 192.168.0.0/24: мережа офісу, основні хости тут:
- 192.168.0.1: MikroTik RB4011 – основний роутер
- 192.168.0.2: FreeBSD з NAS
- 192.168.0.3: робочий ноутбук з Arch Linux
- 192.168.100.0/24: домашня мережа
- 192.168.100.100: домашній ноутбук
- 10.100.0.0/24: WireGuard VPN
- 10.100.0.1: MikroTik RB4011
- 10.100.0.3: домашній ноутбук з Arch Linux
- 10.100.0.10: сервер rtfm.co.ua в DigitalOcean з Debian Linux
Адресацію буду перероблювати, але поки що так.
Конфігурація WireGuard MikroTik
Офіційна документація – WireGuard.
Отже, мережа VPN 10.100.0.0/24, адреса самого MikroTik в ній – 10.100.0.1.
Додаємо інтерфейс, на якому буде працювати WireGuard – задаємо ім’я, порт, задаємо MTU:
/interface wireguard add name=wg0 listen-port=51820 mtu=1420
(місцями вже без скріншотів, бо робив давненько)
MTU задаємо 1420 – бо дефолтний MTU в Ethernet 1500 байт, а WireGuard додає свої заголовки:
- IP header: 20 байтів (IPv4) – задається операційною системою роутера
- UDP header: 8 байтів – аналогічно, роутер
- WireGuard header: 32 байти – задається WireGuard, де вказується тип повідомлення, індекс піра, аутентифікація
Разом під headers 60 байт: 20 (IP) + 8 (UDP) + 32 (WireGuard), що залишає нам 1440 байт для корисних даних (payload), і ще -20 “запас”.
Див. Header / MTU sizes for Wireguard та мій пост TCP/IP: моделі OSI та TCP/IP, TCP-пакети, Linux sockets і порти.
Перевіряємо:
/interface wireguard print detail where name=wg0
Задаємо адресу інтерфейсу:
/ip address add address=10.100.0.1/24 interface=wg0 comment=wg-hub
Перевіряємо:
/ip address print where interface=wg0
Конфігурація MikroTik Firewall
Нам треба додати дозволи на доступ з інтернету до самого WireGuard на MikroTik, а потім налаштувати доступи між мережами.
Детальніше про фаєрвол на MikroTik теж напишу окремо, теж є в чернетках.
Доступ з інтернету до WireGuard
Включаємо доступ з будь-якого хосту, правило в chain=input:
/ip firewall filter add chain=input protocol=udp dst-port=51820 action=accept comment="allow wireguard"
Або, краще, створюємо список дозволених адрес:
/ip firewall address-list add list=wg-allowed address=46.101.201.123 comment=setevoy-rtfm /ip firewall address-list add list=wg-allowed address=178.***.236 comment=setevoy-home /ip firewall address-list add list=wg-allowed address=64.***.***.83 comment=kyiv-work-office
Момент з адресами для дроплетів в DigitalOcean: в мене підключений Reserved IP 67.207.75.157, який використовується на DNS – але для WireGuard використовуємо саме “дефолтний” Public IP від DigitalOcean – 46.101.201.123:
Перевіряємо наш новий address-list:
/ip firewall address-list print where list=wg-allowed
Тепер створюємо правило з цим списком в chain=input:
/ip firewall filter add chain=input protocol=udp dst-port=51820 src-address-list=wg-allowed action=accept comment="allow wireguard from whitelist" place-before=0
Перевіряємо:
/ip firewall filter print where src-address-list~"wg-allowed"
Доступ між внутрішніми мережами
Налаштовуємо доступ між мережами – додаємо правила в chain=forward.
Дозволяємо доступ з мережі VPN 10.100.0.0/24 в локальну мережу офісу 192.168.0.0/24:
/ip firewall filter add chain=forward src-address=10.100.0.0/24 dst-address=192.168.0.0/24 action=accept comment="wg to lan"
І обратно – з офісної мережі в мережу VPN:
/ip firewall filter add chain=forward src-address=192.168.0.0/24 dst-address=10.100.0.0/24 action=accept comment="lan to wg"
Далі – доступ з VPN до домашньої мережі 192.168.100.0/24:
/ip firewall filter add chain=forward src-address=10.100.0.0/24 dst-address=192.168.100.0/24 action=accept comment="wg to home"
І обратно, з дому в мережу VPN:
/ip firewall filter add chain=forward src-address=192.168.100.0/24 dst-address=10.100.0.0/24 action=accept comment="home to wg"
Аналогічно – доступ вже між офісною 192.168.0.0/24 домашньою 192.168.100.0/24.
З офісу в домашню:
/ip firewall filter add chain=forward src-address=192.168.0.0/24 dst-address=192.168.100.0/24 action=accept comment="office to home"
І обратно:
/ip firewall filter add chain=forward src-address=192.168.100.0/24 dst-address=192.168.0.0/24 action=accept comment="home to office"
Перевіряємо:
/ip firewall filter print where comment~"wg|office|home"
MikroTik Routes
MikroTik автоматично створює dynamic connected route для мережі WireGuard (10.100.0.0/24) після створення інтерфейсу wg0, і вже має routes для своїх локальних мереж, які безпосередньо підключені до його інтерфейсів (bridge, ether):
/ip route print
Або виберемо тільки ті, що нам зараз цікаві:
/ip route print where dst-address~"192.168.|10.100"
Тут 10.100.0.0/24 – мережа WireGuard, 192.168.0.0/24 – активна мережа DHCP-серверу на MikroTik, 192.168.88.0/24 – дефолтна мережа DHCP-серверу, зараз не використовується.
Але мережа дома – 192.168.100.0/24, і аби ходити з дому в офіс і навпаки – треба додати ще один роут:
/ip route add dst-address=192.168.100.0/24 gateway=wg0 comment="route to home via wg"
І роути тепер:
Можна переходити до підключення клієнтів.
WireGuard Peer на Linux
Сервер rtfm.co.ua хоститься в DigitalOcean, працює на Debian 12.
Сетап на Arch Linux такий самий, тільки пакет встановлюємо wireguard-tools – pacman -S wireguard-tools.
На Debian встановлюємо пакет wireguard з apt:
root@setevoy-do-2023-09-02:~# apt update && apt install -y wireguard
Переходимо в /etc/wireguard/, створюємо ключі:
root@setevoy-do-2023-09-02:/etc/wireguard# cd /etc/wireguard/ root@setevoy-do-2023-09-02:/etc/wireguard# wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
Тут privatekey будемо використовувати для локального інтерфейсу, а publickey потім додамо на MikroTik WireGuard.
На Debian отримуємо значення приватного ключа:
root@setevoy-do-2023-09-02:/etc/wireguard# cat privatekey ML+***dmk=
На MikroTik отримуємо public-key:
/interface wireguard print
На Debian створюємо конфіг /etc/wireguard/wg0.conf:
[Interface] PrivateKey = ML+0***mk= Address = 10.100.0.10/32 [Peer] PublicKey = hxz***0o= Endpoint = 178.***.***.184:51820 AllowedIPs = 10.100.0.0/24,192.168.0.0/24,192.168.100.0/24 PersistentKeepalive = 25
Тут:
[Interface]PrivateKey: приватний ключ на самому DebianAddress: IP-адреса цього Peer, буде використана для локального інтерфейсу wg0
[Peer]PublicKey: публічний ключ з MikroTikEndpoint: зовнішня адреса за якою доступний MikroTik, та порт, на якому WireGuard приймає підключенняAllowedIPs: в які мережі може ходити цей peer і для яких будуть створені локальні роути
На Debian отримуємо публічний ключ:
root@setevoy-do-2023-09-02:/etc/wireguard# cat publickey x+Pr***0TE=
На MikroTik додаємо новий peer:
/interface wireguard peers add interface=wg0 public-key="x+Pr***0TE=" allowed-address=10.100.0.10/32,192.168.0.0/24,192.168.100.0/24 comment=setevoy-rtfm
В allowed-address на MikroTik задаємо дозвіл на доступ в мережі – перевіряється і для src-addr, і для dst-addr.
Власне – на цьому все.
На Linux запускаємо підключення:
root@setevoy-do-2023-09-02:/etc/wireguard# wg-quick up wg0 [#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.100.0.10/32 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] ip -4 route add 192.168.100.0/24 dev wg0 [#] ip -4 route add 192.168.0.0/24 dev wg0 [#] ip -4 route add 10.100.0.0/24 dev wg0
Перевіряємо статус:
root@setevoy-do-2023-09-02:/etc/wireguard#wg show interface: wg0 public key: x+Pr/***TE= private key: (hidden) listening port: 59014 peer: hxz***50o= endpoint: 178.***.184:51820 allowed ips: 10.100.0.0/24, 192.168.0.0/24, 192.168.100.0/24 latest handshake: 1 minute, 51 seconds ago transfer: 16.21 KiB received, 21.75 KiB sent persistent keepalive: every 25 seconds
На що звертаємо увагу – це latest handshake, який відображає, що підключення активне, і піри один з одним змогли зв’язатись.
Перевіряємо peers на MikroTik:
/interface wireguard peers print where comment="setevoy-rtfm"
Перевіряємо підключення з Linux на офісний ноутбук:
root@setevoy-do-2023-09-02:~# ssh [email protected] -i .ssh/setevoy-work [setevoy@setevoy-work ~]$
І на домашній ноут – який теж є VPN peer, і у нього дві адреси – 10.100.0.3 в мережі VPN, і 192.168.100.100 в мережі домашнього роутера.
Пробуємо його адресу в VPN:
root@setevoy-do-2023-09-02:~# ping -c 1 10.100.0.3 PING 10.100.0.3 (10.100.0.3) 56(84) bytes of data. 64 bytes from 10.100.0.3: icmp_seq=1 ttl=63 time=116 ms --- 10.100.0.3 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 115.925/115.925/115.925/0.000 ms
І на його домашню адресу:
root@setevoy-do-2023-09-02:~# ping -c 1 192.168.100.100 PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data. 64 bytes from 192.168.100.100: icmp_seq=1 ttl=63 time=36.2 ms --- 192.168.100.100 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 36.181/36.181/36.181/0.000 ms
І статус всіх клієнтів на MikriTik зараз:
WireGuard Connection Troubleshooting
Для дебагу може бути корисним додати логування проходження пакетів на фаєрволі MikroTik:
/ip firewall filter add chain=forward src-address=192.168.0.0/24 dst-address=192.168.100.0/24 action=log log-prefix="office->home" place-before=0 /ip firewall filter add chain=forward src-address=192.168.100.0/24 dst-address=192.168.0.0/24 action=log log-prefix="home->office" place-before=0
Потім пінгуємо з офісу додому – тут ще була проблема:
$ ping 192.168.100.100 PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data. ^C --- 192.168.100.100 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3090ms
І дивимось логи на MikroTik – тут клієнт вдома на Arch Linux вже підключений, пофіксив:
/log print where message~"office->home|home->office" ... 2026-02-17 14:53:32 firewall,info home->office forward: in:wg0 out:bridge, connection-state:established proto ICMP (type 0, code 0), 192.168.100.100->192.168.0.3, len 84 2026-02-17 14:53:33 firewall,info office->home forward: in:bridge out:wg0, connection-state:established src-mac c8:a3:62:2e:fd:cb, proto ICMP (type 8, code 0), 192.168.0.3->192.168.100.100, len 84 2026-02-17 14:53:33 firewall,info home->office forward: in:wg0 out:bridge, connection-state:established proto ICMP (type 0, code 0), 192.168.100.100->192.168.0.3, len 84 2026-02-17 14:53:34 firewall,info office->home forward: in:bridge out:wg0, connection-state:established src-mac c8:a3:62:2e:fd:cb, proto ICMP (type 8, code 0), 192.168.0.3->192.168.100.100, len 84 2026-02-17 14:53:34 firewall,info home->office forward: in:wg0 out:bridge, connection-state:established proto ICMP (type 0, code 0), 192.168.100.100->192.168.0.3, len 84
Потім видаляємо, бо буде багато писати:
/ip firewall filter remove [find log-prefix="office->home"] /ip firewall filter remove [find log-prefix="home->office"]
Або використовуємо tcpdump на хостах.
Наприклад, з офісного ноута пінгуємо домашній:
[setevoy@setevoy-work ~] $ ping -c 1 192.168.100.100 PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data. 64 bytes from 192.168.100.100: icmp_seq=1 ttl=63 time=107 ms --- 192.168.100.100 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 106.714/106.714/106.714/0.000 ms
А на домашньому ноуті слухаємо весь ICMP:
root@setevoy-home:~ # tcpdump -i any icmp and host 192.168.100.100 tcpdump: WARNING: any: That device doesn't support promiscuous mode (Promiscuous mode not supported on the "any" device) tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 14:59:17.433334 wg0 In IP work.setevoy > setevoy-home: ICMP echo request, id 25635, seq 1, length 64 14:59:17.433381 wg0 Out IP setevoy-home > work.setevoy: ICMP echo reply, id 25635, seq 1, length 64
Якщо треба оновити параметри peer – виконуємо через interface wireguard peers set.
Для домашнього ноута при створені не задав 192.168.100.0/24 в allowed-address, треба було оновити параметр:
/interface wireguard peers set [find comment="setevoy-home"] allowed-address=10.100.0.3/32,192.168.100.0/24,192.168.0.0/24
А через те, що не було 192.168.100.0/24 в allowed-address – не було прямого підключення із 192.168.0.0/24 – бо пакет йшов через WireGuard тунель, приходив на домашній ноутбук на інтерфейс wg0, потім відправлявся на інтерфейс WiFi з адресою 192.168.100.100, але так як цього не було в allowed-address – то пакет дропався.
Готово.
![]()











