Как установить и настроить микросервис VPN-сервер на Raspberry Pi

Если вы читаете это, скорее всего, у вас уже есть Raspberry Pi, и вы хотите превратить его в компактный VPN-сервер. Идея простая: устройство работает 24/7, потребляет минимум энергии, и вы получаете собственный VPN без подписок и доверия третьим сторонам. Давайте разберёмся, как это сделать по шагам, без воды и лишней теории.

Микросервисная архитектура здесь означает, что VPN-сервер (например, WireGuard), панель управления и вспомогательные сервисы (DNS, мониторинг) будут работать в контейнерах Docker. Это даёт изоляцию, простое обновление и возможность управлять компонентами независимо.

Что вы получите в итоге

Личный VPN-сервер для:

  • безопасного подключения к домашней сети из любой точки мира;
  • шифрования трафика в публичных Wi-Fi сетях;
  • доступа к домашним ресурсам (NAS, камеры, серверы) без проброса портов на основном роутере.

Необходимое железо и софт

Для стабильной работы понадобится:

  • Raspberry Pi 4 (2 ГБ ОЗУ и выше) или Pi 5. На Pi 3 тоже заведётся, но будет медленнее, и могут быть проблемы с некоторыми образами.
  • microSD-карта от 16 ГБ, класс A2 (для более быстрой записи). SSD через USB — ещё лучше.
  • Блок питания 5В/3А с разъёмом USB-C (для Pi 4) или соответствующим для вашей модели.
  • Сетевой кабель Ethernet для подключения к роутеру. Wi-Fi тоже работает, но для сервера надёжнее проводное соединение.
  • ПО на ПК/ноутбуке: SSH-клиент (например, встроенный терминал, MobaXterm), текстовый редактор (VS Code с расширением SSH Remote, nano на самом устройстве).

Понадобится и базовый софт: актуальная ОС (например, Raspberry Pi OS Lite, без рабочего стола), Docker, Git.

Подготовка Raspberry Pi

  1. Скачайте и запишите образ Raspberry Pi OS Lite (64-bit) на карту памяти с помощью Raspberry Pi Imager.
  2. В Imager задайте hostname (например, vpn-gateway), логин и пароль, настройки вашей домашней Wi-Fi сети (даже если будете использовать кабель) и включите SSH.
  3. Вставьте карту в Pi, подключите питание и сетевой кабель, дождитесь загрузки.
  4. Узнайте IP-адрес устройства из панели администратора вашего роутера или через сканер сети, подключитесь по SSH: ssh username@ip-адрес.
  5. Обновите систему:

    sudo apt update && sudo apt upgrade -y
  6. Установите необходимые пакеты:

    sudo apt install git curl nano htop -y
  7. Настройте статический IP-адрес на роутере (резервирование по MAC-адресу) или на самом Pi через /etc/dhcpcd.conf. Это критично, чтобы VPN-клиенты всегда находили сервер.

Установка Docker и Docker Compose

Микросервисы будем запускать через Docker — это изолирует компоненты и управляет зависимостями. Установка стандартная:

  1. Установите Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
  1. Проверьте, что Docker работает: docker --version и docker run hello-world.
  2. Установите Docker Compose как отдельный бинарник (не путать с Compose-плагином). Инструкции могут меняться, поэтому актуальную команду установки лучше брать с официальной страницы Docker.

Выбор VPN-сервера: WireGuard vs OpenVPN vs Микросервисная связка

Тема статьи — микросервисный VPN, поэтому логично объединить VPN-сервер с панелью управления. WireGuard из коробки работает быстро, но не имеет веб-интерфейса. Можно добавить над ним микросервис-панель (например, wg-easy). Либо взять связку AdGuard Home (DNS-фильтрация) + WireGuard + простой мониторинг.

Для сравнения:

Критерий WireGuard + wg-easy OpenVPN + встроенные панели Свой стек (WireGuard + UI)
Администрирование Веб-панель wg-easy, простой и лёгкий, добавление клиентов в пару кликов Более громоздкие панели ( Pritunl, OPNsense), часто требуют больше ресурсов Гибко, но требует разработки или интеграции готовых open-source решений
Производительность Высокая Средняя Зависит от реализации
Безопасность Современные протоколы, простота аудита Доказана временем, но конфигурации могут быть сложнее Требует внимания к безопасности на всех уровнях
Контейнеризация Отлично, есть готовые образы wg-easy Возможна, но сложнее из-за сертификатов Любая
Сложность организации микросервисов Низкая (VPN + UI) Средняя Высокий порог входа

