Как настроить WireGuard VPN сервер на VPS
Это руководство показывает, как развернуть собственный WireGuard VPN сервер на VPS с Ubuntu 22.04 или 24.04. Оно написано для разработчиков и администраторов, которым нужен быстрый приватный туннель для удалённого доступа, безопасной работы в публичном Wi-Fi или фиксированный IP для доступа к внутренним сервисам. В конце у вас будет работающий сервер, один настроенный клиент и QR код, который можно отсканировать телефоном.
Почему WireGuard
WireGuard сегодня является разумным выбором по умолчанию для собственного VPN. Причины практические:
- Небольшая кодовая база. Ядро проекта составляет примерно 4000 строк. OpenVPN вместе со своим TLS стеком больше на порядки, а поверхность атаки растёт вместе с объёмом кода.
- Современная криптография без выбора опций. ChaCha20-Poly1305 для шифрования и Curve25519 для обмена ключами зафиксированы. Здесь нет наборов шифров, которые можно настроить неправильно.
- Реализация в ядре. WireGuard входит в ядро Linux начиная с версии 5.6, поэтому даже небольшой VPS прокачивает трафик почти на скорости порта при низкой нагрузке на CPU.
- Минимальная конфигурация. Рабочий конфиг занимает около десяти строк, а переключение между Wi-Fi и мобильной сетью происходит незаметно, потому что сессии привязаны к ключам, а не к адресам источника.
Компромисс: в WireGuard нет управления пользователями и динамического пула адресов. Каждый клиент представляет собой пару ключей и статический IP туннеля, который вы назначаете сами. Для одного администратора и нескольких устройств это преимущество, а не ограничение.
Установка WireGuard и генерация ключей
Все команды ниже выполняются от root. Установите инструменты:
apt update apt install -y wireguard qrencode
Сгенерируйте пару ключей для сервера и одну для первого клиента. umask гарантирует, что приватные ключи не будут доступны всем на чтение:
cd /etc/wireguard umask 077 wg genkey | tee server.key | wg pubkey > server.pub wg genkey | tee client1.key | wg pubkey > client1.pub
Приватный ключ никогда не покидает машину, которой он принадлежит. В строгом развёртывании ключ клиента генерируют на самом устройстве клиента; для первой настройки допустимо сделать это на сервере, только удалите client1.key после импорта конфигурации на телефон.
Конфигурация сервера
Создайте /etc/wireguard/wg0.conf. Замените оба заполнителя реальным содержимым server.key и client1.pub:
[Interface] Address = 10.8.0.1/24 ListenPort = 51820 PrivateKey = SERVER_PRIVATE_KEY PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] # client1, телефон PublicKey = CLIENT1_PUBLIC_KEY AllowedIPs = 10.8.0.2/32
Строка PostUp превращает VPS в NAT шлюз: пакеты, приходящие из туннеля, уходят через публичный интерфейс с IP адресом сервера. Во многих образах публичный интерфейс называется ens3 или enp1s0, а не eth0. Проверьте это и поправьте обе строки:
ip route | grep default
NAT не работает без IP forwarding, который в Ubuntu по умолчанию выключен. Включите его на постоянной основе:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/99-wireguard.conf sysctl --system
Наконец, защитите конфигурацию, поскольку она содержит приватный ключ:
chmod 600 /etc/wireguard/wg0.conf
Конфигурация клиента и QR код для телефона
Создайте client1.conf в той же директории. Этот файл уйдёт на устройство клиента, поэтому в нём находятся приватный ключ клиента и публичный ключ сервера:
[Interface] PrivateKey = CLIENT1_PRIVATE_KEY Address = 10.8.0.2/24 DNS = 1.1.1.1 [Peer] PublicKey = SERVER_PUBLIC_KEY Endpoint = YOUR_VPS_IP:51820 AllowedIPs = 0.0.0.0/0 PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0 направляет весь трафик клиента через VPN. Если вам нужен доступ только к внутренней сети сервера, укажите вместо этого конкретные подсети, например 10.8.0.0/24. PersistentKeepalive поддерживает запись NAT живой в мобильных сетях.
Для телефона установите официальное приложение WireGuard из App Store или Google Play и выведите конфигурацию как QR код прямо в терминале:
qrencode -t ansiutf8 < client1.conf
В приложении выберите Add tunnel, затем Scan from QR code. Передача файлов не нужна.
Файрвол и запуск
Если вы используете ufw, откройте порт WireGuard и разрешите форвардинг трафика из туннеля в интернет:
ufw allow 51820/udp ufw route allow in on wg0 out on eth0 ufw reload
Запустите туннель и включите его автозапуск:
systemctl enable --now wg-quick@wg0 wg show
wg show покажет пира; поле latest handshake появится, как только телефон подключится. С клиента проверьте путь целиком:
- ping 10.8.0.1 подтверждает сам туннель
- любой сайт вида what is my ip теперь покажет адрес VPS, что подтверждает работу NAT
Чтобы добавить новых клиентов, повторите генерацию ключей, возьмите следующий свободный адрес (10.8.0.3/32 и так далее), допишите новый блок [Peer] в wg0.conf и выполните systemctl restart wg-quick@wg0, либо добавьте пира на лету командой wg set wg0 peer PUBKEY allowed-ips 10.8.0.3/32.
Ресурсы и когда передать задачу
WireGuard лёгкий. Каждый пир занимает несколько килобайт состояния, а шифрование в ядре обходится дёшево, поэтому VPS с 1 vCPU и 2 GB RAM спокойно обслуживает десятки одновременных клиентов. Реальным узким местом будет сетевой порт, а не процессор, и типичный трафик удалённой работы даже не приближается к его насыщению.
Для этой задачи подойдёт любой из наших тарифов VPS; каждый включает выделенный публичный IPv4 адрес в нашей собственной сети AS58269, а это именно то, что нужно конечной точке VPN. Если задача состоит в соединении целых офисов, а не отдельных устройств, настоящей работой становятся распределение ключей, мониторинг и отказоустойчивость; для такого случая мы предлагаем управляемый VPN между офисами, где туннели обслуживаем и мониторим мы, а маршрутизацию контролируете вы.
Читайте дальше
Готовы начать?
Запустите за минуты или обсудите с инженером, что подходит вашему проекту.