MeshChatX/vendor/rns_over_http/README-RU.md

6.6 KiB
Raw Permalink Blame History

RNS-over-HTTP

Интерфейс Reticulum, который туннелирует трафик через стандартные HTTP/S POST-запросы. Это позволяет Reticulum работать в сетях, где разрешён только веб-трафик, эффективно обходя файрволы, DPI и другие ограничения.

Границы пакетов на HTTP-теле используют то же упрощённое HDLC-фреймирование, что и PipeInterface Reticulum, поэтому несколько пакетов могут передаваться в одном теле запроса или ответа без слияния.

Не-GitHub-зеркало. Кроме того, файлы проекта доступны в сети Reticulum по адресу RNS-over-HTTP.

Обзор

RNS-over-HTTP создаёт двунаправленный транспортный уровень, используя простую клиент-серверную модель:

  • Сервер: Запускается на машине с публичным IP-адресом и прослушивает HTTP-запросы.
  • Клиент: Может находиться за файрволом или NAT, ему требуется только исходящий доступ в интернет.

Клиент опрашивает сервер с помощью HTTP POST-запросов, отправляя исходящие данные в теле запроса и получая входящие данные в теле ответа. Это делает трафик похожим на обычную веб-активность.

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

Интерфейс имитирует постоянное соединение, используя механизм, подобный long-polling:

  1. Клиент отправляет HTTP POST на сервер с ожидающими HDLC-фреймами в теле запроса.
  2. Сервер декодирует входящие пакеты для Reticulum и сразу возвращает исходящую очередь (тоже в HDLC) в теле ответа.
  3. Клиент принимает ответ, декодирует фреймы и передаёт пакеты в Reticulum.
  4. После настраиваемого интервала опроса клиент повторяет цикл.

Особенности

  • Обход файрволов и DPI: Туннелирует трафик через стандартные порты HTTP/S (80/443).
  • Двунаправленная связь: Полнодуплексная передача данных.
  • Совместимое с Pipe фреймирование: HDLC FLAG/ESC как у PipeInterface.
  • Простая настройка: Python, httpx, Hypercorn/aioquic для HTTP/23 и Reticulum (rns).
  • Надёжность: Повторное подключение с экспоненциальной задержкой.
  • Гибкость: Настраиваемые MTU и интервал опроса.
  • Совместимость с прокси: Caddy, Nginx и аналоги.
  • Повторное использование соединений: keep-alive / мультиплексирование.
  • HTTP/1.1, HTTP/2 и HTTP/3: http_version = 1|2|3 (по умолчанию 1).

Начало работы

Требования

  • Python 3.10 или новее
  • Poetry

Установка

  1. Установите зависимости через Poetry (из корня репозитория):

    poetry install
    
  2. Установите пользовательский интерфейс: скопируйте HTTPInterface.py в каталог интерфейсов Reticulum, например ~/.reticulum/interfaces/.

Тесты

poetry run pytest -m "not live"
poetry run pytest -m live

Конфигурация

Добавьте блок интерфейса в ~/.reticulum/config на сервере и на клиенте. Поле type должно совпадать с именем модуля (HTTPInterface).

Конфигурация сервера

[[HTTP Server Interface]]
    type = HTTPInterface
    enabled = true
    mode = server
    listen_host = 0.0.0.0
    listen_port = 8080
    mtu = 4096
    check_user_agent = true
    user_agent = RNS-HTTP-Tunnel/1.0

Конфигурация клиента

[[HTTP Client Interface]]
    type = HTTPInterface
    enabled = true
    mode = client
    server_url = http://your-server-ip-or-domain:8080/
    poll_interval = 0.1
    mtu = 4096
    user_agent = RNS-HTTP-Tunnel/1.0

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

Общие

  • mtu: максимальный размер пакета в байтах (по умолчанию 4096)
  • user_agent: строка User-Agent (по умолчанию RNS-HTTP-Tunnel/1.0)

Режим сервера

  • mode = server
  • listen_host (по умолчанию 0.0.0.0)
  • listen_port (по умолчанию 8080)
  • check_user_agent (по умолчанию true)
  • serve_html_page / html_file_path: необязательная HTML-страница на GET /

Режим клиента

  • mode = client
  • server_url (обязателен)
  • poll_interval (по умолчанию 0.1)
  • http_version = 1|2|3 (по умолчанию 1)
  • для 2 и 3: https://, на сервере tls_certfile / tls_keyfile
  • tls_verify / tls_ca_certs на клиенте
  • pool_connections / pool_maxsize / keepalive_timeout

Обратный прокси (пример Caddy)

example.yourdomain.com {
    reverse_proxy 127.0.0.1:8080
    header {
        -Server
        X-Content-Type-Options nosniff
    }
}

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

  • Используйте HTTPS там, где возможно.
  • По умолчанию сервер проверяет User-Agent. Задайте одинаковый user_agent на обеих сторонах или отключите проверку через check_user_agent = false.

Лицензия

Проект распространяется под лицензией MIT.