Для начинающего практика связка WireGuard + wg-easy в Docker — это оптимальный баланс «мощность/простота». Далее будем строить микросервисную архитектуру именно на её основе.

Шаг за шагом: развёртывание WireGuard через wg-easy в Docker

  1. Создайте структуру папок:
mkdir -p ~/wg-easy && cd ~/wg-easy
  1. Создайте файл docker-compose.yml:
version: '3.8'
services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    environment:
      - WG_HOST=your-domain.com
      - PASSWORD=your-panel-password
      - WG_PORT=51820
      - WG_DEFAULT_ADDRESS=10.8.0.x
      - WG_DEFAULT_DNS=1.1.1.1
      - WG_ALLOWED_IPS=0.0.0.0/0
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    volumes:
      - ./data:/etc/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped
  1. Замените your-domain.com на ваш реальный домен или внешний IP-адрес. PASSWORD — пароль для веб-панели управления. WG_PORT — порт, который будет слушать WireGuard (по умолчанию 51820/UDP).
  2. Запустите контейнер:

    docker compose up -d
  3. Откройте браузер и перейдите на http://ip-пи:51821. Вы увидите панель управления wg-easy. Войдите с заданным паролем.

Теперь у вас работает VPN-сервер с веб-интерфейсом. Но это ещё не полноценный микросервисный стек. Добавим пару полезных «роскошей».

Расширяем микросервисный стек: DNS-фильтрация и мониторинг

Чтобы сделать систему по-настоящему полезной, добавим:

  • AdGuard Home — локальный DNS-сервер с фильтрацией рекламы и трекеров. Все подключённые через VPN устройства смогут его использовать.
  • Простой мониторинг — например, Uptime Kuma для отслеживания доступности VPN-сервера и DNS.

Создайте файл docker-compose.yml в общей директории ~/microservice-vpn и объедините сервисы. Пример обновлённой конфигурации:

version: '3.8'
services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    environment:
      - WG_HOST=your-domain.com
      - PASSWORD=strongpassword
      - WG_PORT=51820
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    volumes:
      - ./wg-data:/etc/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped
    networks:
      - vpn-net

  adguard:
    image: adguard/adguardhome
    container_name: adguard
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "8080:8080"
    volumes:
      - ./adguard-data:/opt/adguardhome/conf
      - ./adguard-data/work:/opt/adguardhome/work
    restart: unless-stopped
    networks:
      - vpn-net

  uptime-kuma:
    image: louislam/uptime-kuma
    container_name: uptime-kuma
    ports:
      - "3001:3001"
    volumes:
      - ./kuma-data:/app/data
    restart: unless-stopped
    networks:
      - vpn-net

networks:
  vpn-net:
    driver: bridge
  • Не забудьте изменить стандартные пароли и порты, если это необходимо.
  • Запустите все сервисы командой docker compose up -d.

В настройках wg-easy в поле DNS-сервер для клиентов укажите внутренний IP контейнера adguard (можно использовать имя контейнера, Docker его разрешит внутри сети vpn-net). Тогда весь трафик будет фильтроваться.

Настройка роутера и внешнего доступа

Для доступа к VPN извне нужно:

  1. Пробросить порт 51820 (UDP) на роутере на статический IP вашего Raspberry Pi. Как это сделать — зависит от модели роутера (обычно раздел «Port Forwarding / Virtual Server»).
  2. Доменное имя (опционально, но удобно). Если у вас динамический IP от провайдера, настройте Dynamic DNS (DDNS). Многие роутеры поддерживают DDNS или можно использовать клиент на Pi. Например, сервисы вроде DuckDNS бесплатны.
  3. В настройках wg-easy поле WG_HOST должно быть равно вашему домену или внешнему IP.
  4. Убедитесь, что ваш провайдер не блокирует входящие UDP-порты. Проверить можно, временно запустив WireGuard с нестандартным портом.

