NetDb

Материал из I2P-ilita вики
(перенаправлено с «Netdb»)
Перейти к навигацииПерейти к поиску
Zrada.png ЗРАДА!

Информация была грубо перекатана со свидомой википедии.
Требуется дополнить её фактами, разбавить картинками, переписать или хотя бы почистить от мусора.

netDb, или "Сетевая база данных" - специализированная распределенная база данных, содержащая всего лишь два типа данных: контактная информация роутера и контактная информация точек назначения (так называемые LeaseSets). Каждый кусочек данных подписан соответствующей стороной, и проверена любым, кто использует или хранит его. Кроме того, там же хранится информация о "живости", позволяющая удалять нерелевантные вхождения, заменять более новыми записями более старые, и защищающая данные от некоторых типов атак.

NetDb хранится распределенно с помощью простого механизма, называющегося "floodfill", когда часть от общего числа роутеров, называемая "floodfil-роутеры" поддерживает распределенную базу данных.

Оригинальная статья на официальном сайте (англ.)

Структура RouterInfo[править]

Когда один I2P роутер хочет соединиться с другим роутером, им необходимо "знать" кое-какие ключевые данные. Эти данные упакованы и подписаны в одной структуре данных, называемой "RouterInfo", которая распространяется с помощью SHA-256 от идентификатора роутера в качетсве ключа. Сама структура содержит следующие данные:

  • Идентификационные данные роутера (2048-битный ключ шифрования для алгоритма ElGamal, 1024-битный DSA ключ подписи, а также сертификат)
  • Контактные адреса, по которым до этого роутера можно достучаться (например TCP: example.org порт 4108)
  • Когда данная структура была опубликована
  • Набор произвольных текстовых опций
  • Подпись для данных, перечисленных выше, сгенерированная с помощью того самого DSA-ключа подписи, из идентификационных данных.

Следующие текстовые опции не строго обязательны, но очень желательно, чтобы они были:

  • caps (Флаги совместимости - раньше использовались для идентификации участия в процессе floodfill, а также средней пропускной способности и примерную "достижимость")
  • coreVersion (Версия библиотеки ядра, всегда такая же, как и версия самого роутера)
  • netId = 2 (Базовая совместимость на уровне сети. Роутер откажется обмениваться данными с пиром, который имеет другой netId)
  • router.version (Использовался для определения совместимости с новыми функциями и сообщениями)
  • stat_uptime = 90m (Всегда отсылается 90 минут, для совместимости со старой схемой, когда роутеры публиковали свое реальное время аптайма, и посылали запросы на туннели только тем пирам, у которых время аптайма более 60 минут)

Эти значения используются другими роутерами для принятия основных решений. Стоит ли нам соединяться с этим роутером? Должны мы пытаться построить туннель через этот роутер? Флаг пропускной способности, в частности, используется только для определения того, соответствует ли роутер минимальному порогу для пропускания туннелей. Если у роутера пропускная способность выше минимально допустимого порога, то "распространяемая" полоса не является доверенной где угодно в роутере, исключая цели отображения в пользовательском интерфейсе, для отладки, а также для анализа сети.

Дополнительные текстовые опции включают небольшой набор статистических данных о "здоровье" роутера, которые собираются такими сайтами, как stats.i2p для анализа производительности сети и отладки. Эта статистические данные необходимы, чтобы дать очень важную информацию разработчикам. Например, процент успешно построенных туннелей, которые отображают всякие побочные эффекты. Текущая статистика ограничена следующими данными:

  • Успешно построенные клиентские и зондирующие туннели, отклоненные и туннели с истекшим таймаутом.
  • Среднечасовое количество транзитных туннелей.

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

RouterInfo: время жизни[править]

Структуры RouterInfo не имеют установленного времени жизни. Каждый роутер свободен в выборе своей собственной локальной политики, которая будет обеспечивать компромисс между частотой поиска данных RouterInfo и использованием диска/памяти. В текущей реализации используются следующие основные политики:

  • Нет никакого "истечения срока годности" в течении первого часа работы, поскольку постоянно хранимые данные могут быть старыми.
  • Нет срока годности, если у роутера всего 25 или менее структур RouterInfo.
  • Когда число локальных RouterInfo растет, срок годности уменьшается, в попытке поддержать целесообразное число структур RouterInfo. Срок годности, с числом маршрутизаторов менее 120, составляет 72 часа, в то время как срок годности при 300 роутерах составляет уже 30 часов.
  • Структуры RouterInfo содержать также SSU интродьюсеров, "протухающих" примерно через час, также как и список интродьюсеров, который также протухает примерно в такое же время.
  • Роутеры Floodfill используют маленькое время годности (1 час) для всех локальных структур RouterInfo, так как валидные структуры будут очень часто публиковаться на них.

RouterInfo - постоянное хранилище[править]

Структуры RouterInfo периодически записываются на диск, соответственно они будут доступны после перезагрузки.

