iroh
- title
- iroh
- type
- toolbox
- summary
- Библиотека на Rust для QUIC-соединений по открытому ключу с пробитием NAT и fallback'ом на relay
- tags
- networking, p2p, quic, rust
- language
- Rust
- license
- Apache-2.0 / MIT
- created
- 2026-07-18
- updated
- 2026-07-18
- lang
- ru
- translation_of
- iroh
- source_updated
- 2026-07-18
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
iroh - сетевая библиотека, позволяющая двум машинам открывать прямое аутентифицированное соединение друг с другом по открытому ключу вместо IP-адреса. Слоган проекта - "IP addresses break, dial keys instead" ("IP-адреса ломаются, подключайтесь по ключам"). Вы передаёте ключ другого узла, библиотека сама находит путь к нему - пробивает NAT, а если не получается, откатывается на relay-сервер - и отдаёт зашифрованное QUIC-соединение. Адресация не привязана к местоположению: узел сохраняет свою идентичность при смене IP, а на пути передачи данных нет центрального сервера. Библиотеку разрабатывает n0, она работает в продакшене на сотнях тысяч устройств.
Как это устроено
Каждый узел представляет собой endpoint, идентифицируемый открытым ключом Ed25519. Для подключения iroh сначала пробует прямые маршруты (используя discovery для поиска адресов-кандидатов), пытается пробить NAT (hole-punching) и переключается на relay-сервер, если прямой путь установить не удалось. При этом relay лишь пересылает зашифрованные пакеты и не видит открытый текст. Соединения работают поверх QUIC, поэтому они зашифрованы end-to-end на транспортном уровне и мультиплексированы: одно соединение несёт множество независимых двунаправленных потоков. Выбор протокола опирается на механизм согласования ALPN в QUIC, так что один endpoint может поддерживать несколько протоколов и диспетчеризировать их по ALPN.
Архитектура разделена на чистый транспортный уровень и опциональный набор готовых протоколов поверх него. Можно собирать систему из существующих протоколов (передача blob'ов, документы, gossip) либо использовать iroh как чистую абстракцию над базовыми каналами связи ("dumb pipes") и строить собственный протокол напрямую поверх QUIC-потоков. Помимо Rust, доступны SDK для других языков, включая Swift SDK для мобильных платформ.
Где это применяется
mesh-llm - наглядный рабочий пример. Каждый узел в этой системе (раздаёт ли он модели или только отправляет запросы) запускает endpoint iroh как свою идентичность и единственную сетевую поверхность. "Направить инференс пиру" и "передать активации следующему этапу пайплайна" становятся тем же примитивом, что и "обратиться к localhost", только с другим endpoint ID, а сама mesh-сеть запускает собственный уровень gossip и допуска поверх транспорта iroh. Паттерн универсален: iroh даёт аутентифицированный QUIC между любыми двумя машинами с пробитием NAT, а протокол приложения строится поверх.
Модель с адресацией по ключам и независимостью от локации пересекается с yggdrasil-network, выводящей IPv6-адрес из открытого ключа узла. Разница - в уровне и назначении: Yggdrasil представляет собой полноценную оверлейную маршрутизируемую сеть, предоставляющую обычный IP-интерфейс для всего, что работает поверх неё, тогда как iroh - это библиотека, которую вызывают для открытия конкретных соединений между конкретными пирами, скрывая механику relay и hole-punching за вызовом dial. Идентификаторы endpoint'ов iroh - это также конкретное воплощение идеи stateful-agent-routing: маршрутизируемое имя, идентифицирующее процесс, а не сервер или IP.
Заметки
Fallback на relay означает, что iroh деградирует до клиент-серверного пути при отсутствии прямой связности, но relay-узлы - это управляемая инфраструктура: при использовании публичного relay возникает зависимость от серверов n0, либо приходится запускать свои. Шифрование на транспортном уровне защищает данные в процессе передачи между endpoint'ами; оно ничего не говорит о том, что пир сделает с данными после их получения, поэтому таким приложениям, как Mesh LLM, для чувствительных задач всё ещё требуются mesh-сети из доверенных пиров.
Репозиторий: github.com/n0-computer/iroh - ~11.7k звёзд, двойная лицензия Apache-2.0 / MIT.