WireGuard на VPS за 10 минут: рабочая настройка
WireGuard — самый быстрый и простой VPN, на который я нормально пересел в 2021-м, и с тех пор не возвращался. Конфиги короче, чем у OpenVPN, скорость лучше, отладка проще. Расскажу, как у меня выглядит «10-минутная» сборка WireGuard на VPS: для подключения с ноутбука, телефона или другого сервера.
Контекст: VPS на Ubuntu 24.04 у любого хостера с публичным IPv4. Клиенты — macOS, Linux, Android. Цель — простой персональный VPN, без изысков типа AdGuard и автоматизации с PSK-ротацией.
Установка
sudo apt update
sudo apt install -y wireguard wireguard-tools qrencodeqrencode понадобится для генерации QR-кодов под мобильные клиенты.
Включаем форвардинг
sudo sed -i 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sudo sysctl -pБез этого пакеты не будут проходить через сервер — клиенты подключатся, а интернета не получат.
Ключи сервера
cd /etc/wireguard
sudo umask 077
sudo bash -c 'wg genkey | tee server.key | wg pubkey > server.pub'
sudo cat server.key # приватный ключ сервера
sudo cat server.pub # публичный ключ сервераВ umask 077 важно: файлы не должны читаться никем, кроме root.
Конфиг сервера
Файл /etc/wireguard/wg0.conf:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server.key>
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
# Клиенты будут добавляться сюда блоками [Peer]10.8.0.1/24 — приватная подсеть VPN. /24 даёт 254 клиента, для домашнего использования с запасом. eth0 — сетевой интерфейс VPS, проверь у себя через ip a: у некоторых хостеров это ens3 или enp0s3.
Запуск
sudo systemctl enable --now wg-quick@wg0
sudo wg showВ wg show увидишь интерфейс wg0 и пока без клиентов. Открой 51820/UDP в файрволе:
sudo ufw allow 51820/udp
sudo ufw statusДобавление клиента
Каждому клиенту — своя пара ключей. Делаю прямо на сервере, чтобы потом сразу прописать в конфиг:
cd /etc/wireguard
sudo umask 077
sudo mkdir -p clients
sudo bash -c 'wg genkey | tee clients/laptop.key | wg pubkey > clients/laptop.pub'В wg0.conf добавляю блок:
[Peer]
# laptop
PublicKey = <laptop.pub>
AllowedIPs = 10.8.0.2/32Перезагружаю конфиг:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)Команда применит изменения без полного рестарта интерфейса. На простых сценариях systemctl reload wg-quick@wg0 или restart тоже работают.
Конфиг для клиента
На сервере собираю файл, который клиент скопирует к себе:
SERVER_PUB=$(sudo cat /etc/wireguard/server.pub)
LAPTOP_KEY=$(sudo cat /etc/wireguard/clients/laptop.key)
SERVER_IP=<ваш_публичный_ip>
cat <<EOF | sudo tee /etc/wireguard/clients/laptop.conf
[Interface]
PrivateKey = ${LAPTOP_KEY}
Address = 10.8.0.2/32
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = ${SERVER_PUB}
Endpoint = ${SERVER_IP}:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
EOFЧто важно:
AllowedIPs = 0.0.0.0/0— весь трафик идёт через VPN. Если хочется только доступ к 10.8.0.0/24 (split tunnel), укажи только эту подсеть.PersistentKeepalive = 25— раз в 25 секунд клиент посылает keep-alive. Полезно за NAT, чтобы соединение не разваливалось.DNS— без него клиент будет резолвить через DNS своего интернет-провайдера.
Передача конфига клиенту
На macOS/Linux
Скопируй файл, открой в WireGuard-клиенте (на macOS — App Store, на Linux — пакет wireguard или Network Manager). Импорт «from file» — и готово.
На Android/iOS
Сгенерируй QR-код прямо в терминале:
sudo qrencode -t ansiutf8 < /etc/wireguard/clients/laptop.confВ мобильном клиенте WireGuard «Add tunnel from QR code» — наводишь камеру на терминал, конфиг импортируется. Удобно.
Проверка
На клиенте запускаешь VPN. На сервере смотришь:
sudo wg showВ блоке peer должен появиться latest handshake и счётчики transfer. На клиенте проверь публичный IP:
curl ifconfig.meДолжен показать IP сервера, не твоего интернет-провайдера.
Ошибки и как их ловить
Hand shake не происходит
Самая частая причина — закрыт UDP-порт. Проверь файрвол VPS, файрвол хостера (у Yandex, Selectel, Timeweb обычно есть свой security group), и роутер на стороне клиента, если ты за NAT.
sudo ufw status
sudo iptables -L -n | grep 51820Подключился, но интернета нет
Скорее всего, не включён ip_forward или не работает MASQUERADE. Проверь:
cat /proc/sys/net/ipv4/ip_forward # должен быть 1
sudo iptables -t nat -L POSTROUTING -n | grep 10.8.0.0 # должна быть записьНет DNS
В клиентском конфиге не указан DNS, или клиент игнорирует. На macOS WireGuard сам подменяет DNS, на Linux — нужно resolvconf.
Низкая скорость
WireGuard способен на десятки и сотни Мбит/с при минимальной нагрузке на CPU. Если у тебя медленнее ожидаемого:
- Проверь, что MTU не слишком большое: на туннеле обычно 1420.
- Проверь, нет ли throttle на уровне хостера (некоторые ограничивают трафик в дешёвых тарифах).
- Запусти
iperf3между клиентом и сервером — если на голом TCP скорость уже низкая, это не WireGuard.
Клиент за провайдером с CGNAT
Если у клиента (например, мобильный интернет) симметричный CGNAT, удержать сессию помогает PersistentKeepalive. Если этого не хватает — UDP может блокироваться полностью; редкая, но встречается ситуация. Тогда лечится либо переходом на UDP-over-TCP-обходчик, либо TCP-туннелем (что-то вроде sslh-обёртки), но это уже частные случаи.
Отзыв клиента
Просто удали блок [Peer] для нужного клиента в wg0.conf и перезагрузи конфиг:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)Старый клиент больше не подключится. Не забудь удалить файлы ключей в /etc/wireguard/clients/, чтобы случайно их не реактивировать.
Несколько сетей и роутинг
Если хочется ходить через VPN только в определённые сети (например, чтобы попасть на внутренние серверы по 10.10.0.0/24, остальной трафик — обычным путём), на клиенте указываешь:
AllowedIPs = 10.10.0.0/24, 10.8.0.0/24WireGuard построит маршруты только для этих подсетей. Это и есть split tunnel. Удобно для рабочего VPN, чтобы не гнать через корпоративный сервер «Netflix и tiktok».
Безопасность
- Ключи держи только в
/etc/wireguardс правами 600. Не выкладывай в git. - На VPS используй SSH с ключами и fail2ban (отдельно от WireGuard).
- На клиенте конфиги — это паспорт. Не отправляй их в мессенджерах открытым текстом.
- Регулярно обновляй wireguard-tools: уязвимости редкие, но обновления — гигиена.
WireGuard как сетевая основа
WireGuard полезен не только как «обход блокировок». Это удобный инструмент:
- Связь между офисами/серверами.
- Закрытая сеть для дев-стенда, до которого не должны добраться сторонние IP.
- Подключение мобильного телефона к домашнему серверу для синка фото.
- Базовый кирпич для mesh-сети, если у тебя нет Tailscale/Headscale.
На моих проектах WireGuard работает между несколькими VPS у разных хостеров: они общаются по приватным IP в одной 10.x-сетке, никто не светит сервисы наружу. Конфигурация всё та же — просто на каждом узле есть peer-ы для остальных.
Шпаргалка для следующего раза
- install + ip_forward + ufw 51820/udp.
- Ключи сервера в /etc/wireguard.
- wg0.conf с MASQUERADE через PostUp/PostDown.
- Каждому клиенту — отдельная пара ключей и блок [Peer].
- Клиентский конфиг с DNS и PersistentKeepalive.
- QR-код для мобильных через qrencode.
- wg syncconf для горячего применения изменений.
WireGuard — один из тех инструментов, которые работают «как и обещали»: настроил один раз, забыл. На моих VPS он крутится годами без вмешательства. Если ты ещё крутишь OpenVPN или какой-то проприетарный туннель — попробуй WireGuard, разница в простоте и скорости заметна сразу.