Майже кожен VPN-сервіс збирає якісь метадані, а деякі мають нахабність зберігати ще й логи на своїх серверах. Бували випадки, коли непорядні провайдери навіть приторговували даними в даркнеті. Щоб убезпечитись – варто ретельно обирати постачальника VPN, або ж самому розгорнути власний VPN-сервер. Власне, ц цьому керівництві мова піде якраз про саме цей шлях. Я опишу як самотужки розгорнути VPN по протоколу WireGuard на базі VPS-сервера під управлінням Ubuntu.
- Навіщо потрібен свій VPN?
- Який протокол VPN обрати?
- Чому WireGuard?
- Інструкція з розгортання WireGuard на VPS-сервері
- Розгортання VPS
- Встановлення і конфігурація WireGuard VPN
- Під’єднання до WireGuard VPN з Linux (Client 1)
- Під’єднання до WireGuard VPN з Android (Client 2)
- Як налаштувати WireGuard VPN з підтримкою IPv6?
- Джерела та посилання
Навіщо потрібен свій VPN?
Переваги:
- Стаєте власником персонального віртуального Linux-сервера з “білою” IP-адресою, якою ніхто не володіє і не користується окрім вас. На сервері ви можете розгорнути також інші компоненти й використовувати їх паралельно з WireGuard;
- Жодних банів та лімітів по трафіку. Деякі VPN встановлюють ліміт на швидкість та передачу даних. Тут ви залежите лише від ліміту самого хостинг-провайдера. Зазвичай, надається до 1ТБ трафіку, що вистачить “з головою”;
- Жодних розривів з’єднання, коливань швидкості (при правильній конфігурації, виборі протоколу VPN і технічних характеристиках сервера);
- Автономність і незалежність. Власна конфігурація. Ніхто крім вас не має доступу до логів та управління сервером. Також ніхто крім вас не зможе підключитися до сервера, якщо ви налаштуєте фільтрацію по IP.
Недоліки:
- Процес розгортання і налаштування потребує навичок системного адміністратора. Помилки в конфігурації можуть створювати різні непередбачувані проблеми й погіршити якість VPN;
- VPN-сервер необхідно регулярно адмініструвати, обслуговувати, оновлювати, захищати. Постійні хакерські атаки запросто можуть скомпрометувати і вивести сервер з ладу, поставивши крапку на вашій конфіденційності;
- Менша гнучкість / функціональність у порівнянні з комерційними VPN-рішеннями. Наприклад, в Mullvad VPN за ціною одного VPS-сервера можна придбати VPN Premium-класу з доступом до численних серверів в різноманітних точках світу, між якими можна перемикатися одним клацанням миші. Організувати таку мережу самотужки на одному сервері практично неможливо. Необхідні значні ресурси.
Отже, як бачимо, “свій” VPN може бути корисним, але знадобиться далеко не кожному. Найперше тим, кому потрібно просто зашифрувати трафік для кількох домашніх пристроїв (ноутбук, мобільний, ТВ) – тоді так, власний VPN виправдає себе на 100%.
Який протокол VPN обрати?
Коротко розберемо існуючі протоколи Virtual Private Network:
- IKEv2 — розшифровується як Internet Key Exchange Version 2, є різновидом IPSec протоколу. Вважається досить швидкісним і надійним. Стандартизований згідно RFC 7296. Підтримує різні алгоритми шифрування, наприклад: AES, 3DES, Blowfish, Camellia. В IKEv2 майже відсутні вразливості, хоча один випадок все ж був зафіксований. Активно застосовується в Windows та Mac операційних системах. Загалом, може бути непоганим вибором. Однак, його не так легко налаштувати.
- WireGuard — новітній Open-Source VPN-протокол, написаний на C і Go Джейсоном Доненфелдом у 2016 році. В 2020-му був включений в ядро Linux версії 5.6. Ідея включити у лого дракона з’явилася у автора після відвідування музею Давньої Греції в Дельфах. Протокол працює відповідно до електронних стандартів: RFC 7539, RFC 7693, RFC 5869, RFC 7296. Підтримує різноманітні криптографічні алгоритми шифрування/хешування: ChaCha20, Poly1305, Curle25519, BLAKE2s, SipHash24, HKDF. З’єднання відбувається по UDP-портах з підтримкою IPv4/IPv6 адрес. Порт за замовчуванням – 51820.
- OpenVPN — один з найстаріших та надійніших VPN-протоколів, заснований у 2001 році Джеймсом Йонаном, розповсюджується за безкоштовною GNU-ліцензією. Перевірений часом й має хорошу репутацію конфіденційності (вразливості не виявлені). Використовує бібліотеку OpenSSL, яка підтримує численні алгоритми шифрування: 3DES, AES, RC5, Blowfish та інші. Має підтримку таких технологій як: NAT, DHCP, SAML, LDAP, 2FA Доступний на усіх ОС: Linux, Windows, Android, Mac/iOS. Може працювати на TCP/UDP-портах.
- L2TP — розшифровується як Layer 2 Tunneling Protocol, подібно до IKEv2, є різновидом батьківського IPSEC-протоколу. Відносно швидкий і відносно безпечний.
- PPTV — старий VPN-протокол, який має вразливості. У якості шифрування використовується Microsoft’s Point-to-Point Encryption protocol (MPPE) з максимум 128-бітними ключами.
Чому WireGuard?
З точки зору продуктивності та ефективності, безумовним лідером є WireGuard. Він показує чудові результати за рахунок компактності й простоти вихідного коду – 4000 рядків. До прикладу, IP Sec та OpenVPN містять приблизно 400 000 рядків коду. Окрім того, WireGuard стандартним компонентом Linux, споживає мінімум ресурсів й здатен досягати високовї пікової швидкості.
Для обміну ключами шифрування (ECDH) використовується криптографічний примітив Curve25519, для хешування ключів – BLAKE2s, Ed25519 використовується для сертифікатів, ChaCha20 / Poly1305 для симетричного шифрування потоків даних. WireGuard неодноразово перевірявся криптографами та аудиторами. Має просту та зрозумілу структуру. У нього хороша підтримка та інтеграція з різними сервісами/пристроями/системами (Linux, Windows, MacOS, BSD, iOS, Android). Існують додаткові скрипти і утиліти для керування та покращення функціоналу WireGuard VPN (наприклад, WireHole).
Серед потенційних недоліків є те, що WireGuard зберігає IP-адреси клієнтів і серверів у своїй конфігурації. На відміну від OpenVPN, у ньому відсутнє будь-яке маскування чи динамічне призначення IP-адрес. Кожна сторона (клієнт і сервер) має знати IP-адресу один одного для встановлення з’єднання. Авторизація відбувається лише за взаємними ключами шифрування. Окремого протоколу аутентифікації, як у тому ж OpenVPN, немає. У певних сценаріях за певних обставин це може порушити конфіденційність. Хоча з допомогою проксі-серверів і методів тунелювання можна запобігти подібним витокам.

