Skip to main content

Autonomous P2P Mesh VPN Library - create peer-to-peer VPN networks like Radmin VPN

Project description

MeshVPN — Autonomous P2P Mesh VPN Library

Полностью автономная Python библиотека для создания peer-to-peer mesh VPN сетей. Работает по принципу Radmin VPN — без необходимости установки стороннего ПО.

Архитектура (как Radmin VPN)

┌─────────────────────────────────────────────────────────┐
│                  Ваше приложение                        │
│              (MeshVPN Client API)                       │
├──────────────────┬──────────────────────────────────────┤
│  Криптография    │  Hole Punching    │  Virtual TAP     │
│  NaCl/SecretBox  │  UDP NAT traversal│  User-space/TUN  │
├──────────────────┴───────────────────┴──────────────────┤
│                 Rendezvous Server                       │
│         (Peer Discovery & Coordination)                 │
└─────────────────────────────────────────────────────────┘
         │                    │                    │
    Peer 1 ◄────── P2P UDP ──►│◄──── P2P UDP ─────► Peer 2
         │                    │                    │
         └──── TCP Relay fallback (если P2P не работает)

Быстрый старт

1. Запуск rendezvous сервера

from meshvpn import MeshVPNServer, register_server_name

server = MeshVPNServer(port=9877)
server.start()

# Даём серверу буквенное имя
address = register_server_name("myoffice", port=9877)
print(f"Сервер доступен по адресу: {address}")
# Вывод: myoffice.meshvpn:9877

Или через CLI:

python examples/start_server.py

2. Создание сети

from meshvpn import create_network, get_nodes, get_my_ip, disconnect

# Создаём сеть
network = create_network("MyOfficeLAN", password="secret123")

print(f"Сеть: {network.name}")
print(f"ID: {network.network_id}")  # <- Отправьте это другим!
print(f"Мой IP: {network.virtual_ip}")

input("Нажмите Enter для выхода...")
disconnect()

Или через CLI:

python examples/example_create.py

3. Подключение к сети

from meshvpn import join_network, get_nodes, disconnect

# Подключаемся по ID
network = join_network(
    network_id="abc123def456",  # ID от создателя
    password="secret123"
)

print(f"Подключён! Мой IP: {network.virtual_ip}")

# Получаем список узлов
nodes = get_nodes()
for node in nodes:
    if node.is_online:
        print(f"  {node.name}: {node.ip_address}")

input("Нажмите Enter для выхода...")
disconnect()

Или через CLI:

python examples/example_join.py abc123def456

Буквенные имена серверов

Зачем?

Вместо запоминания IP-адресов (192.168.1.100, 93.184.216.34) используйте читаемые имена:

"myoffice.meshvpn"
"home-vpn"
"server-alpha"

Регистрация сервера

from meshvpn import register_server_name, MeshVPNServer

# На сервере
server = MeshVPNServer(port=9877)
server.start()

# Регистрируем буквенное имя
address = register_server_name("myoffice", port=9877)
print(address)  # myoffice.meshvpn

Подключение по имени

from meshvpn import create_network, join_network

# Создатель — по буквенному имени
network = create_network(
    "Office LAN",
    password="secret",
    server_host="myoffice.meshvpn"  # вместо IP
)

# Другой пользователь — подключается по тому же имени
network = join_network(
    network_id="abc123def456",
    password="secret",
    server_host="myoffice"  # .meshvpn можно опустить
)

Резолвинг имени

from meshvpn import resolve_server_name, list_known_servers

# Резолвим имя в IP
result = resolve_server_name("myoffice")
if result:
    host, port = result
    print(f"myoffice.meshvpn -> {host}:{port}")
    # 192.168.1.100:9877

# Список всех известных серверов
servers = list_known_servers()
for s in servers:
    print(f"{s['name']}.meshvpn -> {s['host']}:{s['port']}")

Как это работает

  1. register_server_name() сохраняет {name: {host, port}} в файл ~/.meshvpn_registry.json
  2. create_network() / join_network() сначала ищут имя в реестре, потом пробуют DNS
  3. Поддерживаются три формата:
    • "myoffice" — поиск в локальном реестре
    • "myoffice.meshvpn" — поиск в реестре (суффикс отбрасывается)
    • "mesh.example.com" — DNS резолвинг

Полный API

Функциональный API (простой)

from meshvpn import (
    create_network,          # Создать сеть
    join_network,            # Подключиться к сети
    disconnect,              # Отключиться
    get_my_ip,               # Получить VPN IP
    get_nodes,               # Список узлов
    resolve_host,            # Резолвить hostname -> IP
    register_server_name,    # Зарегистрировать имя сервера
    resolve_server_name,     # Резолвить имя сервера
    list_known_servers,      # Список известных серверов
)

