Стартовые цены: все тарифы на 30% дешевле самого дешёвого конкурента. Сравнение ценКаждый тариф на 30% дешевле самого дешёвого офшорного хостера

База знаний · VPS

Как развернуть собственный VPN на VPS с помощью WireGuard

Разверните VPN на VPS с помощью WireGuard: установите его на Ubuntu 24.04 или Debian, напишите wg0.conf с NAT, откройте нужные порты в UFW, добавьте клиентов по QR-коду и проверьте, нет ли утечек.

Обновлено 11 мин чтения

В этом руководстве

  • WireGuard работает внутри ядра Linux, поэтому для личного VPN достаточно самого маленького тарифа VPS.
  • Создайте ключи с umask 077, затем напишите /etc/wireguard/wg0.conf с NAT на вашем реальном сетевом интерфейсе.
  • Включите пересылку IP-пакетов, разрешите в UFW порт 51820/udp и маршрут туннеля, но сначала убедитесь, что SSH остаётся открытым.
  • Выдайте каждому устройству собственную пару ключей и адрес; телефоны считывают свою конфигурацию в виде QR-кода.
  • Прежде чем полагаться на туннель, проверьте публичный IP-адрес, DNS и IPv6 с подключённого устройства.
VPS13 разделов
Все руководства
На этой странице
  1. Перед началом: что нужно для VPS с WireGuard
  2. Установка WireGuard на Ubuntu или Debian
  3. Генерация ключей сервера и клиентов
  4. Конфигурация сервера WireGuard
  5. Включение пересылки IP-пакетов
  6. Открытие портов в брандмауэре
  7. Запуск туннеля и автозапуск при загрузке
  8. Добавление клиента
  9. Добавление IPv6 (необязательно)
  10. Проверка на утечки
  11. Обновление VPS с WireGuard и добавление клиентов
  12. Устранение неполадок
  13. Часто задаваемые вопросы

Чтобы развернуть собственный VPN на VPS с помощью WireGuard, установите пакет wireguard, создайте пары ключей для сервера и каждого устройства, опишите туннель в /etc/wireguard/wg0.conf с NAT на сетевой интерфейс сервера, включите пересылку IP-пакетов, откройте UDP-порт 51820 и запустите wg-quick@wg0. Каждое устройство подключается с помощью собственного файла конфигурации или QR-кода.

Эти шаги настраивают WireGuard на офшорном VPS с Ubuntu 24.04 LTS, Debian 12 или Debian 13 и root-доступом по SSH, как описано в руководстве по началу работы. Замените SERVER_IP на IPv4-адрес своего сервера, а eth0 — на имя своего сетевого интерфейса.

Перед началом: что нужно для VPS с WireGuard

  • VPS с публичным IPv4-адресом. Каждый тариф включает выделенный IPv4-адрес и блок IPv6 /64.
  • Root-доступ по SSH.
  • Приложение WireGuard на каждом устройстве. На странице установки WireGuard перечислены официальные приложения для Windows, macOS, iOS и Android; на компьютерах с Linux используется пакет wireguard-tools.

Достаточно самого маленького тарифа. WireGuard работает внутри ядра Linux и потребляет мало памяти, поэтому тарифа Dinghy (1 vCPU, 1 ГБ ОЗУ, $2.39 в месяц) хватит для личного VPN. Шифрование нагружает процессор: выбирайте больше vCPU, если много устройств будут одновременно передавать большие объёмы данных. Трафик безлимитный в рамках принципа добросовестного использования.

Локация рядом с вами обеспечит быструю работу в интернете, а локация в другой стране изменит то, чьи законы применяются к серверу. Перед выбором сравните задержку на странице о сети и прочитайте наше руководство об офшорном VPS для VPN. Как и в случае с любым VPS без KYC, ваш аккаунт — это адрес электронной почты и пароль, а оплата — в криптовалюте.

