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.
Комп’ютер#
- У застосунку виберіть «Add Tunnel» → «Add empty tunnel…» (у macOS — «+» → «Add Empty Tunnel…»). Застосунок сам створить пару ключів: приватний уже вписано в текст конфігурації, публічний показано над ним.
- Доповніть конфігурацію і збережіть її:
[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 - На сервері відкрийте файл командою
sudo nano /etc/wireguard/wg0.confі додайте в кінець розділ із публічним ключем цього комп’ютера:[Peer] PublicKey = LAPTOP_PUBLIC_KEY AllowedIPs = 10.66.0.2/32 - Застосуйте зміни, не розриваючи інших з’єднань, і натисніть у застосунку «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. Окремий «серверний» режим не потрібен: сервер стає звичайним вузлом тунелю з власною адресою, і до віддаленого робочого столу ви під’єднуєтеся за цією адресою.
- Встановіть застосунок з офіційного інсталятора, виберіть «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 - Натисніть «Activate». Тунель працює як служба Windows
WireGuardTunnel$wg0і запускається разом із системою, ще до входу користувача. Перевірте це в новому вікні PowerShell від імені адміністратора:Get-Service WireGuardTunnel* | Select-Object Name, Status, StartType wg show - Відкрийте вхідний UDP-порт у брандмауері Windows:
New-NetFirewallRule -DisplayName "WireGuard UDP 51820" -Direction Inbound -Protocol UDP -LocalPort 51820 -Action Allow - На клієнті налаштуйте тунель, як у кроці 2, і під’єднайтеся до віддаленого робочого столу за адресою 10.66.0.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 - З клієнта виконайте
ping 10.66.0.1. Windows Server може не відповідати наping, доки це не дозволено в брандмауері, — тоді зважайте на рукостискання і RDP. - Стежте за часом рукостискання: з
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.
Що далі#
- Суміжні статті: приватна мережа між серверами, вимірювання часу відгуку.
- Сервери — у каталозі, країни — на сторінці локацій. Підтримка: +38 044 206 08 08, info@united.net.ua.