lenec ru

← все посты

WireGuard на VPS за 10 минут: рабочая настройка

11K

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 qrencode

qrencode понадобится для генерации 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/24

WireGuard построит маршруты только для этих подсетей. Это и есть 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, разница в простоте и скорости заметна сразу.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.