Мережа та VPN

WireGuard: захищений канал між офісом і сервером

Зміст статті

Для адміністратора, який хоче, щоб RDP, SSH і бази даних на сервері були доступні лише працівникам компанії, а не всьому інтернету. У підсумку між офісом (або окремими комп’ютерами й телефонами) і сервером працюватиме зашифрований тунель WireGuard, а службові порти можна буде закрити ззовні.

У WireGuard немає «сервера» і «клієнта» — є рівноправні вузли, кожен із парою ключів і списком AllowedIPs. Вузол із постійною публічною адресою (ваш сервер) слухає UDP-порт, решта (далі — клієнти) під’єднуються до нього самі.

Що знадобиться#

  • Сервер з Ubuntu LTS (24.04 або 26.04) чи Debian 13 і обліковий запис із правами sudo. Публічну адресу сервера надсилає підтримка разом із доступами.
  • Приватна підмережа для тунелю. Вона не повинна перетинатися ні з мережею офісу, ні з домашніми мережами працівників (там найчастіше 192.168.0.0/24 і 192.168.1.0/24), ні з приватною мережею між серверами, якщо ви нею користуєтеся.
  • Вільний UDP-порт на сервері; типовий для WireGuard — 51820.

Усі адреси в статті — приклади, замініть їх власними: публічна адреса сервера — 203.0.113.10, підмережа тунелю — 10.66.0.0/24 (сервер — 10.66.0.1, ноутбук — 10.66.0.2, телефон — 10.66.0.3, маршрутизатор офісу — 10.66.0.10), мережа офісу — 192.168.10.0/24.

Крок 1 Сервер з Ubuntu або Debian#

Встановлення і ключі#

Модуль WireGuard уже є в ядрі; пакет додає утиліти wg і wg-quick.

sudo apt update
sudo apt install wireguard

Ключі створіть в оболонці root з umask 077 — тоді нові файли зможе читати лише root:

sudo -i
umask 077
cd /etc/wireguard
wg genkey | tee server.key | wg pubkey > server.pub
cat server.pub

Публічний ключ із server.pub ви передасте клієнтам; приватний залишається лише на сервері.

Файл /etc/wireguard/wg0.conf#

Не виходячи з оболонки root, створіть файл будь-яким редактором, наприклад nano /etc/wireguard/wg0.conf:

[Interface]
Address = 10.66.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

Замість SERVER_PRIVATE_KEY вставте вміст файлу server.key (його покаже cat server.key). Розділи [Peer] додасте, коли матимете публічні ключі клієнтів. Вийдіть з оболонки root командою exit.

Мережевий екран і запуск#

Якщо на сервері встановлено ufw, відкрийте UDP-порт. Команда лише додає правило і не вмикає мережевий екран. Якщо ufw ще вимкнено, не вмикайте його, доки не дозволите SSH, — див. «Базовий захист Linux-сервера». Якщо у вас nftables, додайте до ланцюжка вхідних пакетів правило udp dport 51820 accept.

sudo ufw allow 51820/udp

Запустіть тунель і ввімкніть автозапуск; wg show має показати інтерфейс wg0 і порт 51820:

sudo systemctl enable --now wg-quick@wg0
sudo wg show

Крок 2 Комп’ютери й телефони#

Офіційні застосунки: для Windows — інсталятор зі сторінки wireguard.com/install, для macOS та iOS — в App Store, для Android — у Google Play.

Комп’ютер#

  1. У застосунку виберіть «Add Tunnel» → «Add empty tunnel…» (у macOS — «+» → «Add Empty Tunnel…»). Застосунок сам створить пару ключів: приватний уже вписано в текст конфігурації, публічний показано над ним.
  2. Доповніть конфігурацію і збережіть її:
    [Interface]
    PrivateKey = LAPTOP_PRIVATE_KEY
    Address = 10.66.0.2/32
    
    [Peer]
    PublicKey = SERVER_PUBLIC_KEY
    Endpoint = 203.0.113.10:51820
    AllowedIPs = 10.66.0.0/24
    PersistentKeepalive = 25
  3. На сервері відкрийте файл командою sudo nano /etc/wireguard/wg0.conf і додайте в кінець розділ із публічним ключем цього комп’ютера:
    [Peer]
    PublicKey = LAPTOP_PUBLIC_KEY
    AllowedIPs = 10.66.0.2/32
  4. Застосуйте зміни, не розриваючи інших з’єднань, і натисніть у застосунку «Activate»:
    sudo systemctl reload wg-quick@wg0

