Skip to main content

Decentralized P2P network with onion routing, DHT and VPN tunnel

Project description

MurNet logo

MurNet

Децентрализованная P2P-сеть с onion-маршрутизацией, DHT и VPN-туннелем

License: MIT Python 3.11+ PyPI Status: Experimental


MurNet — экспериментальная децентрализованная P2P-сеть с onion-маршрутизацией, DHT и VPN-туннелем.

Узлы связываются напрямую, без центральных серверов. Трафик проходит через многослойное шифрование (X25519 + AES-256-GCM). Архитектура построена по принципу security by design.

⚠️ Учебный прототип. Не прошёл криптографический аудит. Не использовать для трафика, требующего реальной анонимности.


Возможности

Компонент Описание
Onion routing 3-хоп circuit, X25519 ECDH + AES-256-GCM
Relay discovery Gossip-анонсы — relay-ноды находят друг друга автоматически
DHT Kademlia с HMAC-аутентификацией
VPN / SOCKS5 Туннель TCP-трафика через onion-цепочку
Identity Ed25519 ключи, Base58 адреса, NodeID на Blake2b
REST API FastAPI для управления узлом
TUI Chat Textual-интерфейс для anonymous-чата в терминале

Установка

pip install murnet                    # из PyPI (стабильная)
pip install -e .                      # из исходников (dev)
pip install -e ".[tui,dev]"           # с extras

Дополнительные extras:

Extra Назначение
tui Textual TUI для murnet-node chat-режима
browser PyQt6 для onion-браузера
build PyInstaller для сборки EXE
dev pytest, pytest-asyncio, pytest-cov

Python 3.11+ обязателен.


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

После установки доступны команды:

Команда Что делает
murnet CLI полного узла
murnet-node Relay-нода или chat-участник
murnet-vpn VPN/SOCKS5 клиент
murnet-desktop Desktop GUI

Onion-чат (5 терминалов, localhost)

# 3 relay-ноды, каждая анонсирует себя в gossip
murnet-node --bind 127.0.0.1:9001 --name Guard  --announce
murnet-node --bind 127.0.0.1:9002 --name Middle --announce
murnet-node --bind 127.0.0.1:9003 --name Exit   --announce

# Bob — строит circuit Exit → Middle → Alice
murnet-node --bind 127.0.0.1:9004 --name Bob \
    --peer Exit=127.0.0.1:9003 --peer Middle=127.0.0.1:9002 \
    --peer Alice=127.0.0.1:9000 --circuit Exit,Middle,Alice

# Alice — auto-discovery, знает только Guard
murnet-node --bind 127.0.0.1:9000 --name Alice \
    --peer Guard=127.0.0.1:9001 --circuit auto

VPN / SOCKS5

murnet-vpn --mode local
# SOCKS5 прокси на 127.0.0.1:1080
curl --socks5 127.0.0.1:1080 http://example.com

Полный узел

murnet --port 8888 --data-dir ./murnet-data

Программный API

from murnet import MurnetNode, Identity, MurnetConfig

# Идентификация узла (Ed25519)
identity = Identity.generate()
print(identity.node_id)        # Blake2b NodeID
print(identity.address)        # Base58 адрес

# Запуск узла
config = MurnetConfig(port=8888, data_dir="./data")
node = MurnetNode(identity, config)
await node.start()

Onion-цепочки:

from murnet.core.onion.circuit import CircuitManager
from murnet.core.onion.router import OnionRouter

router = OnionRouter(identity)
circuit = await router.build_circuit(["Guard", "Middle", "Exit"])
await router.send(circuit.id, b"hello onion")

Структура проекта

murnet/                      ← Python-пакет
├── __init__.py              реэкспорты публичного API
├── cli.py                   точка входа `murnet`
├── desktop_app.py           точка входа `murnet-desktop`
├── murnet_vpn.py            VPN runtime
├── network_viz.py           визуализатор сети
├── build_exe.py             PyInstaller сборка
├── core/
│   ├── identity/            Ed25519, X25519, NodeID, keystore
│   ├── net/                 UDP transport, Kademlia DHT, link-state routing
│   ├── onion/               onion routing: cell, circuit, router, transport
│   ├── node/                AsyncMurnetNode, pubsub
│   ├── data/                content-addressed storage, SQLite
│   ├── vpn/                 TunnelManager, SOCKS5 server
│   └── config.py
├── api/                     FastAPI server, JWT auth, Pydantic-модели
├── demos/                   onion_node.py, onion_chat.py, vpn_client.py
├── mobile/                  battery, network, sync — оптимизации для мобильных
└── vds/                     Docker/systemd генераторы для VDS-деплоя