Первый клиент и проверка подключения

  1. В веб-панели wg-easy (порт 51821) создайте нового клиента (кнопка «New Client»).
  2. Скачайте приложение WireGuard на смартфон или ПК, отсканируйте QR-код клиента или скачайте файл конфигурации.
  3. Активируйте VPN на клиенте.
  4. Проверьте, что интернет проходит через VPN: зайдите на сервис проверки IP (например, 2ip.ru или whatismyip.com). Должен отображаться ваш домашний IP.
  5. Если не работает — проверьте: правильность порта на роутере, файрвол на Pi (ufw или iptables), что WireGuard слушшает нужный порт (sudo ss -ulnp | grep 51820).

Частые ошибки и способы их исправления

  • Не устанавливается соединение с интернетом через VPN: проверьте, разрешена ли пересылка IP (net.ipv4.ip_forward=1). В Docker-контейнерах это задаётся через sysctls. Без этого пакеты не пойдут дальше Pi.
  • Нет доступа к панели управления: порт 51821 может быть занят или не проброшен правильно. Проверьте docker logs wg-easy на ошибки.
  • Контейнеры не запускаются после перезагрузки: убедитесь, что Docker запускается автоматически (sudo systemctl enable docker) и используется флаг restart: unless-stopped или restart: always.
  • Проблемы с DNS через VPN: если используете AdGuard Home, проверьте, что в настройках клиента в панели wg-easy указан актуальный DNS-сервер. В качестве теста используйте 1.1.1.1 или 8.8.8.8.
  • Bricked Raspberry Pi после экспериментов: делайте регулярные бэкапы SD-карты (например, утилитой rpi-clone или Win32DiskImager). Храните копию конфигураций и ключей.

Практические рекомендации

  • Используйте SSD вместо microSD — надёжность и скорность записи гораздо выше, особенно при активном логировании.
  • Резервное копирование: храните копию папки /etc/wireguard (данных контейнера) и клиентских конфигов. Это позволит быстро восстановить ключи при переустановке.
  • Логирование и ротация: в production-среде настройте сбор логов из контейнеров с помощью docker logs и ограничьте их размер. WireGuard сам по себе не ведёт подробных логов, но сообщения ядра стоит мониторить.
  • Безопасность панели: смените стандартный пароль веб-панели wg-easy, ограничьте доступ к порту 51821, например, только с определённых IP через файрвол или используйте reverse-proxy с базовой аутентификацией.
  • Сетевая изоляция: если не хотите, чтобы все клиенты имели доступ ко всем устройствам локальной сети, настройте WG_ALLOWED_IPS соответствующим образом или добавьте правила iptables.

Что выбрать в зависимости от ситуации

  • Нужен простой и быстрый VPN для себя: используйте только WireGuard (без Docker), настроенный напрямую на Pi. Один файл конфигурации и порт на роутере — минимум заморочек.
  • Требуется много клиентов и простое управление: связка WireGuard + wg-easy в Docker, как описано выше. Подходит для семьи, небольшой команды или круга друзей, которым нужен удалённый доступ.
  • Хотите добавить рекламо- и трекеро-блокировку, мониторинг доступности: разворачивайте полноценный микросервисный стек с AdGuard Home и Uptime Kuma. Это даёт ещё и обучение работе с Docker и контейннерами.
  • Задача — изучить микросервисы и DevOps-практики: экспериментируйте с разными компонентами. Можно написать собственный микросервис на Python/Go для управления клиентами через WireGuard API и докеризовать его вместе с остальными сервисами, добившись полной переиспользуемости каждого компонента.

Заключение

Вы установили и настроили микросервисный VPN-сервер на Raspberry Pi, используя Docker для изоляции и простоты управления. Теперь у вас:

  • Полностью рабочий WireGuard VPN с веб-интерфейсом wg-easy.
  • Возможность расширения за счёт других микросервисов (DNS-фильтрация, мониторинг).
  • Контроль над данными и доступом без сторонних сервисов.

Если хотите пойти дальше — добавьте обратный прокси с HTTPS-сертификатами (Caddy или Nginx Proxy Manager), настройте авторизацию по ключам вместо паролей, или свяжите VPN с вашей домашней системой умного дома, ограничив доступ к определённым ресурсам.

Главное — помнить, что вы полностью отвечаете за безопасность своей сети. Регулярно обновляйте образы Docker, следите за логами и вовремя обновляйте прошивку роутера.

Dfncfg.ru