# Регистрация сервера с именем
register_server_name("myoffice", port=9877)

# Создание сети
network = create_network("Name", "password", server_host="myoffice.meshvpn")

# Подключение по буквенному имени
network = join_network("network_id", "password", server_host="myoffice")

# Информация
print(get_my_ip())
print(get_nodes())

# Выход
disconnect()

Объектно-ориентированный API (продвинутый)

from meshvpn.client import MeshVPNClient
from meshvpn.server import MeshVPNServer, ServerNameRegistry

# Rendezvous сервер
server = MeshVPNServer(port=9877)
server.start()

# Клиент — поддерживает IP, hostname, и буквенные имена
client = MeshVPNClient(
    server_host="myoffice.meshvpn",  # или "192.168.1.100", или "localhost"
    server_port=9877,
    name="MyNode",
)

# Создание сети
network = client.create_network("Office", "secret")

# Или подключение
network = client.join_network("network_id", "secret")

# Отправка данных узлу
client.send_to_node("10.192.1.2", b"Hello!")

# Callback'и
def on_connected(node_info):
    print(f"Узел подключился: {node_info.name}")

def on_data(src_ip, data):
    print(f"[{src_ip}]: {data.decode()}")

client.set_node_connected_callback(on_connected)
client.set_data_received_callback(on_data)

# Выход
client.disconnect()

ServerNameRegistry API

from meshvpn.server import ServerNameRegistry

registry = ServerNameRegistry()

# Зарегистрировать сервер
address = registry.register_local("home-vpn", port=9877)
print(address)  # home-vpn.meshvpn

# Резолвить имя
result = registry.resolve("home-vpn")
if result:
    host, port = result
    print(f"Host: {host}, Port: {port}")

# Список всех серверов
for server in registry.list_servers():
    print(f"{server['name']}.meshvpn -> {server['host']}:{server['port']}")

Как это работает (пошагово)

Создание сети:

User 1 (Creator)                 Rendezvous Server
      │                                  │
      │──── CREATE_NETWORK ─────────────►│
      │    (name, password_hash)         │
      │                                  │
      │◄──── OK + assigned_ip ──────────│
      │    network_id=abc123             │
      │                                  │
      │  Сеть создана, ожидает пиров    │

Подключение к сети:

User 2 (Joiner)                Rendezvous Server          User 1 (Creator)
      │                                │                          │
      │──── JOIN_NETWORK ─────────────►│                          │
      │    network_id=abc123           │                          │
      │                                │                          │
      │◄─── OK + peers ───────────────│◄──── PEER_UPDATE ────────│
      │    peers=[User1]               │                          │
      │                                │                          │
      │──── HOLE PUNCH ──────────────────────────────────────────►│
      │◄─── HOLE PUNCH ──────────────────────────────────────────│
      │                                │                          │
      │──── HANDSHAKE ──────────────────────────────────────────►│
      │◄─── HANDSHAKE_REPLY ─────────────────────────────────────│
      │                                │                          │
      │◄────────── P2P CONNECTED ───────────────────────────────►│
      │           (encrypted)           │                          │

Примеры

Файл Описание
examples/start_server.py Запуск rendezvous сервера
examples/example_create.py Создание новой сети
examples/example_join.py Подключение к сети
examples/example_chat.py P2P чат между узлами
messenger_host.py Хост мессенджера
messenger_client.py Клиент мессенджера

Установка

pip install pynacl

Требования

  • Python 3.7+
  • PyNaCl (libsodium bindings)
  • Linux: tun module (sudo modprobe tun)
  • Windows: Wintun driver (опционально)

Лицензия

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

meshvpn-1.0.1.tar.gz (35.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

meshvpn-1.0.1-py3-none-any.whl (33.1 kB view details)

Uploaded Python 3

File details

Details for the file meshvpn-1.0.1.tar.gz.

File metadata

  • Download URL: meshvpn-1.0.1.tar.gz
  • Upload date:
  • Size: 35.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for meshvpn-1.0.1.tar.gz
Algorithm Hash digest
SHA256 dba590b53cc50fdcc1d9af9ef86ba8cd77e9f64ee03f9251794d592875f4627c
MD5 f320052a0167ef819a968b6b7b645416
BLAKE2b-256 c9b98ec1c6ab6d6f57238df7bf676426e103c9e0202f6eb1eaa1583671c555d5

See more details on using hashes here.

File details

Details for the file meshvpn-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: meshvpn-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 33.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for meshvpn-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a81f641e0089621e17a59d2f8e63d33e0080aa70b8fefd1173c415795238bb81
MD5 b0b95813c2688f84358017c9b8f76904
BLAKE2b-256 9ad17a1beab85967fd641106b23de915aa0e3776f770c35d53bb2827aa29688c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page