Все статьи
Руководства

Личный VPN на WireGuard: настройка на своём VPS

Коротко

Личный VPN на WireGuard поднимается на VPS за 20-30 минут: установите пакет wireguard, сгенерируйте ключи командой wg genkey, опишите туннель в /etc/wireguard/wg0.conf с адресом 10.8.0.1/24 и портом 51820, включите пересылку пакетов и NAT, откройте 51820/udp и запустите systemctl enable --now wg-quick@wg0. Телефон подключается сканированием QR-кода, а для одного-двух человек хватает самого младшего тарифа.

Главное
  • WireGuard - VPN-протокол, встроенный в ядро Linux с версии 5.6: на VPS с Ubuntu или Debian он ставится командой sudo apt install wireguard и настраивается одним файлом /etc/wireguard/wg0.conf.
  • Сервер WireGuard по умолчанию слушает UDP-порт 51820; в файрволе открывают только его - sudo ufw allow 51820/udp.
  • Чтобы весь трафик клиента шёл через VPS, на сервере включают net.ipv4.ip_forward=1 и NAT (iptables MASQUERADE), а в конфиге клиента указывают AllowedIPs = 0.0.0.0/0.
  • Конфиг WireGuard переносится на телефон QR-кодом: qrencode -t ansiutf8 < phone.conf рисует код прямо в терминале, его сканирует официальное приложение WireGuard.
  • Личному VPN на одного-двух человек хватает VPS с 1 vCPU и 2 ГБ памяти - на Tihost такой сервер стоит $4.00 в месяц.

Зачем свой VPN на VPS

  • Защищённое подключение в публичных Wi-Fi - в кафе, отеле или аэропорту весь трафик идёт до вашего сервера в зашифрованном туннеле;
  • доступ к своим сервисам - админки, базы данных и мониторинг можно закрыть от интернета и открыть только для адресов VPN-сети 10.8.0.0/24;
  • доступ к домашней сети - домашний роутер или мини-сервер подключается к тому же VPS как ещё один клиент, и вы достаёте до него из любой точки;
  • фиксированный IP - в белые списки рабочих систем, панелей и файрволов достаточно добавить один публичный IPv4-адрес сервера.

WireGuard проще OpenVPN и IPsec: конфиг занимает десяток строк, ключи - короткие строки, как в SSH, а соединение восстанавливается само при смене сети, например при переходе с Wi-Fi на мобильный интернет. Подробности о протоколе - на wireguard.com.

Какой сервер нужен для WireGuard

WireGuard работает в ядре и почти не нагружает процессор, поэтому для одного-двух человек хватает младшей конфигурации Starter - 1 vCPU и 2 ГБ памяти за $4.00 в месяц. Важно, чтобы VPS был на полной виртуализации KVM со своим ядром - на Tihost это так. Локацию выбирайте ближе к себе: чем меньше задержка до сервера, тем незаметнее VPN. Как сравнить Германию, Финляндию и Польшу - в статье о выборе локации VPS.

Шаг 1. Установите WireGuard

Пакет wireguard ставит утилиты wg и wg-quick, qrencode понадобится для QR-кода, а iptables - для NAT (в минимальной установке Debian 12 его может не быть):

bash
sudo apt update
sudo apt install -y wireguard qrencode iptables

Шаг 2. Сгенерируйте ключи сервера и клиента

У каждого участника туннеля - пара ключей: закрытый (private) хранится только у него, открытый (public) отдаётся другой стороне. umask 077 делает новые файлы доступными только root. Последняя команда выводит ключи - они понадобятся в конфигах:

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

Шаг 3. Создайте конфиг сервера wg0.conf

Сначала узнайте имя внешнего сетевого интерфейса - оно стоит после слова dev в маршруте по умолчанию. Часто это eth0 или ens3:

bash
ip route list default
# default via 203.0.113.1 dev eth0 proto static

Создайте файл /etc/wireguard/wg0.conf и подставьте ключи. Если интерфейс называется не eth0, замените его в строках PostUp и PostDown. PostUp при старте туннеля разрешает пересылку пакетов и включает NAT (MASQUERADE) - клиенты выходят в интернет с IP сервера, PostDown убирает эти правила при остановке:

/etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <содержимое server.key>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# телефон
PublicKey = <содержимое phone.pub>
AllowedIPs = 10.8.0.2/32

Шаг 4. Включите пересылку пакетов

По умолчанию Linux не пересылает пакеты между интерфейсами, и трафик клиента дальше сервера не пойдёт. Параметр net.ipv4.ip_forward=1 включает пересылку, а файл в /etc/sysctl.d/ сохраняет её после перезагрузки:

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

