↓ До тексту
  1. Статті/

WireGuard: свій VPN і готові клієнтські конфіги

·5 хвилин
cat /etc/passwd
Автор
cat /etc/passwd
Технічний блог про Linux, DevOps та Open Source технології.
Зміст

WireGuard - це сучасний VPN, який живе прямо в ядрі Linux: швидкий, з крихітним кодом і без «майстрів налаштування» на пів години. Увесь сервер - це один файл wg0.conf і пара ключів. А кожен клієнт - це ще один маленький конфіг, який на телефон заходить одним скануванням QR-коду.

Що потрібно зробити?
#

Підняти WireGuard-сервер на VPS, згенерувати готовий клієнтський конфіг, показати його як QR для телефона - і підключити клієнт, щоб переконатися, що тунель справді працює. Щоб було видно обидві сторони, записав усе наживо у двох панелях: ліворуч сервер, праворуч клієнт.

З чим працюю?
#

1
2
root@vpn:~# cat /etc/os-release | grep PRETTY
PRETTY_NAME="Ubuntu 26.04 LTS"

Сервер - свіжа Ubuntu 26.04 LTS, усе від root. Клієнтом у записі буде Debian 13 - WireGuard кросплатформний, тож сервер і клієнт можуть бути на різних дистрибутивах (і на Windows/macOS/Android/iOS теж).

У демо дві машини в одній мережі: сервер (майбутній VPN-сервер, 10.10.60.104) і клієнт (10.10.60.103). Між ними через WireGuard піднімемо окрему приватну мережу 10.9.0.0/24: сервер отримає адресу 10.9.0.1, клієнт - 10.9.0.2. На реальному VPS замість 10.10.60.104 у клієнта в полі Endpoint буде публічний IP вашого сервера, але логіка та сама.

1
2
3
4
5
6
   Сервер (VPN)                        Клієнт
  10.10.60.104  ←—— поточна мережа ——→  10.10.60.103
(у вас: публічний IP VPS)
       │                                     │
       └──────────  WireGuard-тунель  ───────┘
    10.9.0.1  ←——  приватна 10.9.0.0/24  ——→  10.9.0.2

У записі ліворуч - сервер, праворуч - клієнт.

Далі те саме, що в записі, тільки вже можна копіювати.

Сервер: встановлення і ключі
#

Ставимо інструменти WireGuard, qrencode (для QR-коду) і iptables (для NAT):

1
apt install -y wireguard-tools qrencode iptables

Генеруємо пару ключів сервера. Трюк із tee одразу зберігає приватний ключ у файл, а на екран виводить лише публічний - приватний ніколи не світиться:

1
2
cd /etc/wireguard
wg genkey | tee server.key | wg pubkey | tee server.pub

Сервер: конфіг wg0.conf
#

Весь сервер описується одним файлом. PostUp/PostDown вмикають переадресацію пакетів і NAT, щоб трафік клієнтів виходив у світ через сервер:

1
2
3
4
5
6
[Interface]
Address = 10.9.0.1/24
ListenPort = 51820
PrivateKey = <приватний ключ сервера з server.key>
PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
  • 10.9.0.0/24 - приватна підмережа самого VPN (сервер отримує 10.9.0.1, клієнти - 10.9.0.2, 10.9.0.3…).
  • 51820/udp - порт, який слухає сервер (не забудь відкрити його у фаєрволі/безпековій групі VPS).
  • eth0 - зовнішній інтерфейс сервера. Перевір свій: ip route show default покаже, який інтерфейс після dev.

Щоб не копіювати ключ руками, конфіг можна зібрати так, аби він сам підставив ключ із файлу:

1
2
3
4
5
6
7
8
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.9.0.1/24
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/server.key)
PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE
EOF

Піднімаємо тунель і додаємо службу в автозапуск однією командою:

1
2
systemctl enable --now wg-quick@wg0
wg show

wg show має показати інтерфейс wg0, його публічний ключ і listening port: 51820 - сервер готовий приймати клієнтів.

Готовий клієнтський конфіг
#

Тепер найцікавіше - робимо повністю готовий конфіг для клієнта. Генеруємо йому ключі:

1
wg genkey | tee client.key | wg pubkey | tee client.pub

Складаємо файл client.conf, який клієнт просто імпортує:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Interface]
Address = 10.9.0.2/24
PrivateKey = <приватний ключ клієнта з client.key>
DNS = 1.1.1.1