AllowedIPs на клієнті визначає, який трафік піде в тунель: тут це лише підмережа тунелю, тож решта інтернету працює, як і раніше. PersistentKeepalive = 25 потрібен вузлам за NAT: раз на 25 секунд вузол надсилає порожній пакет, щоб маршрутизатор не «забув» з’єднання.

Готовий файл конфігурації можна імпортувати: «Add Tunnel» → «Import tunnel(s) from file…». У файлі є приватний ключ, тож після імпорту файл видаліть.

Телефон: конфігурація через QR-код#

Створіть конфігурацію на сервері й виведіть QR-код у термінал:

sudo apt install qrencode
sudo -i
umask 077
mkdir -p /root/wg-clients
cd /root/wg-clients
wg genkey | tee phone.key | wg pubkey > phone.pub
cat phone.key
nano phone.conf
qrencode -t ansiutf8 < phone.conf

Файл phone.conf такий самий, як для комп’ютера, але з адресою 10.66.0.3/32 і приватним ключем із phone.key. У застосунку натисніть «+» і відскануйте QR-код, а потім видаліть файли з приватним ключем і виведіть публічний:

rm phone.key phone.conf
cat phone.pub
exit

Публічний ключ додайте на сервері в новий розділ [Peer] з AllowedIPs = 10.66.0.3/32 і знову виконайте reload. QR-код містить приватний ключ: не зберігайте знімків екрана з ним і не надсилайте його в месенджерах.

Крок 3 Уся мережа офісу#

Щоб не встановлювати застосунок на кожен комп’ютер, тунель налаштовують на офісному маршрутизаторі — якщо він підтримує WireGuard (наприклад, з прошивкою OpenWrt). Тоді всі пристрої офісу бачать сервер за адресою 10.66.0.1 без додаткових налаштувань. На сервері додайте вузол:

[Peer]
PublicKey = ROUTER_PUBLIC_KEY
AllowedIPs = 10.66.0.10/32, 192.168.10.0/24

Мережа офісу в AllowedIPs означає, що сервер приймає пакети від офісних комп’ютерів і відповідає їм через цей вузол. Цього разу виконайте sudo systemctl restart wg-quick@wg0 (з’єднання на мить перервуться): маршрут до нової підмережі wg-quick додає лише під час запуску, reload його не створить.

На маршрутизаторі (назви полів залежать від моделі) вкажіть: адресу інтерфейсу — 10.66.0.10/24, публічний ключ вузла — вміст server.pub, Endpoint — 203.0.113.10:51820, AllowedIPs — 10.66.0.0/24, PersistentKeepalive — 25. Пару ключів маршрутизатор створює сам; його публічний ключ перенесіть на сервер. Мережевий екран маршрутизатора має дозволяти пересилання з локальної мережі в тунель, а NAT у бік тунелю не потрібен: сервер знає маршрут до мережі офісу.

Якщо маршрутизатор не підтримує WireGuard, вузлом тунелю з тими самими параметрами може бути комп’ютер з Linux в офісі. На маршрутизаторі додайте статичний маршрут до 10.66.0.0/24 через адресу цього комп’ютера, а на самому комп’ютері ввімкніть пересилання пакетів:

echo net.ipv4.ip_forward=1 | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

На сервері з Linux пересилання вмикають так само, але лише якщо він має передавати пакети між вузлами — наприклад, щоб працівник з дому потрапляв через сервер у мережу офісу. Тоді додайте клієнтові 192.168.10.0/24 до AllowedIPs, а в ufw на сервері дозвольте транзит: sudo ufw route allow in on wg0 out on wg0.

Сервер із Windows Server#

WireGuard для Windows підтримує Windows Server 2016, 2019, 2022 і 2025. Окремий «серверний» режим не потрібен: сервер стає звичайним вузлом тунелю з власною адресою, і до віддаленого робочого столу ви під’єднуєтеся за цією адресою.

  1. Встановіть застосунок з офіційного інсталятора, виберіть «Add Tunnel» → «Add empty tunnel…» і назвіть тунель wg0. Приватний ключ застосунок підставить сам, решту допишіть:
    [Interface]
    PrivateKey = SERVER_PRIVATE_KEY
    ListenPort = 51820
    Address = 10.66.0.1/24
    
    [Peer]
    PublicKey = LAPTOP_PUBLIC_KEY
    AllowedIPs = 10.66.0.2/32
  2. Натисніть «Activate». Тунель працює як служба Windows WireGuardTunnel$wg0 і запускається разом із системою, ще до входу користувача. Перевірте це в новому вікні PowerShell від імені адміністратора:
    Get-Service WireGuardTunnel* | Select-Object Name, Status, StartType
    wg show
  3. Відкрийте вхідний UDP-порт у брандмауері Windows:
    New-NetFirewallRule -DisplayName "WireGuard UDP 51820" -Direction Inbound -Protocol UDP -LocalPort 51820 -Action Allow
  4. На клієнті налаштуйте тунель, як у кроці 2, і під’єднайтеся до віддаленого робочого столу за адресою 10.66.0.1.