Щодо інших протоколів, то IKEv2 не гірший, але його складніше налаштовувати, і він більш Windows-орієнтований.
L2TP і PPTV на сьогодні є вразливими, застарілими й суттєво програють Wireguard.
Протокол OpenVPN – головний конкурент WireGuard. Він є значно старішим і функціональнішим, а тому зазвичай його обирають професіонали з високими потребами. Він дозволяє вести логи і моніторинг. Активно застосовується у корпоративній сфері. Фактично, це не просто VPN-протокол, а цілий програмний комбайн. А тому містить багато вихідного коду й споживає більше системних ресурсів, потребує обслуговування.
Отже, WireGuard у цьому плані, як не крути, значно легший і мобільніший, швидко встановлюється та налаштовується, що робить його оптимальним вибором для розгортання на приватному VPS сервері.
Інструкція з розгортання WireGuard на VPS-сервері

Розгортання VPS
Розгортання віртуального сервера складається з таких етапів:
- Вибір хостинг-провайдера: Digital Ocean, Amazon Web Services (AWS), Google Cloud Platform (GCP), Linode, Oracle Cloud, OVH Cloud, HETZNER Cloud, Microsoft Azure, IBM Cloud, Alibaba Cloud. Цінова категорія в них починається десь від 5-6$ за сервер, що фактично відповідає місячній ціні середньостатистичного VPN. Можна скористатися безкоштовним сервісом AWS Free Tier й розгорнути сервер на базі EC2 –
t2.micro. - Вибір операційної системи. Оптимальними є Debian або Ubuntu 20.04+ LTS – прості в налаштуванні і стабільні системи. З ними не виникає проблем. Ubuntu, наприклад, сумісний з різним програмним забезпеченням, регулярно оновлюється й має чудову підтримку / документацію. Не рекомендую використовувати CentOS/AlmaLinux/RedHat для подібних цілей – це дуже специфічні системи, деякі старі версії не містять в своєму ядрі підтримку WG, тому з ними можуть виникнути проблеми та труднощі в процесі конфігурації.
- Вибір технічних характеристик. Підійдуть мінімальні. WireGuard не вимогливий до ресурсів. Його можна запустити навіть на VPS з 1 vCPU, 256Mb RAM, 8GB HDD.
- Вибір локації. Обирайте сервери розташовані максимально близько до вас. Чим далі сервер – тим більший пінг, а відтак затримка з’єднання. Наприклад, якщо ви територіально знаходитесь в Центральній Європі, а ваш VPN-сервер в Японії – пінг може досягати 300-400 мс.
- Налаштування доступу. Налаштовуємо авторизацію по SSH-ключу (генеруємо з допомогою
ssh-keygen, права доступу виставляємо0600, публічний ключ копіюємо в~/.ssh/authorized_keysна сервері, а в/etc/ssh/sshd_configпрописатиPasswordAuthentication no). Команда для під’єднання:ssh -i ~/.ssh/key.pem ubuntu@X.X.X.X
Встановлення і конфігурація WireGuard VPN
Крок 1. Оновлюємо систему:
sudo su -sudo apt update -y && apt upgrade -y
Крок 2. Відкриваємо необхідні мережеві порти в Firewall:
TCP | 22 | 0.0.0.0/0– порт SSH для з’єднання з сервером і обслуговування, дозволено увесь вхідний IPv4 трафік (можна встановити лише свою IP-адресу);UDP | 51820 | 0.0.0.0/0– порт WireGuard для роботи VPN-протоколу, дозволено увесь вхідний IPv4 трафік (додати правила для вхідних і вихідних з’єднань Inbound/Outbound).TCP | 22 | ::/0– додаємо, якщо потрібна підтримка IPv6;UDP | 51820 | ::/0– додаємо, якщо потрібна підтримка IPv6.
Примітка: вищевказані порти мають бути відкриті як на стороні сервера, так і хостинг-провайдера. У деяких випадках можуть також знадобитися відкриті ICMP v4/v6 порти. Якщо на сервері працюють файєрволи, наприклад UFW/CSF, або інші антифрауд системи – вони блокуватимуть з’єднання. Необхідно відконфігурувати правила, наприклад:
sudo ufw allow 22/tcp
sudo ufw allow 51820/udp
sudo ufw enable
sudo ufw status verbose
Крок 3. Встановлюємо офіційний пакет WireGuard:
- Ubuntu/Debian:
sudo apt install wireguard wireguard-tools -y - CentOS/RHEL/AlmaLinux:
sudo dnf install wireguard-tools -y
Крок 4. Генеруємо ключі шифрування WireGuard по моделі server-client:
sudo -i cd /etc/wireguard/ umask 007 wg genkey | tee server.key | wg pubkey > server.pub wg genkey | tee client1.key | wg pubkey > client1.pub
В результаті отримаємо такі файли:

Примітка: У даному прикладі ми наперед згенерували ключі не тільки для сервера, а й для клієнта. У деяких випадках ключі для клієнта можна згенерувати на стороні самого клієнта, а потім передати на сервер спеціальною командою. Головне, не розголошуйте нікому приватні ключі й завжди зберігайте їх у безпеці.
Крок 5. Налаштовуємо форвардинг адрес IPv4:
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.confsudo sysctl -p
Крок 6. Створюємо файл конфігурації VPN:
nano /etc/wireguard/wg0.conf і прописуємо в ньому наступну конфігурацію:
[Interface] Address = 10.0.0.1/24 # приватний діпазон за замовчуванням в підмережі WireGuard, можна вказати і інший, наприклад 172.16.0.0/24 або 192.168.0.0/24 ListenPort = 51820 # порт VPN-сервера PrivateKey = <ВМІСТ SERVER.KEY> # приватний ключ VPN-сервера PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # правила маршрутизації для firewall PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = <ВМІСТ CLIENT1.PUB> # публічний ключ клієнта AllowedIPs = 10.0.0.2/32 # локальна адреса клієнта в підмережі WireGuard
Примітка: замість
eth0треба підставити мережевий інтнерфейс власної системи. Для того, щоб дізнатися його назву виконайте команду:ip -o -4 route show to default | awk '{print$5}'
Запускаємо WireGuard VPN:
sudo systemctl enable wg-quick@wg0sudo systemctl start wg-quick@wg0sudo systemctl status wg-quick@wg0sudo wg showsudo wg-quick up wg0
Під’єднання до WireGuard VPN з Linux (Client 1)
Тепер, необхідно підключитися до нашого VPN-сервера. Першим клієнтом виступить домашня система на базі Linux. На ній теж треба встановити WireGuard:
- Ubuntu/Debian:
sudo apt-get install wireguard - Arch Linux:
sudo pacman -S wireguard-tools
Аналогічно, створюємо файл конфігурації, подібного до того, як ми створювали його на сервері: nano /etc/wireguard/wg0.conf
[Interface] PrivateKey = <ВМІСТ CLIENT1.KEY> # приватний ключ клієнта, згенерований раніше Address = 10.0.0.2/32 # локальна IP-адреса клієнта в підмережі WireGuard (/32 - вказує єдиний IP клієнта) DNS = 1.1.1.1 # публічний DNS-сервер, наприклад Cloudflare або будь-який інший [Peer] PublicKey = <ВМІСТ SERVER.PUB> # публічний ключ VPN-сервера Endpoint = Публічна_IP_адреса_VPN_сервера:51820 # адреса VPN-сервера для підключення AllowedIPs = 0.0.0.0/0 # доступний увесь трафік через VPN PersistentKeepalive = 25 # підтримка з'єднання, пінг кожних 25 секунд
Підключаємося до WireGuard VPN: sudo wg-quick up wg0
Якщо все зроблено вірно – буде ініційоване VPN-з’єднання.
Допоміжні команди:
sudo wg show– переглянути статус з’єднання, контроль трафіка;sudo wg-quick down wg0– вимикає сервер.
Під’єднання до WireGuard VPN з Android (Client 2)
Особливістю WireGuard VPN є його бездоганна сумісність з Android.
Отже для того, щоб ініціювати з’єднання ще одного клієнта, необхідно згенерувати ключі для нього на VPN-сервері:
umask 077 wg genkey | tee client2.key | wg pubkey > client2.pub
І далі додати в файл конфігурації /etc/wireguard/wg0.conf просто ще одну секцію [Peer], наприклад:
[Interface] Address = 10.0.0.1/24 # локальна адреса VPN-сервера в підмережі WireGuard ListenPort = 51820 # порт VPN-сервера PrivateKey = <ВМІСТ SERVER.KEY> # приватний ключ VPN-сервера, згенерований раніше PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # правила маршрутизації для firewall PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE # правила маршрутизації для firewall [Peer] # Client 1 PublicKey = <ВМІСТ CLIENT1.PUB> # публічний ключ клієнта AllowedIPs = 10.0.0.2/32 # локальна адреса клієнта в підмережі WireGuard [Peer] # Client 2 PublicKey = <ВМІСТ CLIENT2.PUB> # публічний ключ клієнта AllowedIPs = 10.0.0.3/32 # локальна адреса клієнта в підмережі WireGuard ...інші клієнти
Тепер необхідно підготувати файл конфігурації для клієнта. Він буде аналогічним Client 1, потрібно всього лиш підставити правильні ключі і локальну адресу клієнта. Далі готовий файл конфігурації перетворюємо на QR-код командою: qrencode -t ansiutf8 < client2.conf. Скануємо його мобільним додатком WireGuard та імпортуємо:


Як налаштувати WireGuard VPN з підтримкою IPv6?
Перша за все, необхідно перевірити чи ваш хостинг-провайдер надає IPv6 адреси. Якщо так, то необхідно попередньо додати пул IPv6 CIDR у свою підмережу (VPC, Subnet). Також необхідно обов’язково відкрити порти для адрес IPv6 в файєрволі (подібно до IPv4).
Форвардинг IPv6:
echo "net.ipv6.conf.all.forwarding=1" | sudo tee -a /etc/sysctl.conf sudo sysctl -p

Файл конфігурації для сервера:
# Робоча конфігурація сервера з IPv6 [Interface] Address = 10.10.10.1/24, fd05:68b2:ce9f:62c5::1/64 # вказуємо локальні адреси IPv4 і IPv6 підмережі WireGuard. IPv6 генерується довільним чином з допомогою будь-якого ULA-генератора. Він має бути унікальним, і не зв'язаний з публічною IPv6 адресою ListenPort = 51820 PrivateKey = <SERVER.KEY> PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # правила маршрутизації для Firewall IPv4 та IPv6 PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = <CLIENT1.PUB> AllowedIPs = 10.10.10.2/32, fd05:68b2:ce9f:62c5::2/128 # аналогічно вказуємо IPv4 і IPv6 підмережі. IPv6 змінюємо на 2/128. Наступні клієнти будуть просто змінювати послідовність: 3/128, 4/128 і т.д.
Файл конфігурації для клієнта:
# Робоча конфігурація клієнта з IPv6 [Interface] PrivateKey = <CLIENT1.KEY> Address = 10.10.10.2/32, fd05:68b2:ce9f:62c5::2/128 # локальні адреси IPv4, IPv6 DNS = 1.1.1.1, 2606:4700:4700::1111 # публічний DNS серве, в IPv4 та IPv6 варіантах [Peer] PublicKey = <SERVER.PUB> Endpoint = Публічна_IPv4_адреса_сервера:51820 AllowedIPs = 0.0.0.0/0, ::/0 # дозволяємо трафік і для IPv4, і для IPv6 адрес PersistentKeepalive = 25
Таким чином, трафік буде проходити одночасно і по IPv4, і по IPv6 тунелям. Перевірити це можна скориставшись командами нижче:
ipv6-test.comip -6 addr show eth0curl -6 ifconfig.metraceroute6 www.gooogle.comsudo ss -ulnp | grep 51820tcpdump -nettti wg0 "ip6"
Примітка: Конфігурація виключно з IPv6, без підтримки IPv4, залежить від архітектури мережі той чи іншої серверної інфраструктури. На різних серверах (AWS, Linode, Hetzner) можуть бути різні мережеві налаштування, а тому конфігурація не може бути для усіх універсальною. В деяких випадках, в конфігу “сервер-клієнт” достатньо вказати лише IPv6, інші же можуть вимагати внесення додаткових правил маршрутизації. Також можуть знадобитися сторонні утиліти, такі як “proxy NDP“.
Джерела та посилання
Перевірити швидкість інтернет-з’єднання:
Перевірити чи є витік даних у VPN-з’єднанні:
Документації, скрипти, інше:
- WireGuard Installation Guide
- WireGuard White Paper
- Документація по WireGuard на GitHub
- Імпровізований авторський курс по WireGuard VPN
- Таблиця порівняння різних VPN-протоколів
- GitHub. Wireguard Installer.
- DNSCHECKER. Local IPv6 Address Generator
Автор: © Konrad Ravenstone, KR. Laboratories Research