[Peer]
PublicKey = <публічний ключ сервера з server.pub>
Endpoint = ВАШ_ПУБЛІЧНИЙ_IP:51820
AllowedIPs = 10.9.0.0/24
PersistentKeepalive = 25

Два ключові рядки, у яких найчастіше плутаються:

  • Endpoint - публічна адреса вашого VPS і порт 51820. Саме сюди клієнт стукає, щоб підняти тунель.
  • AllowedIPs - що саме завертати у VPN:
    • 10.9.0.0/24 - лише VPN-мережу (дістатися до сервера й інших клієнтів). Решта трафіку йде напряму. Так налаштовано в записі.
    • 0.0.0.0/0, ::/0 - весь трафік через VPN (повноцінний VPN: ваш публічний IP стає IP сервера, провайдер не бачить, куди ви ходите). Для цього на сервері й потрібні ip_forward + NAT з PostUp.
  • PersistentKeepalive = 25 - шле службовий пакет раз на 25 с, щоб тунель не «засинав» за NAT (важливо для клієнтів за домашнім роутером).

Залишилось сказати серверу про цього клієнта - додаємо його як peer:

1
wg set wg0 peer $(cat client.pub) allowed-ips 10.9.0.2/32

Ця команда додає peer «наживо». Щоб він пережив перезавантаження - допиши той самий блок [Peer] (з PublicKey клієнта і AllowedIPs = 10.9.0.2/32) у /etc/wireguard/wg0.conf.

QR-код для телефона
#

Офіційний застосунок WireGuard (Android/iOS) вміє імпортувати конфіг камерою. Перетворюємо client.conf на QR прямо в терміналі:

1
qrencode -t ansiutf8 < client.conf

З’являється QR - наводиш телефоном у застосунку WireGuard («+» → «Створити з QR-коду»), і клієнт налаштований за секунду, без жодного копіювання файлів.

Клієнт: підключення
#

На комп’ютері-клієнті все ще простіше. Кладемо client.conf у /etc/wireguard/wg0.conf і піднімаємо:

1
2
3
apt install -y wireguard-tools
# (на Debian для рядка DNS= ще знадобиться: apt install -y openresolv)
wg-quick up wg0

Перевіряємо, що тунель живий - пінгуємо сервер за його VPN-адресою:

1
ping -c 3 10.9.0.1

У записі видно: 3 received, 0% packet loss - пакети йдуть крізь тунель. А на сервері wg show показує нашого клієнта з живим рукостисканням:

1
2
3
4
5
peer: <публічний ключ клієнта>
  endpoint: 10.10.60.103:34121
  allowed ips: 10.9.0.2/32
  latest handshake: 10 seconds ago
  transfer: 564 B received, 476 B sent

latest handshake і зростання transfer - головний доказ, що VPN працює.

Кілька клієнтів
#

Схема масштабується елементарно: кожному новому клієнту - свій конфіг (наступна адреса 10.9.0.3, 10.9.0.4…), свої ключі й окремий блок [Peer] на сервері. Один wg set wg0 peer ... - і ще один телефон чи ноутбук у вашому VPN.

Підсумок
#

WireGuard дає свій VPN без важких конфігів і сторонніх сервісів: один файл на сервері, маленький конфіг на клієнті й QR для телефона. Приватний ключ ніколи не залишає свого пристрою, тунель шифрований, а wg show чесно показує, хто підключений. Далі можна автоматизувати видачу клієнтів скриптом або додати вебінтерфейс - але основа, як бачите, тримається на кількох командах.

Related

Vaultwarden - менеджер паролів для офісу без адміна

Паролі команди живуть у чатах і на стікерах, поки хтось не звільниться разом із доступами. Ставимо власний Vaultwarden на одну маленьку VM: окремий диск під дані, Docker, HTTPS без домену через внутрішній CA Caddy, а далі - спільний сейф організації з колекціями по відділах і запрошеннями на ~20 людей. Усе кроками, які осилить офіс без штатного адміна.

Proxmox + Cloud-Init: нова VM за секунди, а не за пів години

Щоразу ставити VM з ISO, а потім руками налаштовувати мережу, користувача і SSH - довго й нудно. Готуємо один раз шаблон з Cloud-Init, а далі клонуємо: задаємо hostname, IP і ключ прямо з Proxmox, а Cloud-Init застосовує їх при першому завантаженні. Від порожньої VM до готової машини - за секунди. Усе кроками, з відео в терміналі та у вебінтерфейсі.