Як перевірити результат#

  1. На сервері виконайте sudo wg show. Для кожного вузла мають бути зовнішня адреса, час останнього рукостискання і лічильники трафіку:
    peer: LAPTOP_PUBLIC_KEY
      endpoint: 198.51.100.7:53211
      allowed ips: 10.66.0.2/32
      latest handshake: 37 seconds ago
      transfer: 1.21 MiB received, 3.48 MiB sent
  2. З клієнта виконайте ping 10.66.0.1. Windows Server може не відповідати на ping, доки це не дозволено в брандмауері, — тоді зважайте на рукостискання і RDP.
  3. Стежте за часом рукостискання: з PersistentKeepalive воно оновлюється приблизно раз на дві хвилини. Якщо рядка latest handshake немає, вузли ще жодного разу не з’єдналися; якщо рукостисканню понад три хвилини — зв’язку немає.

Крок 4 Службові порти — лише через тунель#

Увага. Команди цього розділу можуть позбавити вас доступу до сервера. Виконуйте їх лише після перевірки тунелю, зокрема після перезавантаження, і не закривайте поточну сесію. Якщо доступ усе ж втрачено, знадобиться віддалена консоль: її надають за запитом через підтримку, а на лінійці Лайт її немає.

Linux з увімкненим ufw. Спершу дозвольте SSH із тунелю (якщо порт SSH не 22, вкажіть свій) і перегляньте номери правил:

sudo ufw allow in on wg0 to any port 22 proto tcp
sudo ufw status numbered

Відкрийте нову сесію SSH за адресою 10.66.0.1. Якщо вона працює, видаліть правила, які дозволяють SSH звідусіль (зазвичай їх два — для IPv4 та IPv6): sudo ufw delete і номер правила; після кожного видалення номери зсуваються. Щоб скасувати зміну, виконайте sudo ufw allow 22/tcp у старій сесії: вона не розривається. Так само вчиніть із портами баз даних.

Windows Server. Під’єднайтеся через RDP до адреси 10.66.0.1 і вже з цієї сесії обмежте вбудовані правила віддаленого робочого столу підмережею тунелю:

Set-NetFirewallRule -DisplayGroup "Remote Desktop" -RemoteAddress 10.66.0.0/24

Перевірте нове під’єднання, не закриваючи цієї сесії. Щоб скасувати зміну, знову дозвольте будь-яку адресу:

Set-NetFirewallRule -DisplayGroup "Remote Desktop" -RemoteAddress Any

Назву групи «Remote Desktop» наведено для англомовної системи. Якщо порт RDP змінено або правила створено вручну, дивіться статтю «Безпечний RDP»; для Linux — «Базовий захист Linux-сервера».

Типові помилки#

СимптомПричинаЩо зробити
Рукостискання немаєUDP-порт на сервері закрито, мережа клієнта блокує вихідний UDP або в Endpoint помилкаПеревірте правило мережевого екрана і sudo wg show wg0 listen-port; спробуйте під’єднатися з іншої мережі
Порт відкрито, а рукостискання немаєПереплутано ключі: у [Interface] має бути власний приватний ключ, у [Peer] — публічний ключ протилежного вузлаПорівняйте sudo wg show wg0 public-key на сервері з PublicKey у клієнта
Після додавання вузла інший перестав відповідатиПеретин AllowedIPs: одну адресу чи підмережу записано двом вузлам, і WireGuard залишає її лише за останнімКожному вузлу на сервері призначайте власну адресу /32; мережу офісу вказуйте лише для маршрутизатора
ping проходить, а RDP чи копіювання файлів зависаєMTU: великі пакети не проходять через канал (мобільний інтернет, PPPoE, інший VPN)Додайте MTU = 1380 в [Interface] клієнта; за потреби зменшуйте далі, але не нижче 1280

MTU перевіряють пакетом із забороною фрагментації: у Windows — ping -f -l 1392 10.66.0.1, у Linux — ping -M do -s 1392 10.66.0.1. Якщо малі пакети проходять, а цей ні, зменшуйте MTU. Чому тунель не запустився, покаже sudo systemctl status wg-quick@wg0.

Що далі#