Обзор

I2P с 2005 года использует устойчивый к цензуре UDP-транспортный протокол “SSU”. Мы почти не получали сообщений о блокировке SSU за 17 лет. Однако по современным стандартам безопасности, устойчивости к блокировке и производительности мы можем сделать лучше. Гораздо лучше.

Именно поэтому, совместно с проектом i2pd, мы создали и реализовали “SSU2”, современный протокол UDP, соответствующий высочайшим стандартам безопасности и устойчивости к блокировкам. Этот протокол заменит SSU.

Мы объединили шифрование, соответствующее отраслевым стандартам, с лучшими свойствами UDP-протоколов WireGuard и QUIC, а также с механизмами противодействия цензуре нашего TCP-протокола “NTCP2”. SSU2 может быть одним из самых безопасных транспортных протоколов, когда-либо разработанных.

Команды Java I2P и i2pd завершают работу над транспортом SSU2, и мы включим его для всех routers в следующем релизе. Это завершит наш десятилетний план по обновлению всей криптографии, использовавшейся в исходной реализации Java I2P, созданной в 2003 году. SSU2 заменит SSU — наше единственное оставшееся применение криптографии ElGamal.

  • Signature types and ECDSA signatures (0.9.8, 2013)
  • Ed25519 signatures and leasesets (0.9.15, 2014)
  • Ed25519 routers (0.9.22, 2015)
  • Destination encryption types and X25519 leasesets (0.9.46, 2020)
  • Router encryption types and X25519 routers (0.9.49, 2021)

После перехода на SSU2 мы переведём все наши протоколы с аутентификацией и шифрованием на стандартные рукопожатия Noise Protocol:

  • NTCP2 (0.9.36, 2018)
  • ECIES-X25519-Ratchet end-to-end protocol (0.9.46, 2020)
  • ECIES-X25519 tunnel build messages (1.5.0, 2021)
  • SSU2 (2.0.0, 2022)

Все протоколы Noise в I2P используют следующие стандартные криптографические алгоритмы:

Цели

  • Upgrade the asymmetric cryptography to the much faster X25519
  • Use standard symmetric authenticated encryption ChaCha20/Poly1305
  • Improve the obfuscation and blocking resistance features of SSU
  • Improve the resistance to spoofed addresses by adapting strategies from QUIC
  • Improved handshake CPU efficiency
  • Improved bandwidth efficiency via smaller handshakes and acknowledgements
  • Improve the security of the peer test and relay features of SSU
  • Improve the handling of peer IP and port changes by adapting the “connection migration” feature of QUIC
  • Move away from heuristic code for packet handling to documented, algorithmic processing
  • Support a gradual network transition from SSU to SSU2
  • Easy extensibility using the block concept from NTCP2

Проектирование

I2P использует несколько уровней шифрования для защиты трафика от злоумышленников. Нижним уровнем является уровень транспортного протокола, используемый для соединений «точка-точка» между двумя routers. В настоящее время у нас есть два транспортных протокола: NTCP2, современный TCP-протокол, представленный в 2018 году, и SSU, UDP-протокол, разработанный в 2005 году.

SSU2, как и предыдущие транспортные протоколы I2P, не является универсальным каналом для передачи данных. Его основная задача — безопасно доставлять низкоуровневые сообщения I2NP в I2P от одного router к следующему. Каждое из этих соединений типа «точка–точка» составляет один хоп в I2P tunnel. Протоколы I2P более высоких уровней работают поверх этих соединений типа «точка–точка», обеспечивая сквозную доставку garlic messages (так называемых «чесночных» сообщений) между назначениями I2P.

Проектирование UDP-транспорта сопряжено с уникальными и сложными задачами, отсутствующими в протоколах TCP. Протокол UDP должен обрабатывать проблемы безопасности, вызванные подменой адресов, и реализовывать собственное управление перегрузкой. Кроме того, все сообщения необходимо фрагментировать, чтобы они укладывались в максимальный размер пакета (MTU) на сетевом пути, и собирать их заново на стороне получателя.

Сначала мы в значительной степени опирались на наш предыдущий опыт с нашими протоколами NTCP2, SSU и потоковыми протоколами. Затем мы тщательно изучили и во многом заимствовали из двух недавно разработанных протоколов UDP:

Классификация протоколов и их блокирование враждебными on-path атакующими (находящимися на пути прохождения трафика), такими как государственные межсетевые экраны, не являются явной частью модели угроз для этих протоколов. Однако для I2P это важная часть модели угроз, поскольку наша миссия — предоставить анонимную и устойчивую к цензуре систему связи пользователям из групп риска по всему миру. Поэтому значительная часть нашей проектной работы заключалась в объединении уроков, извлечённых из NTCP2 и SSU, с функциями и механизмами безопасности, поддерживаемыми QUIC и WireGuard.

Производительность

Сеть I2P представляет собой сложную смесь разнообразных router (узлов сети I2P). Существуют две основные реализации, работающие по всему миру на оборудовании — от высокопроизводительных компьютеров в дата-центрах до устройств Raspberry Pi и телефонов Android. Router используют оба транспортных протокола: TCP и UDP. Хотя улучшения в SSU2 существенны, мы не ожидаем, что они будут заметны пользователю — ни локально, ни по сквозной скорости передачи данных.

Вот некоторые основные моменты предполагаемых улучшений для SSU2 по сравнению с SSU:

  • 40% reduction in total handshake packet size
  • 50% or more reduction in handshake CPU
  • 90% or more reduction in ACK overhead
  • 50% reduction in packet fragmentation
  • 10% reduction in data phase overhead

План перехода

I2P стремится поддерживать обратную совместимость, как для обеспечения стабильности сети, так и для того, чтобы старые routers продолжали оставаться полезными и безопасными. Однако существуют пределы, поскольку совместимость увеличивает сложность кода и требования к сопровождению.

Проекты Java I2P и i2pd включат SSU2 по умолчанию в своих следующих релизах (2.0.0 и 2.44.0) в конце ноября 2022 года. Однако у них разные планы по отключению SSU. I2pd отключит SSU немедленно, поскольку SSU2 является существенным улучшением по сравнению с их реализацией SSU. Java I2P планирует отключить SSU в середине 2023 года, чтобы поддержать постепенный переход и дать старым routers время обновиться.

Сводка

Основателям I2P пришлось принять несколько решений относительно криптографических алгоритмов и протоколов. Некоторые из этих решений оказались лучше других, но спустя двадцать лет большинство из них уже заметно устарело. Разумеется, мы знали, что это неизбежно, и в течение последнего десятилетия планировали и внедряли криптографические обновления.

SSU2 был последним и самым сложным протоколом для разработки на нашем долгом пути модернизации. UDP имеет крайне сложный набор допущений и модель угроз. Сначала мы спроектировали и внедрили три другие разновидности протоколов Noise и получили опыт и более глубокое понимание вопросов безопасности и проектирования протоколов.

Ожидается, что SSU2 будет включён в релизы i2pd и Java I2P, запланированные на конец ноября 2022 года. Если обновление пройдёт хорошо, никто вообще не заметит никаких изменений. Выигрыш в производительности, хотя и существенный, скорее всего не будет измерим для большинства пользователей.

Как обычно, мы рекомендуем обновиться до нового релиза, как только он станет доступен. Лучший способ поддерживать безопасность и помочь сети — использовать последний релиз.