LeaseSet[править]

Следующая часть данных, распределенно хранимых в netDb называется "LeaseSet" (дословно на русский - "Договор аренды") - группа точек входа в тоннели (leases) для конкретных Destination клиента. Каждый из данных наборов содержит следующую информацию:

  • Туннельный маршрутизатор входа (по его идентификатору)
  • ID туннеля на этом роутере, для отправки сообщений (четырёхбайтовое число)
  • Когда данный тоннель "умрет" - то есть пройдёт его срок годности.

LeaseSet сам сохранен в netDb с ключом, полученным из SHA-256 хэша от destination. (Возможно фраза не совсем понятна - LeaseSet это по сути распределенное хранилище в формате key=value, где key - sha256 хэш от полного destination, которое в свою очередь является value). Дополнительно к данным Leases, LeaseSet включает в себя:

  • Свой собственный destination (2048-битный ключ шифрования по алгоритму ElGamal, 1024-битный ключ подписи DSA и сертификат).
  • Дополнительный публичный ключ для шифрования: используется для шифрования точка-точка в чесночных сообщениях.
  • Дополнительный публичный ключ для шифрования: предназначен для аннулирования (отзыва) данного LeaseSet, но на данный момент не используется.
  • Подпись всех данных, хранящихся в данном LeaseSet, для того, чтобы удостоверить destination, опубликованный в LeaseSet.

Внешние ссылки


Неопубликованные LeaseSets[править]

В LeaseSet не публикуются destination, используемые только для исходящих соединений. Они никогда не посылаются для публикации на floodfil-роутеры. Клиентские туннели, используемые для веб-браузеров и IRC клиентов также не публикуются. Сервера всё ещё могут посылать сообщения к этим неопубликованным Destinations, так как существуют "сообщения хранения" I2NP.

Отозванные LeaseSets[править]

LeaseSet может быть отозван с публикации новым LeaseSet'ом, с нулевыми Leases. Отзыв должен быть подписан дополнительным ключом подписи в LeaseSet, упомянутым выше. Отзывы не реализованы полностью, и неясно - понадобятся ли они на практике. Это просто планы по использованию данного ключа шифрования, и на данный момент он не используется.

Зашифрованные LeaseSets[править]

В зашифрованном LeaseSet все Leases зашифрованы (ваш К.О.) с помощью отдельного DSA-ключа. Leases могут быть расшифрованы, и Destination's могут быть получены (а также открыты) только тем, кто имеет ключ. Нет никакого "флага" или другой информации о том, что данный LeaseSet вообще зашифрован. Зашфифрованные LeaseSet'ы не особенно широко используются, и это тема для дальнейших исследований в будущем, когда пользовательский интерфейс и реализация зашифрованных LeaseSet'ов могли бы быть улучшены.

Срок годности LeaseSet[править]

Все Leases (то есть, туннели, по сути), годны в течении 10 минут. Следовательно, LeaseSet "протухает" через 10 минут, после самого раннего времени создания всех этих Leases.

LeaseSet: постоянное хранилище[править]

Нет никакого постоянного хранилища данных в LeaseSet, так как они протухают очень быстро.

Bootstrapping (Начальная загрузка)[править]

NetDb децентрализована, тем не менее вам необходима как минимум одна ссылка на пир, для начала интеграционного процесса в сеть. Это совершается с помощью процесса под названием "Reseeding" вашего роутера активным пиром. Собственно, это прием его файла routerInfo-$hash.dat и сохранение его в вашей локальной директории netDb/. Кто угодно может предоставить вам эти файлы, и даже вы можете предоставлять их другим, с помощью вашей собственной netDb директории. Для упрощения данного процесса добровольцы публикуют их netDb директории (или часть их) в обычном (не I2P) интернете, и некоторые из URL таких добровольцев просто захардкожены в I2P роутер. Когда роутер стартует в первый раз, он автоматически затягивает данные с этих URL, выбранных случайно из списка.

Floodfill[править]

Floodfill netDb - простой механизм распределенного хранения. Алгоритм сохранения прост: послать данные ближайшему пиру, который рекламирует себя как floodfill роутер. Затем подождать 10 секунд, выбрать другой floodfill роутер, и попросить его проверить, что отправка и распределение данных прошли корректно. Если проверяемый пир не отвечает, или не имеет нужных данных, отправитель повторяет процесс. Когда пир во floodfill netDb получает хранилище netDb от пира, который не существует в сетевой БД floodfill'ов, они посылают его в подмножество пиров floodfill netDb. Пиры выбираются, как один из ближайших (в соответствии с XOR-метриками) для конкретного ключа.

Определить, кто является частью floodfill netDb очень просто - он дает возможность любому роутеру публиковать свою routerInfo.

Floodfills не имеют центрального авторизующего узла, и это не форма "консенсуса", они только реализуют простой DHT-оверлей.