Наши правила допустимого использования относят VPN к приветствуемым видам использования. Трафик ваших устройств выходит в интернет с IP-адреса вашего сервера, поэтому нарушения, совершённые через туннель, считаются исходящими с вашего сервера: давайте доступ только тем, кому доверяете. Исходящий порт 25 по умолчанию закрыт.

Установка WireGuard на Ubuntu или Debian

Чтобы настроить WireGuard на Ubuntu 24.04 или Debian, установите три пакета и проверьте версию:

apt update
apt install -y wireguard ufw qrencode
wg --version

Пакет wireguard устанавливает утилиты wg и wg-quick. Сам туннель в Ubuntu 24.04 и Debian 12 и 13 входит в ядро, поэтому ничего компилировать не нужно. Пакет ufw устанавливает также команду iptables, которую используют правила NAT; если вы управляете брандмауэром через nftables, этот пакет можно не ставить. qrencode рисует QR-коды для телефонов.

Генерация ключей сервера и клиентов

cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee laptop.key | wg pubkey > laptop.pub

umask 077 делает файлы, создаваемые в этой оболочке, доступными для чтения только root, а каталог /etc/wireguard и так закрыт для других пользователей. wg genkey выводит случайный закрытый ключ, а wg pubkey вычисляет из него открытый ключ, как в кратком руководстве WireGuard. Любой, у кого есть закрытый ключ, может подключиться от имени этого устройства, поэтому храните его в секрете.

Используйте для каждого устройства отдельную пару ключей, названную по его имени, — так можно отозвать доступ одного устройства, не затрагивая остальные. Ключи устройства можно также сгенерировать на самом устройстве и скопировать на сервер только его открытый ключ.

Конфигурация сервера WireGuard

Вся настройка сервера WireGuard хранится в одном файле. Сначала определите интерфейс, через который идёт интернет-трафик сервера:

ip route show default

Слово после dev — это его имя, например eth0, ens3 или enp1s0: укажите его в обеих строках NAT. Фрагменты $(cat ...) подставляют ключи в файл:

cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/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]
# laptop
PublicKey = $(cat /etc/wireguard/laptop.pub)
AllowedIPs = 10.8.0.2/32
EOF
chmod 600 /etc/wireguard/wg0.conf
Адрес
Адрес сервера внутри туннеля. В частном диапазоне 10.8.0.0/24 хватит места для 253 устройств.
ListenPort
UDP-порт, к которому подключаются устройства; 51820 — порт из официальных примеров WireGuard.
PrivateKey
Закрытый ключ сервера — именно поэтому файл должен оставаться доступным для чтения только root.
PostUp и PostDown
Команды, которые wg-quick выполняет через bash при запуске и остановке туннеля, как описано в его man-странице. Здесь они добавляют и удаляют NAT, чтобы устройства выходили в интернет с IPv4-адреса сервера.
[Peer]
По одному блоку на каждое устройство. WireGuard отбрасывает любой пакет от устройства, если адрес отправителя не входит в его AllowedIPs; этот принцип называется маршрутизацией по криптографическим ключам (cryptokey routing).

Включение пересылки IP-пакетов

Linux передаёт пакеты между интерфейсами, только если включена пересылка, а по умолчанию она, согласно документации ядра, выключена. Включите её сейчас и при каждой загрузке:

echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-wireguard.conf
sysctl --system
sysctl net.ipv4.ip_forward

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

Открытие портов в брандмауэре

Сначала разрешите SSH, чтобы включение UFW не отрезало вам доступ, затем — порт WireGuard и маршрут для выхода трафика из туннеля:

ufw allow 22/tcp
ufw allow 51820/udp
ufw route allow in on wg0 out on eth0
ufw enable
ufw status verbose

