Сообщить об ошибке.

Защищенный доступ на сервер через WireGuard

Установка и настройка VPN на серверах под Debian

Содержание:

WireGuard - это современный, быстрый и безопасный протокол виртуальной частной сети (VPN), разработанный с акцентом на простоту, производительность и надёжность. В отличие от традиционных решений вроде OpenVPN или IPsec, WireGuard использует минималистичный код (всего около 4 000 строк в ядре Linux), что упрощает аудит и снижает риск уязвимостей. Он работает на основе криптографически стойких алгоритмов (Curve25519 для обмена ключами, ChaCha20 для шифрования, Poly1305 для аутентификации) и обеспечивает мгновенное соединение без сложных этапов согласования.

WireGuard изначально интегрирован в ядро Linux (начиная с версии 5.6) и поддерживается на всех основных платформах - от Windows и macOS до Android и iOS. Он идеально подходит для мобильных устройств благодаря способности быстро восстанавливать соединение при смене сети (например, с Wi-Fi на мобильный интернет). Благодаря своей лёгкости, скорости и простоте настройки, WireGuard быстро стал популярной альтернативой устаревшим VPN-решениям как для личного, так и для корпоративного использования.

Установка WireGuard на OS Debiab

# Обновление системы
sudo apt update && sudo apt upgrade -y

# Установка WireGuard
sudo apt install wireguard -y

Генерация ключей

# Переходим в папку настроек
cd /etc/wireguard/

# Генерация приватного и публичного ключей сервера
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

Проверка сгенерированных ключей

# Смотрим содержимое файлов
cat privatekey  # Это ваш PRIVATE_KEY (никому не показывать!)
cat publickey   # Это ваш PUBLIC_KEY (нужен для клиентов)

# Проверяем права доступа
ls -la privatekey publickey

Настройка сервера

Создаем конфигурационный файл:

sudo nano /etc/wireguard/wg0.conf

Содержимое файла:

[Interface]
Address = 10.0.0.1/24
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА>
# Клиенты будут добавляться ниже

Этот блок [Interface] описывает настройки серверной стороны WireGuard-туннеля.

  • Address = 10.0.0.1/24 задаёт внутренний IP-адрес интерфейса wg0 - он будет шлюзом для клиентов в приватной подсети 10.0.0.0/24.
  • ListenPort = 51820 указывает порт, на котором сервер принимает входящие соединения (стандартный для WireGuard).
  • SaveConfig = false означает, что динамически добавленные peer'ы (например, через wg set) не будут сохраняться в файл конфигурации при перезапуске - полезно, если управление peer'ами происходит извне (например, скриптами).

Ключевая часть - правила PostUp и PostDown:

  • При запуске интерфейса (PostUp) настраиваются правила iptables, разрешающие переадресацию трафика от клиентов WireGuard (wg0) в интернет через внешний интерфейс (eth0), а также включается MASQUERADE (маскарадинг), чтобы исходящие пакеты выглядели так, будто идут от сервера, а не от клиентов.
  • При остановке (PostDown) эти правила корректно удаляются, предотвращая «засорение» таблицы iptables.

Важно: имя внешнего интерфейса (eth0) должно соответствовать реальному (часто это ens3, enp0s3, wlan0 и т.д.). Неверное имя - частая причина, почему интернет у клиентов не работает.

Заполнение конфигурации

# Копируем приватный ключ в буфер обмена (аккуратно!)
cat /etc/wireguard/privatekey
# Вывод: <ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА>

# Вставляем в конфиг:
nano /etc/wireguard/wg0.conf

# PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА>

4. Включение IP forwarding

sudo nano /etc/sysctl.conf

Раскомментируйте/добавте строку:

net.ipv4.ip_forward=1

Примените изменения:

sudo sysctl -p

5. Запуск WireGuard

# Запуск интерфейса
sudo wg-quick up wg0

# Включение автозапуска
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

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

Для каждого клиента:

# Генерация ключей для клиента
wg genkey | tee client-privatekey | wg pubkey > client-publickey

# просмотр ключа
cat client-publickey

Добавьте в конфиг сервера (/etc/wireguard/wg0.conf):

[Peer]
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА>
AllowedIPs = 10.0.0.2/32

Важно!

  • Публичный ключ клиента идет в конфиг сервера
  • Приватный ключ клиента идет в конфиг клиента
  • Никогда не путайте их местами!

Создаем конфиг для клиента client.conf

# Создаем файл конфигурации на сервере
nano client.conf