Как стать Floodfill роутером?[править]

В отличие от Tor, где "серверы директорий" захардкожены и доверены, и управляются известными участниками, участники I2P floodfill не являются доверенными и изменяются со временем.

Для улучшения устойчивости netDb и минимизировать воздействие трафика netDb на роутер, floodfill автоматически включается только на роутерах, которые сконфигурированы с высокими лимитами пропускной способности. Роутеры с высокой пропускной способностью (которые должны быть сконфигурированы вручную, так как настройки по-умолчанию намного меньше) предполагают соединения с маленькой задержкой и лучше всего, если они доступны 24/7. Текущий минимальный порог пропусной способности, чтобы стать floodfill-роутером - 128 килобайт в секунду.

В дополнение, роутер должен пройти несколько дополнительных тестов на "здоровье" (очередь исходящих сообщений, рабочие лаги, и так далее), прежде чем работа во floodfill будет автоматически включена.

При текущих правилах для автоматического включения, в среднем 6% от всех роутеров в сети являются floodfill роутерами.

Пока некоторые роутеры вручную сконфигурированы, чтобы быть floodfill-ами, другие, которые просто имеют широкую полосу пропускания, автоматически вызываются, чтобы быть floodfill, когда общее количество floodfill-роутеров падает ниже определенного порога. Это препятствует любым долговременным повреждениям сети, а также от потери большей части floodfill, например, если на всех них будет проводиться атака. В свою очередь, эти роутеры сами отключатся от floodfill сети, если вдруг таких роутеров станет слишком много.

Роли Floodfill роутера[править]

Floodfill роутеры выполняют, в общем-то, одну единственную функцию (кроме тех, какие есть у всех обычных роутеров): это прием netDb и ответы на запросы в неё. Так как они сами по себе имеют высокую полосу пропускания, то они вероятно будут также иметь много транзитных туннелей (то есть быть релеями для остальных), но это не связано напрямую с их работой по поддержке распределенной базы данных.

Метрики соседей[править]

NetDb использует простые, Kademlia-style XOR метрики для определения соседей. SHA256 хэш от ключа, который кто-то искал либо сохранял XOR-ится с хэшем роутера в запросе на определение близости. Этот алгоритм был модифицирован, для того чтобы увеличить стоимость атак "Предсказания". Вместо, собственно, SHA256-хэша от ключа, в нашем случае SHA256-хэш берется от ключа к которому присоединена дата в формате yyyyMMdd (SHA256(key + yyyyMMdd).

Механизм хранения, верификации и поиска[править]

На мой взгляд раздел переведен сумбурно и отвратительно, но только на такой вариант хватает моего знания английского. Если можете лучше - я только счастлив, смело исправляйте стилистические и смысловые ошибки.

RouterInfo хранилище для пиров[править]

I2NP DatabaseStoreMessages содержат локальную routerInfo которой обменивались с другими пирами, в части процесса инициализации транспортного соединения NTCP или SSU.

LeaseSet хранилище для пиров[править]

I2NP DatabaseStoreMessages содержащий локальный LeaseSet периодически обменивается с другими пирами, помещая его в в чесночное сообщение вместе с нормальным трафиком со стороны связанного Destination. Это позволяет инициализационным ответам и поздним ответам быть помещенными в соответствующий Lease, без необходимости поиска любого LeaseSet, или необходимости связывать destinatio'ы чтобы публиковать LeaseSet'ы для всех.

RouterInfo хранилище для Floodfills[править]

Роутер публикует свою собственную routerInfo структуру напрямую на floodfill роутер, а также посылает её в I2NP DatabaseStoreMessage с ненулевым "токеном ответа". Сообщение не является "чесночно-шифрованным" типа точка-точка, так как оно передаётся по прямому соединению, соответственно нет никаких промежуточных роутеров (и нет никакой необходимости скрывать эти данные). Floodfill роутер отвечает I2NP DeliveryStatusMessage (сообщением о статусе доставки), с идентификатором сообщения установленным в значении токена ответа.

LeaseSet хранилище для Floodfills[править]

Flooding[править]

поиск RouterInfo и LeaseSet[править]

Верификация хранилища RouterInfo[править]

Верификация хранилища LeaseSet[править]

Разведка (Exploration)[править]

Примечание по ответам на поисковые запросы[править]

MultiHoming[править]

Threat Analysis[править]

General Mitigation Through Growth[править]

General Mitigation Through Redundancy[править]

Forgeries[править]

Slow or Unresponsive[править]

Sybil Attack (Full Keyspace)[править]

Sybil Attack (Partial Keyspace)[править]

Bootstrap Attacks[править]

Query Capture[править]

DHT-Based Relay Selection[править]

Information Leaks[править]

History[править]

Future Work[править]

RouterInfo specification

RouterInfo Javadoc

Статьи по теме[править]

Ссылки[править]