Блог
DevOps · сетьDevOps 6 мин чтения

WireGuard за 5 минут: свой VPN на VPS с нуля

Пошаговая настройка WireGuard-сервера на Ubuntu VPS: генерация ключей, конфиг wg0, iptables/nftables, добавление клиентов, мобильный клиент через QR-код.

WireGuard — минималистичный VPN-протокол, встроенный в ядро Linux с 5.6. По сравнению с OpenVPN: в 3-5 раз быстрее, конфиг умещается в 10 строк, latency минимальный (UDP, никаких handshake overhead).

Ниже — рабочий конфиг за 5 минут: свой WireGuard-сервер на VPS для 5-10 клиентов (телефон, ноутбук, домашний роутер). Без Docker, без сторонних скриптов — только официальные пакеты.

Шаг 1. Установка на сервере

Ubuntu 22.04/24.04 — wireguard в основных репозиториях.

sudo apt update
sudo apt install -y wireguard qrencode
sudo apt install -y iptables-persistent   # для сохранения правил NAT

# включить forwarding в ядре
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-wg.conf
sudo sysctl -p /etc/sysctl.d/99-wg.conf

Шаг 2. Генерация ключей сервера

Приватный + публичный ключ ed25519.

cd /etc/wireguard
umask 077
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key
sudo cat server_private.key    # → SERVER_PRIVATE
sudo cat server_public.key     # → SERVER_PUBLIC

Шаг 3. Конфиг wg0.conf

Кладём в /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = SERVER_PRIVATE
Address = 10.100.0.1/24
ListenPort = 51820
SaveConfig = false

# NAT для клиентов
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# первый клиент (добавим позже)
На заметку

Если основной интерфейс не eth0, замените (проверить: ip route | grep default). Обычно — eth0 или ens3.

Шаг 4. Запустить сервис

Systemd unit wg-quick@wg0 уже готов.

sudo systemctl enable --now wg-quick@wg0

# статус
sudo wg show   # интерфейс wg0, peers пока нет
sudo ss -tulpn | grep 51820   # udp *:51820 LISTEN

Шаг 5. Открыть порт 51820 UDP в firewall

На хосте:

sudo ufw allow 51820/udp
sudo ufw reload
# или через iptables напрямую:
sudo iptables -I INPUT -p udp --dport 51820 -j ACCEPT
sudo netfilter-persistent save

Шаг 6. Добавить клиента (телефон)

Генерируем ключи клиента, дописываем секцию в wg0.conf.

wg genkey | tee client1_private.key | wg pubkey > client1_public.key
CLIENT_PRIVATE=$(cat client1_private.key)
CLIENT_PUBLIC=$(cat client1_public.key)
SERVER_PUBLIC=$(sudo cat /etc/wireguard/server_public.key)

# конфиг для клиента (сохраните как client1.conf)
cat <<EOF > client1.conf
[Interface]
PrivateKey = $CLIENT_PRIVATE
Address = 10.100.0.2/24
DNS = 1.1.1.1, 9.9.9.9

[Peer]
PublicKey = $SERVER_PUBLIC
Endpoint = your.vps.ip:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

# добавить peer в конфиг сервера
sudo tee -a /etc/wireguard/wg0.conf <<EOF

[Peer]
# client1 — phone
PublicKey = $CLIENT_PUBLIC
AllowedIPs = 10.100.0.2/32
EOF

# перезапустить wg
sudo systemctl restart wg-quick@wg0

Шаг 7. QR-код для телефона

WireGuard-приложение (iOS/Android) читает QR — не надо копипастить.

qrencode -t ansiutf8 < client1.conf
# в терминале появится QR — сканируйте с телефона

Проверка

На клиенте — включаем VPN, curl ifconfig.me должен показать IP вашего VPS.

  • На сервере: sudo wg show — видно peer, endpoint, кол-во handshake'ов, трафик.
  • На клиенте: ip a — должен быть интерфейс utun/wg0 c 10.100.0.2.
  • ping 10.100.0.1 — сервер отвечает.
  • curl ifconfig.me — IP сервера, не IP клиента.

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

WireGuard быстрее OpenVPN?
Да — обычно 300-500 Мбит/с на 1 vCPU vs 100-200 Мбит/с у OpenVPN. И latency ниже (нет TCP-in-TCP, UDP).
Как заблокировать интернет-трафик клиента (только внутренний доступ)?
На клиенте: `AllowedIPs = 10.100.0.0/24` вместо `0.0.0.0/0`. Тогда VPN идёт только к внутренней сети.
Сколько клиентов поддерживает один WG-сервер?
На VPS 2 vCPU / 4 ГБ — сотни peer'ов и десятки Гбит суммарного трафика. Ограничение обычно — не WG, а пропускная способность порта VPS.
Как ротировать ключи?
Периодически (раз в 6-12 мес) — сгенерировать новые ключи серверу, разослать новые конфиги клиентам. Простого key-rollover как в OpenVPN нет.