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.3.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.3-py3-none-any.whl (231.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: murnet-6.2.3.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.3.tar.gz
Algorithm Hash digest
SHA256 31f79536f5c1ec595facd2d7d2b4154f69f5a4343346921c60147bee3ccaad23
MD5 b82455a43d7b35ad757e8c9d4319149e
BLAKE2b-256 153cd6291ea8aa1d2fcbb819747690c0deb5e1de93b84203e2f165cb429ea460

See more details on using hashes here.

File details

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

File metadata

  • Download URL: murnet-6.2.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 b4bc11ad205ba367b2e53d04897167bfde792b33d7598cc249d663cd851eea71
MD5 a02794d0cba9a22f89de7767cf803e5c
BLAKE2b-256 3e2860a4d352dad72d3b53e6f96090e84340dfcfeb982d98dc7189b5d63939fd

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