VPNCloud: Строим свою приватную сеть в облаке

Опубликовано 25.06.2025

VPNCloud: Строим свою приватную сеть в облаке

В мире, где всё больше сервисов переезжает в облако, а удаленная работа становится нормой, остро встает вопрос о безопасном и приватном доступе к вашим ресурсам. Традиционные VPN-сервисы, хотя и решают часть проблем, часто централизованы и могут быть не самым гибким решением для построения собственной защищенной сети между несколькими серверами, устройствами или даже офисами.

Здесь на сцену выходит VPNCloud – легковесный, децентрализованный и гибкий инструмент для создания частных mesh-сетей (full-mesh VPN). Он позволяет объединить различные серверы, компьютеры, Raspberry Pi и другие устройства в единую, зашифрованную виртуальную сеть, которая может быть развернута где угодно – от вашего домашнего роутера до облачных серверов.

Что такое VPNCloud и зачем он нужен?

VPNCloud – это open-source проект, написанный на Go, который позволяет создавать виртуальные частные сети (VPN) в топологии “full mesh”. Это означает, что каждое устройство в вашей VPNCloud-сети может напрямую взаимодействовать с любым другим устройством в этой же сети, без необходимости прохождения через центральный сервер.

Зачем это нужно?

  1. Безопасный доступ к домашним/офисным ресурсам: Вы можете получить доступ к своим файловым серверам, IP-камерам или умному дому из любой точки мира, будто вы находитесь в локальной сети.
  2. Объединение облачных серверов: Если у вас есть серверы в разных облачных провайдерах (например, DigitalOcean, AWS, Google Cloud) или даже в разных регионах одного провайдера, VPNCloud позволит им общаться между собой по приватным IP-адресам, что повышает безопасность и упрощает взаимодействие.
  3. Изоляция сервисов: Вы можете выделить часть своей инфраструктуры в отдельную, приватную сеть, недоступную извне, и общаться с ней только через VPNCloud.
  4. Скрытие трафика: Весь трафик внутри VPNCloud зашифрован, что защищает его от прослушивания.
  5. Гибкость: Нет необходимости в выделенном IP-адресе или пробросе портов на маршрутизаторе для каждого узла. Узлы VPNCloud могут находиться за NAT.

Как работает VPNCloud?

В основе работы VPNCloud лежит протокол UDP. Каждый узел в сети VPNCloud имеет свой уникальный идентификатор и устанавливает зашифрованное соединение с другими узлами. Важно, что для начального соединения узлам необходимо знать “точку входа” (seed-узел), которая поможет им найти друг друга. После установления соединения трафик между узлами маршрутизируется напрямую, что обеспечивает низкие задержки.

VPNCloud создает виртуальный сетевой интерфейс (TAP-интерфейс) на каждом устройстве, через который и проходит зашифрованный трафик. Этому интерфейсу присваивается IP-адрес из вашей приватной подсети VPNCloud.

Установка VPNCloud

VPNCloud — это бинарный файл, который легко установить.

Linux (пример для Debian/Ubuntu):

  1. Скачать последнюю версию: VPNCloud обычно доступен в виде готовых бинарных файлов на странице GitHub-релизов проекта или через официальные репозитории. Например, для Debian/Ubuntu:

    echo "deb https://repo.ddswd.de/deb stable main" | sudo tee /etc/apt/sources.list.d/vpncloud.list
    wget https://repo.ddswd.de/deb/public.key -qO - | sudo apt-key add -
    sudo apt update
    sudo apt install vpncloud
    

    Для других систем или архитектур (ARM, macOS, Windows) скачайте соответствующий бинарный файл и поместите его в PATH (например, /usr/local/bin).

  2. Проверка установки:

    vpncloud --version
    

Примеры конфигурации

VPNCloud настраивается с помощью YAML-файла. Давайте рассмотрим несколько распространенных сценариев.

Общие принципы:

  • network: Уникальное имя вашей VPN-сети. Все узлы должны использовать одно и то же имя.
  • password: Пароль для вашей сети. Обязателен для шифрования.
  • ip: IP-адрес, который данный узел получит в вашей виртуальной сети VPNCloud. Должен быть уникальным для каждого узла.
  • peers: Список других узлов (их публичных IP-адресов/доменных имен и портов), к которым данный узел будет пытаться подключиться. Эти узлы называются “seed peers” или “узлы-источники”. Через них узлы узнают друг друга. Достаточно, чтобы каждый узел знал хотя бы один доступный seed-узел.
  • listen: Адрес и порт, на котором VPNCloud будет слушать входящие соединения. 0.0.0.0:порт означает слушать на всех доступных интерфейсах.
  • mode: Режим работы виртуального сетевого интерфейса.
    • switch (по умолчанию): Работает как Ethernet-коммутатор (Layer 2). Подходит для объединения целых подсетей или для DHCP внутри VPN. Создает TAP-интерфейс.
    • router: Работает как IP-маршрутизатор (Layer 3). Пересылает IP-пакеты. Создает TUN-интерфейс. Более легкий, чем switch, если не нужна L2-функциональность.
    • hub: Простой концентратор. Весь трафик рассылается на все узлы (менее эффективно).
  • crypto: Тип шифрования. По умолчанию aes256. Рекомендуется использовать.

