6.6 KiB
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:
- Клиент отправляет HTTP POST на сервер с ожидающими HDLC-фреймами в теле запроса.
- Сервер декодирует входящие пакеты для Reticulum и сразу возвращает исходящую очередь (тоже в HDLC) в теле ответа.
- Клиент принимает ответ, декодирует фреймы и передаёт пакеты в Reticulum.
- После настраиваемого интервала опроса клиент повторяет цикл.
Особенности
- Обход файрволов и DPI: Туннелирует трафик через стандартные порты HTTP/S (80/443).
- Двунаправленная связь: Полнодуплексная передача данных.
- Совместимое с Pipe фреймирование: HDLC FLAG/ESC как у
PipeInterface. - Простая настройка: Python,
httpx, Hypercorn/aioquic для HTTP/2–3 и Reticulum (rns). - Надёжность: Повторное подключение с экспоненциальной задержкой.
- Гибкость: Настраиваемые MTU и интервал опроса.
- Совместимость с прокси: Caddy, Nginx и аналоги.
- Повторное использование соединений: keep-alive / мультиплексирование.
- HTTP/1.1, HTTP/2 и HTTP/3:
http_version = 1|2|3(по умолчанию1).
Начало работы
Требования
- Python 3.10 или новее
- Poetry
Установка
-
Установите зависимости через Poetry (из корня репозитория):
poetry install -
Установите пользовательский интерфейс: скопируйте
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 = serverlisten_host(по умолчанию0.0.0.0)listen_port(по умолчанию8080)check_user_agent(по умолчаниюtrue)serve_html_page/html_file_path: необязательная HTML-страница на GET/
Режим клиента
mode = clientserver_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.