Содержимое файла client.conf:

[Interface]
# Приватный ключ этого клиента (из файла /etc/wireguard/client-privatekey)
PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА>
# IP-адрес клиента в VPN-сети (должен совпадать с AllowedIPs на сервере)
Address = 10.0.0.2/24
# DNS-серверы для клиента
DNS = 8.8.8.8, 1.1.1.1

[Peer]
# Публичный ключ СЕРВЕРА (из файла /etc/wireguard/publickey)
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА>
# Конечная точка (IP/домен сервера и порт)
Endpoint = XXX.XXX.XXX.XXX:51820  # Ваш IP сервера: порт
# Разрешить весь трафик через VPN (0.0.0.0/0)
# Или только доступ к VPN-сети (10.0.0.0/24)
AllowedIPs = 0.0.0.0/0
# (Опционально) Предотвражение изменения IP сервера
PersistentKeepalive = 25

Как заполнить правильно:

1. PrivateKey (клиента)

Берем из файла:

cat /etc/wireguard/client-privatekey

2. PublicKey (сервера):

Берем из файла:

cat /etc/wireguard/publickey

3. Endpoint

Указываем ваш сервер IP-адрес: XXX.XXX.XXX.XXX:51820

4. AllowedIPs:

Что пускать через VPN:

  • 0.0.0.0/0 - весь трафик через VPN (интернет в том числе)
  • 10.0.0.0/24 - только доступ к VPN-сети
  • 10.0.0.0/24, 192.168.1.0/24 - VPN + локальная сеть

Пример готового конфига:

[Interface]
PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА>
Address = 10.0.0.2/24
DNS = 8.8.8.8

[Peer]
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА>
Endpoint = XXX.XXX.XXX.XXX:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Перенос клиентского конфига с сервера на клиент:

SCP (если есть SSH доступ)

Копирование конфига клиента с сервера на локальный компьютер

scp user@server_ip:~/client.conf .

QR-код (для мобильных)

# Установим qrencode на сервере
sudo apt install qrencode -y

# Создайте QR-код из конфига
qrencode -t ansiutf8 < client.conf

Проверка конфига:

# Проверить синтаксис конфига
sudo wg-quick down wg0
sudo wg-quick up wg0

# Посмотреть статус
sudo wg show

Важные моменты:

  1. Приватный ключ клиента ≠ Приватный ключ сервера
  2. Публичный ключ сервера берется из /etc/wireguard/publickey
  3. Порт должен совпадать с ListenPort на сервере
  4. IP-адрес клиента должен быть уникальным

Установка WireGuard клиента на разные ОС

Linux (Ubuntu/Debian):

sudo apt update
sudo apt install wireguard -y

Linux (CentOS/RHEL/Fedora):

# CentOS/RHEL 8+
sudo dnf install wireguard-tools

# Fedora
sudo dnf install wireguard-tools

# CentOS/RHEL 7
sudo yum install epel-release
sudo yum install wireguard-tools

Windows:

  1. Скачайте с официального сайта: https://www.wireguard.com/install/
  2. Установите как обычную программу
  3. Запустите WireGuard

macOS:

# Через Homebrew
brew install wireguard-tools

# Или скачайте с официального сайта

Android:

  1. Установите из Google Play: "WireGuard"
  2. Для "китайцев" без гугл сервисов, .apk файл можно скачать с официального сайта WireGuard

iOS:

  1. Установите из App Store: "WireGuard"
  2. Откройте приложение

После установки клиента:

Для Desktop (Windows/macOS/Linux):

  1. Сохраните файл client.conf в папку:

    • Windows: C:\Users\Username\Downloads\
    • macOS/Linux: ~/Downloads/
  2. Импортируйте конфиг в клиенте:

    • Откройте WireGuard
    • Нажмите "Import tunnel(s) from file"
    • Выберите client.conf

Для мобильных (Android/iOS):

  1. Отправьте файл client.conf на телефон
  2. В приложении WireGuard:
    • Нажмите "+"
    • Выберите "Create from file or archive"
    • Выберите файл client.conf

Для Linux (командная строка):

# Скопируйте конфиг в нужную папку
sudo cp client.conf /etc/wireguard/

# Подключитесь
sudo wg-quick up client

# Автозапуск
sudo systemctl enable wg-quick@client

Проверка подключения:

# После подключения проверьте
ping 10.0.0.1  # Должен пинговать сервер

# Проверьте свой IP
curl ifconfig.me  # Должен показывать IP сервера