WireGuard — це сучасний, швидкий і мінімалістичний VPN для Linux. У цій інструкції ми розгорнемо його на сервері Linux, додамо клієнтів (peers), коректно відкриємо порт у firewall Linux та налаштуємо автозапуск через systemd. Підійде як для домашньої, так і для продакшн-мережі на вашому сервері Linux 🔒.

Передумови та установка WireGuard

Потрібен Linux з ядром 5.6+ (або пакетами backports), доступ root/sudo, відкритий UDP-порт (типово 51820) та публічна IP-адреса або домен. Далі працюємо з терміналом (це швидше, ніж будь-який GUI).

# Debian/Ubuntu
sudo apt update && sudo apt install -y wireguard wireguard-tools

# Fedora/RHEL/CentOS (EPEL може знадобитися на RHEL)
sudo dnf install -y wireguard-tools

# Arch/Manjaro
sudo pacman -S --noconfirm wireguard-tools

# Перевірити встановлення
wg --version
sudo modprobe wireguard

Увімкніть маршрутизацію пакетів (щоб трафік із VPN виходив у зовнішню мережу) і зафіксуйте зміни:

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
echo -e 'net.ipv4.ip_forward=1\nnet.ipv6.conf.all.forwarding=1' | sudo tee /etc/sysctl.d/99-wireguard-forward.conf
sudo sysctl --system

Створення сервера WireGuard

Згенеруємо ключі, створимо конфіг, відкриємо порт у firewall та запустимо інтерфейс. Це базові мережеві налаштування для нашого VPN на Linux.

# Ключі сервера (права доступу 600 завдяки umask)
umask 077; wg genkey | sudo tee /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key

# Переглянути публічний ключ сервера
sudo cat /etc/wireguard/server_public.key

Створимо /etc/wireguard/wg0.conf. Замість 'eth0' підставте ваш зовнішній інтерфейс (див. ip r). У прикладі використаємо підмережу 10.8.0.0/24 і ULA IPv6.

# ДІЗНАТИСЯ ЗОВНІШНІЙ ІНТЕРФЕЙС (WAN)
ip -4 route show default | awk '{print $5}'

# Створити конфіг wg0
echo "[Interface]
Address = 10.8.0.1/24, fd10:8::1/64
ListenPort = 51820
PrivateKey = $(sudo cat /etc/wireguard/server_private.key)
# ВАРІАНТ 1: iptables NAT (замініть eth0 на ваш WAN)
PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# ВАРІАНТ 2: firewalld (альтернатива, якщо він увімкнений)
# PostUp = firewall-cmd --add-masquerade --permanent; firewall-cmd --reload
# PostDown = firewall-cmd --remove-masquerade --permanent; firewall-cmd --reload
SaveConfig = true" | sudo tee /etc/wireguard/wg0.conf

Відкрийте порт UDP 51820 у firewall Linux. Наведу два поширені варіанти:

# UFW
sudo ufw allow 51820/udp

# firewalld
sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --reload

Запускаємо інтерфейс і вмикаємо автозапуск:

sudo systemctl enable --now wg-quick@wg0
sudo wg show
ss -lun | grep 51820

Конфігурація клієнтів (peer)

На клієнтській машині встановіть WireGuard, згенеруйте ключі та створіть конфіг. Це може бути Linux-ноутбук, VPS або телефон (мобільні додатки імпортують готовий .conf/QR).

# На клієнті
umask 077; wg genkey | tee ~/client_private.key | wg pubkey | tee ~/client_public.key
CLIENT_PUB=$(cat ~/client_public.key)
SERVER_PUB=$(ssh user@server 'cat /etc/wireguard/server_public.key')
SERVER_ENDPOINT='vpn.example.com:51820'  # або публічний IP

# Створюємо клієнтський конфіг
cat > ~/client-wg0.conf <<EOF
[Interface]
PrivateKey = $(cat ~/client_private.key)
Address = 10.8.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = ${SERVER_PUB}
Endpoint = ${SERVER_ENDPOINT}
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

Додайте клієнта на сервері. Використаємо AllowedIPs 10.8.0.2/32 (одна IP-адреса для клієнта):

# На сервері: додати peer без перезавантаження
sudo wg set wg0 peer <CLIENT_PUBLIC_KEY> allowed-ips 10.8.0.2/32
# Зберегти у файл конфігурації (бо SaveConfig=true)
sudo wg-quick save wg0

Запустіть інтерфейс на клієнті та додайте в автозапуск:

sudo mkdir -p /etc/wireguard
sudo cp ~/client-wg0.conf /etc/wireguard/wg0.conf
sudo systemctl enable --now wg-quick@wg0
ping -c3 10.8.0.1

Увімкнення автозапуску через systemd

WireGuard з утилітою wg-quick має unit-файл wg-quick@.service. Для кожного інтерфейсу (wg0, wg1, ...) просто вмикаємо enable:

sudo systemctl enable --now wg-quick@wg0
systemctl status wg-quick@wg0 --no-pager
journalctl -u wg-quick@wg0 -b --no-pager

Альтернативні способи та інструменти

systemd-networkd (без wg-quick)

Якщо ви керуєте мережами через systemd-networkd, можна описати інтерфейс у .netdev/.network:

# /etc/systemd/network/10-wg0.netdev
sudo bash -c 'cat > /etc/systemd/network/10-wg0.netdev <<EOF
[NetDev]
Name=wg0
Kind=wireguard

[WireGuard]
PrivateKey='"$(cat /etc/wireguard/server_private.key)"'
ListenPort=51820
EOF'

# /etc/systemd/network/10-wg0.network
sudo bash -c 'cat > /etc/systemd/network/10-wg0.network <<EOF
[Match]
Name=wg0

[Network]
Address=10.8.0.1/24
Address=fd10:8::1/64

[WireGuardPeer]
# Додасте клієнтів окремими секціями: PublicKey=..., AllowedIPs=...
EOF'

sudo systemctl restart systemd-networkd

firewalld з маскарадингом

sudo firewall-cmd --add-port=51820/udp --permanent
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --reload

Контейнери

Можна підняти окремий контейнер (наприклад, linuxserver/wireguard). Але для початку простіше мати чисту серверну інсталяцію без контейнеризації.

GUI-спосіб (NetworkManager)

На робочих станціях з GNOME/KDE зручно додати профіль через NetworkManager. Імпортуйте .conf клієнта або створіть вручну. Через термінал це робиться так:

# Імпорт готового конфігу
nmcli connection import type wireguard file ~/client-wg0.conf

# Увімкнути з'єднання
nmcli connection up id wg0

У графічних налаштуваннях мережі оберіть WireGuard, вставте ключі, адреси та Endpoint — і готово 🚀.

FAQ

Немає рукопотискання (Handshake) або не пінгується сервер

Перевірте: відкрито UDP 51820 у firewall, правильний зовнішній IP/домен, портфорвардинг на роутері (якщо за NAT), збігаються ключі та AllowedIPs. На клієнтах у мобільних мережах увімкніть PersistentKeepalive=25.

Весь трафік не йде через VPN

На клієнті використайте AllowedIPs = 0.0.0.0/0, ::/0. На сервері має бути маскарадинг і увімкнено ip_forward. Перевірте, що зовнішній інтерфейс у NAT-правилі правильний.

Проблеми з MTU/фрагментацією

Спробуйте зменшити MTU (наприклад, 1380) у секції [Interface] на клієнті та сервері: MTU = 1380.

Кілька клієнтів отримують один IP

Призначайте унікальні адреси й точні AllowedIPs на сервері: 10.8.0.X/32 для кожного peer.

IPv6 не працює

Додайте IPv6-префікс (наприклад, fd10:8::/64) і forwarding для IPv6. Додайте ::/0 в AllowedIPs клієнта, якщо потрібен повний тунель.

Динамічний IP на сервері

Використовуйте динамічний DNS у Endpoint (наприклад, myvpn.ddns.net:51820). Кеш DNS оновиться сам, або перезапустіть клієнт.

Порада від Kernelka

Зберігайте приватні ключі з правами 600, обмежте SSH-доступ, а в firewall Linux дозвольте лише потрібні порти. Якщо клієнти часто «засинають», ставте PersistentKeepalive=25. Для повторюваних дій (додавання peers) зручно мати невеликі bash-скрипти або Ansible-роль — це заощадить час і знизить ризик помилок.

Підсумок

  • Встановили WireGuard і увімкнули маршрутизацію.
  • Згенерували ключі, створили wg0.conf і відкрили порт у firewall.
  • Додали клієнтів із чіткими AllowedIPs і перевірили з'єднання.
  • Увімкнули автозапуск через systemd: wg-quick@wg0.
  • Розглянули альтернативи: systemd-networkd, firewalld, NetworkManager (GUI).

Головне — акуратні мережеві налаштування, правильний firewall і логічне планування адрес. Так WireGuard працює швидко, стабільно й безболісно.