В пості MikroTik: налаштування WireGuard та підключення Linux peers описував налаштування MikroTik в ролі VPN Hub та підключення peer на Debian Linux.
Загалом, налатування на Arch Linux не відрізняються від Debian – але кожного разу починаю збирати потрібні конфіги по цьому блогу і іншим моїм хостам – тому опишу окремо, що було в одному місці, плюс тут є трохи нюансів з DNS та NteworkManager.
Власне, що треба буде зробити – встановити WireGuard, створити ключі та файл конфігу, на MikroTik створити новий Peer.
Зміст
Установка WireGuard
Встановлюємо пакет wireguard-tools – в ньому йдуть всі утиліти + systemd-unit для запуску WireGuard:
$ sudo pacman -S wireguard-tools
Генерація ключів
Створюємо каталог /etc/wireguard/, в ньому генеруємо приватний та публічний ключі:
# mkdir /etc/wireguard/ # cd /etc/wireguard/ # wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey 0ClB2Lf5uQmWK8Nz0XRofuVkvbQbSfrf3ioHbYOm9F4=
На приватний ключ задаємо права на читання тільки root:
# chmod 600 /etc/wireguard/privatekey
Створення конфігу для WireGuard
В директорії /etc/wireguard/ створюємо файл wg0.conf:
[Interface] PrivateKey = qIU***W4= Address = 10.100.0.10/32 DNS = 192.168.0.1, 10.100.0.1 [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: приватний ключ на Arch LinuxAddress: IP-адреса цього Peer, буде використана для локального інтерфейсуwg0
[Peer]PublicKey: публічний ключ з MikroTikEndpoint: зовнішня адреса за якою доступний MikroTik, та порт, на якому WireGuard приймає підключенняAllowedIPs: в які мережі може ходити цей peer і для яких будуть створені локальні роути
На Arch Linux отримуємо публічний ключ:
# cat /etc/wireguard/publickey 0ClB2Lf5uQmWK8Nz0XRofuVkvbQbSfrf3ioHbYOm9F4=
Додаємо новий Peer на MikroTik:
/interface wireguard peers add interface=wg0 public-key="0Cl***9F4=" allowed-address=10.100.0.10/32,192.168.0.0/24,192.168.100.0/24 comment=setevoy-office
Перевіряємо:
/interface wireguard peers print where comment="setevoy-office-new"
Columns: INTERFACE, PUBLIC-KEY, ENDPOINT-PORT, ALLOWED-ADDRESS
# INTERFACE PUBLIC-KEY ENDPOINT-PORT ALLOWED-ADDRESS
;;; setevoy-office-new
5 wg0 0ClB2Lf5uQmWK8Nz0XRofuVkvbQbSfrf3ioHbYOm9F4= 0 10.100.0.10/32
192.168.0.0/24
192.168.100.0/24
Можна підключатись – але можлива проблема з resolvconf та /etc/resolv.conf.
WireGuard та помилка “resolvconf: signature mismatch: /etc/resolv.conf”
На Arch Linux запускаємо підключення:
# systemctl start wg-quick@wg0 Job for [email protected] failed because the control process exited with error code. See "systemctl status [email protected]" and "journalctl -xeu [email protected]" for details.
Перевіряємо статус:
# systemctl status [email protected] × [email protected] - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; preset: disabled) Active: failed (Result: exit-code) since Fri 2026-05-08 08:57:47 EEST; 20s ago ... May 08 08:57:47 setevoy-work wg-quick[1192596]: [#] wg addconf wg0 /dev/fd/63 May 08 08:57:47 setevoy-work wg-quick[1192596]: [#] ip -4 address add 10.100.0.10/32 dev wg0 May 08 08:57:47 setevoy-work wg-quick[1192596]: [#] ip link set mtu 1420 up dev wg0 May 08 08:57:47 setevoy-work wg-quick[1192644]: [#] resolvconf -a wg0 -m 0 -x May 08 08:57:47 setevoy-work wg-quick[1192674]: resolvconf: signature mismatch: /etc/resolv.conf May 08 08:57:47 setevoy-work wg-quick[1192674]: resolvconf: run `resolvconf -u` to update May 08 08:57:47 setevoy-work wg-quick[1192596]: [#] ip link delete dev wg0 May 08 08:57:47 setevoy-work systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAILURE
Проблема в тому, що в системі є і openresolv і NetworkManager з дефолтним dns=default – тобто NetworkManager пише /etc/resolv.conf напряму, без resolvconf.
При цьому openresolv тримає в файлі свій checksum для файлу /etc/resolv.conf, і коли NetworkManager перезаписує файл – контрольна сума не сходиться, через що resolvconf -a (який викликається wg-quick) падає з помилкою “signature mismatch“.
Option 1: PreUp та resolvconf -u (“грязний хак”)
Є “грязний хак” – додати до /etc/wireguard/wg0.conf опцію PreUp з запуском resolvconf -u:
[Interface] PrivateKey = qIU***rW4= Address = 10.100.0.10/32 DNS = 192.168.0.1, 10.100.0.1 PreUp = resolvconf -u ...
Цей варіант теж працює, але якщо NetworkManager перезапише /etc/resolv.conf вже після підняття тунелю (наприклад, при reconnect Wi-Fi) – DNS з тунелю злетять.
Тому краще просто переключити NetworkManager на використання systemd-resolved, аби він взагалі не писав файл напряму /etc/resolv.conf.
Option 2: NetworkManager та systemd-resolved (правильний варіант)
Редагуємо конфіг /etc/NetworkManager/NetworkManager.conf і додаємо блок [main] з опцією dns – див. DNS management:
[main] dns=systemd-resolved
Стартуємо systemd-resolved і перезапускаємо NetworkManager:
# systemctl enable --now systemd-resolved && systemctl restart NetworkManager
Перевіряємо статус systemd-resolved:
# resolvectl status
Global
Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: foreign
Current DNS Server: 10.100.0.1
DNS Servers: 192.168.0.1 10.100.0.1
...
Перевіряємо що тепер в /etc/resolv.conf:
# cat /etc/resolv.conf # Generated by NetworkManager nameserver 127.0.0.53 options edns0 trust-ad
127.0.0.53 – це і є наш локальний systemd-resolved:
# netstat -anp | grep 127.0.0.53 tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 1221589/systemd-res udp 0 0 127.0.0.53:53 0.0.0.0:* 1221589/systemd-res
Або з ss -lntup | grep 127.0.0.53 – але я звик до netstat.
Option 3: чистий openresolv (just in case)
Альтернатива – задати dns=none в NetworkManager: тоді NM взагалі не чіпає /etc/resolv.conf і єдиним менеджером файлу стає openresolv: він об’єднує записи від wg-quick і підключень NetworkManager напряму в /etc/resolv.conf зі списком реальних DNS-серверів (192.168.0.1, 10.100.0.1, …).
При такому варіанті systemd-resolved взагалі не потрібен – запити на DNS resolution йдуть напряму через glibc: простіше конфігурація і менше сервісів – але втрачаємо плюшки systemd-resolved: кешування, split-DNS, DNSSEC.
Власне, все – запускаємо WireGuard:
# systemctl start wg-quick@wg0 # systemctl enable wg-quick@wg0
Перевіряємо статус:
# wg show interface: wg0 public key: 0Cl***9F4= private key: (hidden) listening port: 47047 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: 20 seconds ago transfer: 12.06 KiB received, 8.13 KiB sent persistent keepalive: every 25 seconds
Перевіряємо підключення до MikroTik через VPN-тунель:
root@setevoy-work:/etc/wireguard # ssh [email protected] ... [admin@mikrotik-rb4011-gw] >
Готово.
![]()