Сценарий 1: Две машины в облаке (простейший случай)

Предположим, у нас есть два облачных сервера, Server A и Server B, и мы хотим объединить их в приватную сеть 10.10.10.0/24.

Server A (Public IP: 203.0.113.1):

Создайте файл config-a.yaml:

network: mycloudvpn
password: "MySecurePassword123" # Замените на свой сложный пароль
ip: 10.10.10.1/24              # IP-адрес для Server A в VPNCloud
listen: 0.0.0.0:1194           # Порт, на котором слушает VPNCloud (можно любой свободный)
peers:
  - 203.0.113.2:1194           # Указываем IP и порт Server B

Server B (Public IP: 203.0.113.2):

Создайте файл config-b.yaml:

network: mycloudvpn
password: "MySecurePassword123" # Тот же пароль, что и на Server A
ip: 10.10.10.2/24              # IP-адрес для Server B в VPNCloud
listen: 0.0.0.0:1194
peers:
  - 203.0.113.1:1194           # Указываем IP и порт Server A

Запуск на каждом сервере:

sudo vpncloud -c config-a.yaml # На Server A
sudo vpncloud -c config-b.yaml # На Server B

Проверка:

После запуска на обоих серверах должен появиться новый сетевой интерфейс (например, vpncloud0). Выполните ip a или ifconfig и убедитесь, что интерфейс создан и ему присвоен IP-адрес. Затем попробуйте пингануть другой узел по его VPNCloud IP:

ping 10.10.10.2 # С Server A
ping 10.10.10.1 # С Server B

Если пинги проходят, ваша приватная сеть установлена!


Сценарий 2: Три узла с NAT Traversal (например, дом, офис, облако)

Предположим, у вас есть:

  • Домашний ПК (за NAT): IP 192.168.1.100 (внутренний), внешний IP меняется.
  • Офисный сервер (за NAT): IP 192.168.2.10 (внутренний), внешний IP меняется.
  • Облачный VPS (с публичным IP): 203.0.113.10.

Для работы через NAT (преобразование сетевых адресов), когда узлы не имеют прямого публичного IP, VPNCloud использует технику “NAT hole punching”. Для этого нужен хотя бы один узел с публичным IP-адресом, который будет выступать в роли “seed” для других узлов.

Облачный VPS (seed-узел):

network: mysecuremesh
password: "AnotherVerySecurePassword456"
ip: 10.10.10.10/24
listen: 0.0.0.0:1194
# Этот узел не нуждается в peers, так как он "раздает" свои координаты

Домашний ПК (client-узел):

network: mysecuremesh
password: "AnotherVerySecurePassword456"
ip: 10.10.10.100/24
listen: 0.0.0.0:1194
peers:
  - 203.0.113.10:1194 # Указываем публичный IP облачного VPS

Офисный сервер (client-узел):

network: mysecuremesh
password: "AnotherVerySecurePassword456"
ip: 10.10.10.200/24
listen: 0.0.0.0:1194
peers:
  - 203.0.113.10:1194 # Указываем публичный IP облачного VPS

Порядок запуска:

Сначала запустите VPNCloud на Облачном VPS. Только после этого запускайте на Домашнем ПК и Офисном сервере. После того, как все узлы подключатся к облачному VPS, они смогут обнаружить друг друга и установить прямые соединения, даже если оба клиента находятся за NAT.

Проверка: С любого узла попробуйте пингануть другие узлы по их VPNCloud IP: ping 10.10.10.10 ping 10.10.10.100 ping 10.10.10.200


Сценарий 3: Маршрутизация трафика в реальную сеть (режим router)

Допустим, у нас есть облачный сервер (Server C) с публичным IP 203.0.113.30 и внутренней подсетью 192.168.50.0/24, и Домашний ПК (за NAT), и мы хотим, чтобы Домашний ПК мог получить доступ ко всей внутренней подсети 192.168.50.0/24 через VPNCloud.