docs/                        Документация
tests/                       pytest: unit/, integration/, security/, performance/
scripts/                     CLI-скрипты (генерация конфига, миграция, статус)
configs/                     Шаблоны конфигов VPN

Тесты

pip install -e ".[dev]"

pytest tests/unit/ -q                       # 460+ unit-тестов
pytest tests/integration/ -v --timeout=60   # e2e onion circuit
pytest tests/security/ -v                   # security-проверки
pytest --cov=murnet --cov-report=term-missing

Архитектура (коротко)

Alice  →  Guard  →  Middle  →  Bob
         видит        видит        видит
         Alice        Guard        Middle
         Guard        Middle       (расшифрованные данные)

Каждый хоп получает независимый сессионный ключ через X25519 ECDH + HKDF-SHA256. Компрометация одного хопа не раскрывает остальные.

Подробности: docs/ONION.md, docs/ARCHITECTURE.md, docs/PROTOCOL.md.


NAT и где живут узлы

Сценарий Что нужно
VDS с публичным IP Открыть TCP-порт через firewall — узел работает как relay
Домашний компьютер за роутером Сейчас — только client-режим (инициирует, не принимает). UPnP/STUN — в roadmap
CGNAT / симметричный NAT Только client. Hole-punching через rendezvous-relay — в roadmap

Обратные ответы идут по тому же TCP-соединению, что инициировал клиент, — relay никогда не открывает обратное соединение, поэтому клиент за NAT может пользоваться сетью, но не быть relay'ем. Подробнее: docs/ONION.md.


VDS деплой relay-нод

# Деплой Guard/Middle/Exit через SCP + systemd
./scripts/vds.sh deploy

# Статус (curl на API каждой ноды)
./scripts/vds.sh status

# Логи
./scripts/vds.sh logs Guard

Подробности: docs/VDS.md.


Документация

Файл Содержание
docs/ARCHITECTURE.md Архитектура узла, слои, потоки данных
docs/ONION.md Onion routing: протокол, циклы CREATE/EXTEND, NAT, gossip
docs/PROTOCOL.md UDP wire-протокол, форматы сообщений
docs/API.md REST API, JWT-аутентификация, эндпоинты
docs/VDS.md Деплой на VDS, systemd, Docker, мониторинг
docs/DEVELOPMENT.md Сборка, тесты, contributing
docs/MOBILE.md Мобильные оптимизации (battery, network, sync)

Безопасность

Это учебный проект:

  • Криптографический аудит не проводился
  • Анонимность гарантирована только при наличии многих независимых relay-нод
  • В текущей конфигурации (3 узла на одном VDS) — анонимности фактически нет, маршрутизация декоративная
  • TLS-обёртка отключена из-за DPI — узлы используют голый X25519+PSK

Не использовать для угроз жизни, медицинских данных, юридически чувствительной переписки. Для этого есть Tor, I2P, Briar.


Лицензия

MIT — см. LICENSE.

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

murnet-6.2.2.tar.gz (203.0 kB view details)

Uploaded Source

Built Distribution

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

murnet-6.2.2-py3-none-any.whl (231.9 kB view details)

Uploaded Python 3

File details

Details for the file murnet-6.2.2.tar.gz.

File metadata

  • Download URL: murnet-6.2.2.tar.gz
  • Upload date:
  • Size: 203.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for murnet-6.2.2.tar.gz
Algorithm Hash digest
SHA256 3e54aff9c58ed19e2df7158db0a65146d18b4069d1f95bd8db833d15a53f1c1b
MD5 e710f37ae1e8a56a8ff4f359c0a07c20
BLAKE2b-256 561360672bc3590fb124849a66aa23655eaa054e27223de985ac334df8ff0d46

See more details on using hashes here.

File details

Details for the file murnet-6.2.2-py3-none-any.whl.

File metadata

  • Download URL: murnet-6.2.2-py3-none-any.whl
  • Upload date:
  • Size: 231.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for murnet-6.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5638c8c751fcd2c9e9845a856a5375dabec3b1f79b413a830651de7106ecc83c
MD5 63e1e7c0d852eefb34acfecca1ebe16c
BLAKE2b-256 322965bbcbf08c035527e24df4889c023d2a9d22778b2b91e7cda264ad9eb105

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