Если вы сменили порт SSH по руководству по усилению защиты, разрешите вместо 22 свой порт. ufw enable предупреждает, что существующие SSH-соединения могут прерваться; ответьте y. По умолчанию UFW отбрасывает пересылаемый трафик, и в его статусе отображается deny (routed), поэтому именно правило route выпускает трафик туннеля через eth0. Ответы возвращаются автоматически, и каждое правило действует также для IPv6.

Вариант с nftables вместо UFW

Если вы используете собственный /etc/nftables.conf из руководства по усилению защиты, пропустите UFW, удалите строки PostUp и PostDown из wg0.conf, добавьте udp dport 51820 accept в цепочку input, а в конец файла добавьте эту таблицу:

table inet wg-nat {
  chain postrouting {
    type nat hook postrouting priority srcnat;
    ip saddr 10.8.0.0/24 oifname "eth0" masquerade
  }
}

Проверьте файл, затем загрузите его:

nft -c -f /etc/nftables.conf
nft -f /etc/nftables.conf

Правило NAT, записанное в файле, сохраняется при перезагрузке правил. Если бы его добавлял PostUp, оно исчезало бы всякий раз, когда выполняется строка flush ruleset из этого файла.

Запуск туннеля и автозапуск при загрузке

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

wg-quick@wg0 читает wg0.conf, создаёт интерфейс wg0, выполняет команды PostUp и запускается снова при каждой загрузке. wg show показывает listening port: 51820 и ваш ноутбук в качестве пира — без рукопожатия, пока ноутбук не подключится. Если служба не запускается, посмотрите её журнал командой journalctl -u wg-quick@wg0 -b.

Добавление клиента

Ноутбук или настольный компьютер: файл конфигурации

Создайте файл для ноутбука на сервере, подставив IPv4-адрес сервера вместо SERVER_IP:

umask 077
cat > /etc/wireguard/laptop.conf <<EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/laptop.key)
Address = 10.8.0.2/32
DNS = 9.9.9.9

[Peer]
PublicKey = $(cat /etc/wireguard/server.pub)
Endpoint = SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
AllowedIPs = 0.0.0.0/0, ::/0
Весь трафик идёт через туннель. Оставьте ::/0, даже если на сервере нет IPv6: тогда трафик IPv6 попадает в туннель и отбрасывается там, а не утекает в обход него.
DNS
9.9.9.9 — это Quad9: он блокирует вредоносные домены и проверяет DNSSEC; подойдёт любой резолвер, которому вы доверяете. Запросы передаются внутри туннеля.
PersistentKeepalive = 25
Не даёт домашним роутерам и мобильным сетям закрывать соединение. Краткое руководство WireGuard называет 25 секунд «разумным интервалом, который работает с самыми разными брандмауэрами».

Скопируйте файл, запустив команду на ноутбуке (если после усиления защиты вход под root отключён, копируйте через своего пользователя с правами sudo), затем удалите с сервера закрытый ключ ноутбука и его файл — серверу нужен только открытый ключ:

scp root@SERVER_IP:/etc/wireguard/laptop.conf .
rm /etc/wireguard/laptop.key /etc/wireguard/laptop.conf

В Windows и macOS импортируйте файл в приложение WireGuard. В Linux скопируйте его в /etc/wireguard/ и выполните wg-quick up laptop; для строки DNS нужен resolvconf, который в Ubuntu предоставляет systemd-resolved, а в Debian — пакет openresolv.

Телефон: сканирование QR-кода

Телефону нужны собственные ключи, адрес и блок [Peer] на сервере:

cd /etc/wireguard
umask 077
wg genkey | tee phone.key | wg pubkey > phone.pub
cat >> /etc/wireguard/wg0.conf <<EOF

[Peer]
# phone
PublicKey = $(cat /etc/wireguard/phone.pub)
AllowedIPs = 10.8.0.3/32
EOF
systemctl reload wg-quick@wg0

Создайте phone.conf по образцу laptop.conf, с phone.key и 10.8.0.3/32, и выведите его в терминале:

qrencode -t ansiutf8 < /etc/wireguard/phone.conf