Здесь Server C будет выступать в роли “роутера” для внутренней сети. Для этого используем mode: router и настраиваем маршруты.

Server C (Облачный VPS с внутренней сетью 192.168.50.0/24):

network: myroutedvpn
password: "RouterVPNPasswordXYZ"
ip: 10.10.10.30/24              # IP Server C в VPNCloud
listen: 0.0.0.0:1195
peers: [] # Не указывает пиров, если это основной seed-узел
mode: router
forward:
  - 192.168.50.0/24             # Пересылать трафик в эту подсеть

Важно для Server C:

  1. Убедитесь, что на Server C включена IP-пересылка (IP forwarding).

    sudo sysctl -w net.ipv4.ip_forward=1
    # Чтобы было постоянно после перезагрузки, добавьте в /etc/sysctl.conf:
    # net.ipv4.ip_forward = 1
    
  2. Настройте правила iptables (или firewalld/ufw), чтобы разрешить прохождение трафика из VPNCloud-интерфейса в вашу внутреннюю сеть и обратно, а также NAT (маскарадинг), если устройства во внутренней сети должны иметь доступ в интернет через Server C.

    Пример простейших правил iptables для Server C:

    # Разрешить форвардинг между vpncloud0 и eth0 (или вашим основным интерфейсом)
    sudo iptables -A FORWARD -i vpncloud0 -o eth0 -j ACCEPT
    sudo iptables -A FORWARD -i eth0 -o vpncloud0 -j ACCEPT
    
    # Включить маскарадинг для трафика, идущего из VPNCloud в интернет через eth0
    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    
    # Сохранить правила (зависит от вашей ОС)
    # Например, для Debian/Ubuntu: sudo apt install iptables-persistent
    # sudo netfilter-persistent save
    

Домашний ПК (клиент):

network: myroutedvpn
password: "RouterVPNPasswordXYZ"
ip: 10.10.10.100/24             # IP Домашнего ПК в VPNCloud
listen: 0.0.0.0:1195
peers:
  - 203.0.113.30:1195           # Публичный IP Server C
mode: router

Настройка маршрута на Домашнем ПК:

После запуска VPNCloud на Домашнем ПК вам нужно добавить маршрут, чтобы трафик для сети 192.168.50.0/24 шел через VPNCloud-интерфейс.

sudo ip r add 192.168.50.0/24 dev vpncloud0

Теперь Домашний ПК сможет обращаться к устройствам в сети 192.168.50.0/24 через VPNCloud-соединение.


Важные замечания и лучшие практики

  • Пароли: Всегда используйте надежные, уникальные пароли для вашей сети VPNCloud. Это ключ к безопасности!

  • Порты: Убедитесь, что порты, на которых слушает VPNCloud (listen), открыты в фаерволах всех участвующих узлов.

  • IP-адреса: Тщательно планируйте подсеть для вашей VPNCloud-сети, чтобы она не пересекалась с существующими локальными сетями.

  • DNS: В сложных сценариях вам может потребоваться настроить DNS-серверы для разрешения имен внутри VPNCloud-сети или использовать /etc/hosts на каждом узле.

  • Запуск как сервис: Для продакшн-систем рекомендуется запускать VPNCloud как системный сервис (systemd, upstart и т.д.), чтобы он автоматически стартовал при загрузке. Пример unit-файла systemd:

    Создайте /etc/systemd/system/[email protected]:

    [Unit]
    Description=VPNCloud instance %i
    After=network-online.target
    
    [Service]
    ExecStart=/usr/local/bin/vpncloud -c /etc/vpncloud/%i.yaml
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    

    Затем:

    sudo systemctl enable vpncloud@config-a # для файла config-a.yaml
    sudo systemctl start vpncloud@config-a
    sudo systemctl status vpncloud@config-a
    
  • Надежность seed-узлов: Для mesh-сети достаточно, чтобы каждый узел знал хотя бы один работающий peer. Если у вас нет постоянного публичного IP-адреса для seed-узла, рассмотрите использование DDNS или укажите несколько seed-узлов, чтобы повысить отказоустойчивость.

  • Производительность: На производительность VPNCloud может влиять нагрузка на центральный процессор (из-за шифрования) и пропускная способность сети. Для высоконагруженных сценариев может потребоваться более мощное оборудование.

VPNCloud — это мощный и гибкий инструмент для создания собственных приватных сетей. Немного усилий в настройке, и вы получите безопасный и децентрализованный доступ к вашей распределенной инфраструктуре!

Похожие посты

Свяжитесь со мной

Обсудим ваш проект и найдём подходящее решение