Шаг 5. Откройте порт 51820/udp

WireGuard работает по UDP, и снаружи серверу нужен только порт из ListenPort. WireGuard не отвечает на пакеты без правильного ключа, поэтому сканер портов не увидит, что на сервере работает VPN:

bash
sudo ufw allow 51820/udp
sudo ufw status

Шаг 6. Запустите туннель

wg-quick@wg0 - сервис systemd, который поднимает интерфейс wg0 из конфига и включается при загрузке сервера. wg show должен показать интерфейс, порт 51820 и одного пира (peer) - телефон:

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

Шаг 7. Подготовьте конфиг клиента

Конфиг клиента - зеркало серверного: свой закрытый ключ, открытый ключ сервера и его адрес в Endpoint (подставьте IP своего VPS). AllowedIPs = 0.0.0.0/0 отправляет в туннель весь IPv4-трафик, DNS задаёт DNS-сервер на время подключения, а PersistentKeepalive = 25 раз в 25 секунд шлёт пакет, чтобы соединение не обрывалось за NAT домашнего роутера или оператора:

phone.conf
[Interface]
PrivateKey = <содержимое phone.key>
Address = 10.8.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = <содержимое server.pub>
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Если VPN нужен только для доступа к своим сервисам, а не для всего трафика, укажите AllowedIPs = 10.8.0.0/24 - тогда через туннель пойдут только адреса VPN-сети.

Шаг 8. Перенесите конфиг на телефон QR-кодом

Сохраните конфиг клиента на сервере как /etc/wireguard/phone.conf и выведите его QR-кодом прямо в терминал. В приложении WireGuard для Android или iOS нажмите «+» и выберите сканирование QR-кода; на компьютере конфиг импортируется файлом:

bash
sudo nano /etc/wireguard/phone.conf
sudo qrencode -t ansiutf8 < /etc/wireguard/phone.conf

Шаг 9. Проверьте подключение

Включите туннель в приложении и выполните на сервере wg show: у пира должны появиться строки latest handshake с временем последнего рукопожатия и transfer с объёмом трафика. Любой сервис проверки IP на телефоне должен показать адрес вашего VPS:

bash
sudo wg show

Если рукопожатия нет, проверьте, что порт 51820/udp открыт в UFW, а в Endpoint указан правильный IP. Если рукопожатие есть, но сайты не открываются, - проверьте ip_forward и имя интерфейса в PostUp.

Как добавить ещё одно устройство

Для каждого устройства сгенерируйте свою пару ключей, допишите в wg0.conf новый блок [Peer] со следующим адресом (10.8.0.3/32, 10.8.0.4/32 и так далее) и перезапустите туннель. Один конфиг на несколько устройств не используйте: два клиента с одним ключом будут выбивать друг друга.

bash
sudo nano /etc/wireguard/wg0.conf
sudo systemctl restart wg-quick@wg0
Запустите сервер за 2 минуты

AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой.

Заказать сервер

Частые вопросы

Какой порт использует WireGuard?

WireGuard по умолчанию использует UDP-порт 51820 - он задаётся параметром ListenPort в конфиге сервера. В файрволе открывают только этот порт: sudo ufw allow 51820/udp.

Сколько ресурсов нужно VPS для WireGuard?

WireGuard работает в ядре Linux и почти не нагружает сервер: личному VPN на несколько устройств хватает VPS с 1 vCPU и 2 ГБ памяти. На Tihost такая конфигурация стоит $4.00 в месяц.

Чем WireGuard отличается от OpenVPN?

WireGuard проще в настройке - конфиг на десяток строк и ключи как в SSH, работает в ядре Linux и быстро восстанавливает соединение при смене сети. OpenVPN старше, работает в пространстве пользователя и гибче в настройке, но сложнее.

Почему WireGuard подключился, но интернет не работает?

Чаще всего на сервере не включена пересылка пакетов (net.ipv4.ip_forward=1) или в правиле MASQUERADE указан не тот сетевой интерфейс. Имя интерфейса показывает команда ip route list default - оно стоит после слова dev.

Как подключить телефон к WireGuard?

Сохраните конфиг клиента на сервере и выполните qrencode -t ansiutf8 < phone.conf - в терминале появится QR-код. В приложении WireGuard для Android или iOS выберите добавление туннеля сканированием QR-кода.

Можно ли пускать через WireGuard только часть трафика?

Да. В конфиге клиента WireGuard укажите AllowedIPs = 10.8.0.0/24 вместо 0.0.0.0/0 - тогда через туннель пойдут только адреса VPN-сети, а остальной трафик - напрямую.