Отсканируйте его в приложении WireGuard с помощью функции добавления по QR-коду, затем удалите phone.key и phone.conf с сервера.

Добавление IPv6 (необязательно)

Проще всего дать устройствам IPv6 с помощью частного диапазона внутри туннеля, который транслируется в публичный IPv6-адрес сервера, как и в случае с IPv4; тогда устройства совместно используют этот адрес. Частные диапазоны начинаются с fd, за которым следуют случайные цифры (RFC 4193), поэтому выберите собственный диапазон вместо fd8c:5e2a:91b4::/64. Остановите туннель командой systemctl stop wg-quick@wg0, затем в wg0.conf замените строку Address и добавьте строки NAT для IPv6 под строками для IPv4:

Address = 10.8.0.1/24, fd8c:5e2a:91b4::1/64
PostUp = ip6tables -t nat -A POSTROUTING -s fd8c:5e2a:91b4::/64 -o eth0 -j MASQUERADE
PostDown = ip6tables -t nat -D POSTROUTING -s fd8c:5e2a:91b4::/64 -o eth0 -j MASQUERADE

Назначьте каждому устройству IPv6-адрес с обеих сторон, например AllowedIPs = 10.8.0.2/32, fd8c:5e2a:91b4::2/128 в его блоке [Peer] и Address = 10.8.0.2/32, fd8c:5e2a:91b4::2/128 в его собственном файле. Затем включите пересылку IPv6 и снова запустите туннель:

echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.d/99-wireguard.conf
sysctl --system
systemctl start wg-quick@wg0

При использовании nftables вместо этого добавьте ip6 saddr fd8c:5e2a:91b4::/64 oifname "eth0" masquerade в таблицу wg-nat. Можно выдавать и публичные адреса из вашей подсети /64, но в зависимости от того, как этот блок маршрутизируется на ваш сервер, для них обычно требуется проксирование обнаружения соседей (neighbor discovery).

Проверка на утечки

С подключённого устройства, а не с сервера, проверьте три вещи:

  1. Публичный IP-адрес. Сайт для определения IP-адреса должен показывать IPv4-адрес вашего сервера, а если вы добавили IPv6 — ещё и его IPv6-адрес, но ни в коем случае не ваш домашний адрес.
  2. DNS. Тест на утечку DNS должен показывать только резолверы сервиса, указанного в строке DNS, а не резолверы вашего интернет-провайдера.
  3. IPv6. Если IPv6 в туннеле нет, никакой IPv6-адрес вообще не должен отображаться. Если виден ваш домашний IPv6-адрес, проверьте, что AllowedIPs устройства содержит ::/0.

После этого wg show на сервере показывает для устройства latest handshake и строку transfer, значения в которой растут по мере работы в интернете. Туннель меняет адрес, который видят сайты, но не аккаунты, в которые вы входите.

Обновление VPS с WireGuard и добавление клиентов

Обновления WireGuard приходят вместе с ядром и wireguard-tools. Их устанавливают автоматические обновления безопасности из руководства по усилению защиты; новое ядро начинает работать после перезагрузки, а wg-quick@wg0 запускается сам. Делайте резервную копию /etc/wireguard — там хранится закрытый ключ сервера.

  • Ещё одно устройство: повторите шаги для телефона со следующим свободным адресом — 10.8.0.4/32 и так далее.
  • Применение изменений в пирах: systemctl reload wg-quick@wg0 выполняет wg syncconf, что, согласно руководству wg, «имеет то преимущество, что не прерывает текущие сеансы пиров».
  • Удаление устройства: удалите его блок [Peer] и перезагрузите конфигурацию. Его ключ сразу перестанет работать.
  • Дополнительно: PresharedKey, полученный с помощью wg genpsk и заданный на обеих сторонах соединения с пиром, добавляет шифрование с симметричным ключом «для постквантовой стойкости».

