---
title: "Свой VPN на VPS с WireGuard: пошаговая инструкция"
description: "Настройка WireGuard на VPS с Ubuntu или Debian: ключи, конфигурация сервера, пересылка и NAT, брандмауэр, подключение телефона по QR-коду, проверка утечек."
url: https://offshoreserv.com/ru/docs/vps/wireguard-vpn
lang: ru
updated: 2026-09-26
source: HTML page at the url above (canonical); this is its Markdown version
---

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

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

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

Обновлено 26 сентября 2026 г.11 мин чтения

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

- WireGuard работает внутри ядра Linux, поэтому для личного VPN достаточно самого маленького тарифа VPS.
- Создайте ключи с umask 077, затем напишите /etc/wireguard/wg0.conf с NAT на вашем реальном сетевом интерфейсе.
- Включите пересылку IP-пакетов, разрешите в UFW порт 51820/udp и маршрут туннеля, но сначала убедитесь, что SSH остаётся открытым.
- Выдайте каждому устройству собственную пару ключей и адрес; телефоны считывают свою конфигурацию в виде QR-кода.
- Прежде чем полагаться на туннель, проверьте публичный IP-адрес, DNS и IPv6 с подключённого устройства.

VPS13 разделов

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

Эти шаги настраивают WireGuard на [офшорном VPS](https://offshoreserv.com/ru/offshore-vps) с Ubuntu 24.04 LTS, Debian 12 или Debian 13 и root-доступом по SSH, как описано в руководстве [по началу работы](https://offshoreserv.com/ru/docs/getting-started). Замените `SERVER_IP` на IPv4-адрес своего сервера, а `eth0` — на имя своего сетевого интерфейса.

> Не закрывайте SSH-сеанс, пока туннель не заработает. Если из-за ошибки в настройках брандмауэра вы потеряете доступ, консоль в личном кабинете по-прежнему позволит подключиться к VPS.

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

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

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

Локация рядом с вами обеспечит быструю работу в интернете, а локация в другой стране изменит то, чьи законы применяются к серверу. Перед выбором сравните задержку на [странице о сети](https://offshoreserv.com/ru/network) и прочитайте наше руководство [об офшорном VPS для VPN](https://offshoreserv.com/ru/blog/offshore-vps-for-vpn). Как и в случае с любым [VPS без KYC](https://offshoreserv.com/ru/no-kyc-vps), ваш аккаунт — это адрес электронной почты и пароль, а оплата — в криптовалюте.

Наши [правила допустимого использования](https://offshoreserv.com/ru/acceptable-use-policy) относят 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](https://www.wireguard.com/quickstart/). Любой, у кого есть закрытый ключ, может подключиться от имени этого устройства, поэтому храните его в секрете.

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

## Конфигурация сервера 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-странице](https://manpages.ubuntu.com/manpages/noble/en/man8/wg-quick.8.html). Здесь они добавляют и удаляют NAT, чтобы устройства выходили в интернет с IPv4-адреса сервера.
- **[Peer]**: По одному блоку на каждое устройство. WireGuard отбрасывает любой пакет от устройства, если адрес отправителя не входит в его `AllowedIPs`; этот принцип называется [маршрутизацией по криптографическим ключам (cryptokey routing)](https://www.wireguard.com/).

> Чтобы позже изменить `Address`, `PostUp` или `PostDown`, сначала остановите туннель командой `systemctl stop wg-quick@wg0`, отредактируйте файл, затем снова запустите туннель. `wg-quick` удаляет правила NAT по строкам `PostDown` в том виде, в каком они записаны на момент остановки. Строки, отредактированные во время работы туннеля, уже не соответствуют загруженным правилам: при остановке в журнал записывается ошибка, а старое правило может остаться.

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

Linux передаёт пакеты между интерфейсами, только если включена пересылка, а по умолчанию она, согласно [документации ядра](https://docs.kernel.org/networking/ip-sysctl.html), выключена. Включите её сейчас и при каждой загрузке:

```
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-странице](https://manpages.debian.org/trixie/procps/sysctl.8.en.html), и те же файлы применяются заново при каждой загрузке.

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

Сначала разрешите 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 по [руководству по усилению защиты](https://offshoreserv.com/ru/docs/security/hardening), разрешите вместо 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](https://quad9.net/service/service-addresses-and-features/): он блокирует вредоносные домены и проверяет 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](https://www.rfc-editor.org/rfc/rfc4193.html)), поэтому выберите собственный диапазон вместо `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
```

> При включённой пересылке Linux игнорирует объявления маршрутизаторов (router advertisements). Если `ip -6 route show default` показывает `proto ra`, ваш сервер получает свой IPv6-маршрут именно так: добавьте в тот же файл ещё и `net.ipv6.conf.eth0.accept_ra = 2`, иначе собственный IPv6 сервера перестанет работать, когда срок действия этого маршрута истечёт.

При использовании 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](https://manpages.ubuntu.com/manpages/noble/en/man8/wg.8.html), «имеет то преимущество, что не прерывает текущие сеансы пиров».
- **Удаление устройства:** удалите его блок `[Peer]` и перезагрузите конфигурацию. Его ключ сразу перестанет работать.
- **Дополнительно:** `PresharedKey`, полученный с помощью `wg genpsk` и заданный на обеих сторонах соединения с пиром, добавляет шифрование с симметричным ключом «для постквантовой стойкости».

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

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

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

- служба работает: `systemctl status wg-quick@wg0`;
- UFW разрешает `51820/udp`. Некоторые сети блокируют UDP, а у WireGuard [нет режима TCP](https://www.wireguard.com/known-limitations/), поэтому проверьте подключение также через мобильный интернет;
- в `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](https://www.rfc-editor.org/rfc/rfc8200.html).

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

### Законно ли держать собственный VPN на VPS?

Запуск 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-серверами могут открыть тикет в [личном кабинете](https://offshoreserv.com/ru/account/support), указав IP-адрес сервера и то, что они уже пробовали сделать. Целевой срок первого ответа — менее 12 часов. Для всех остальных серверов используйте действия с сервером на его странице, [руководства](https://offshoreserv.com/ru/docs) и страницу [статуса сети](https://offshoreserv.com/ru/status).

---

OffshoreServ — офшорный хостинг-провайдер: VPS, выделенные серверы, Windows RDP и GPU-серверы в семи юрисдикциях (Исландия, Швейцария, Молдова, Румыния, Нидерланды, Болгария и Малайзия), оплата только криптовалютой (Bitcoin, Ethereum, Monero, Tether (USDT) и Solana), без проверки личности (без KYC).

Prices and plans: https://offshoreserv.com/ru/pricing · Answers: https://offshoreserv.com/ru/faq · Every page: https://offshoreserv.com/llms.txt