Устранение неполадок

Нет рукопожатия

Если для устройства в wg show нет latest handshake, значит, обмен ключами так и не завершился. Проверьте, что:

  • служба работает: systemctl status wg-quick@wg0;
  • UFW разрешает 51820/udp. Некоторые сети блокируют UDP, а у WireGuard нет режима TCP, поэтому проверьте подключение также через мобильный интернет;
  • в Endpoint устройства указаны правильные адрес и порт;
  • ключи указаны крест-накрест: в файле устройства — открытый ключ сервера, а в блоке [Peer] на сервере — открытый ключ устройства.

Рукопожатие есть, трафика нет

Если рукопожатие есть, а сайты не открываются, значит, сервер не пересылает трафик или не транслирует адреса. Проверьте, что:

  • sysctl net.ipv4.ip_forward выводит 1;
  • в правиле NAT указан интерфейс из вывода ip route show default. Неверное имя даёт именно такой симптом, а по счётчикам в iptables -t nat -L POSTROUTING -n -v видно, срабатывает ли правило. Исправляйте его при остановленном туннеле, как описано выше;
  • в UFW есть правило route allow;
  • Address устройства совпадает с его AllowedIPs на сервере;
  • имена разрешаются. Если ping 9.9.9.9 работает, а сайты не открываются, исправьте строку DNS.

Одни сайты загружаются, другие зависают: MTU

wg-quick задаёт MTU туннеля на 80 байт меньше, чем у локальной сети: 1420 для обычного канала с MTU 1500 байт. Если дальше по пути встречается меньший MTU, например линия DSL с PPPoE за вашим роутером, большие пакеты теряются: небольшие страницы открываются, а скачивание файлов и некоторые сайты зависают. Добавьте MTU = 1380 в секцию [Interface] на устройстве и переподключитесь. Если этого недостаточно, попробуйте 1280 — минимальный MTU, который допускает IPv6.

Часто задаваемые вопросы

Запуск VPN для себя — обычное использование сервера, и наши правила допустимого использования относят VPN к приветствуемым видам использования на любом тарифе. Что вам разрешено делать через него, зависит от законов страны, где находитесь вы, и страны, где работает сервер, поэтому уточните требования своей юрисдикции. Трафик из туннеля выходит в интернет с IP-адреса вашего сервера.

Сколько устройств может обслуживать один сервер WireGuard?

В диапазоне 10.8.0.0/24 из этого руководства есть место для 253 устройств помимо сервера. На практике ограничивает не протокол, а процессорное время на шифрование и ваша пропускная способность. Следите за выводом top в часы пик и переходите на более мощный тариф, если загрузка процессора держится около 100%.

Ведёт ли WireGuard логи?

WireGuard не ведёт логов подключений. Пока туннель работает, он хранит в памяти последний IP-адрес и порт каждого устройства — их показывает wg show, а journald фиксирует, когда wg-quick запускается и останавливается. Мы не записываем в логи и не анализируем трафик клиентских серверов, поэтому у нас нет никаких записей о том, что проходит через ваш туннель.

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

Тот UDP-порт, который вы зададите в ListenPort; в этом руководстве используется 51820 — порт из официальных примеров WireGuard. Чтобы сменить его, отредактируйте ListenPort, порт в Endpoint каждого устройства и правило брандмауэра. WireGuard работает только по UDP, поэтому сеть, которая блокирует UDP, заблокирует его на любом порту.

Застряли на каком-то шаге?

Клиенты с выделенными и GPU-серверами могут открыть тикет в личном кабинете, указав IP-адрес сервера и то, что они уже пробовали сделать. Целевой срок первого ответа — менее 12 часов. Для всех остальных серверов используйте действия с сервером на его странице, руководства и страницу статуса сети.

С возвращением

Войдите, чтобы управлять серверами и балансом.

Без KYCПроверка на человека с помощью Cloudflare TurnstileБез отслеживания