Обзор
Эта страница посвящена встраиванию полного бинарного файла I2P router в ваше приложение. Она не касается написания приложения для работы с I2P (встроенным или внешним). Однако многие из рекомендаций могут быть полезны даже если вы не встраиваете router.
Множество проектов интегрируют или планируют интегрировать I2P. Это здорово, если делается правильно. Если делается неправильно, это может причинить реальный вред нашей сети. I2P router — сложная система, и может быть непросто скрыть всю эту сложность от ваших пользователей. На этой странице обсуждаются некоторые общие рекомендации.
Большинство этих рекомендаций одинаково применимы к Java I2P или i2pd. Однако некоторые рекомендации специфичны для Java I2P и отмечены ниже.
Свяжитесь с нами
Начните диалог. Мы здесь, чтобы помочь. Приложения, которые встраивают I2P, представляют для нас наиболее перспективные и увлекательные возможности для развития сети и улучшения анонимности для всех.
Выбирайте свой router с умом
Если ваше приложение написано на Java или Scala, выбор очевиден - используйте Java router. Если на C/C++, мы рекомендуем i2pd. Разработка i2pcpp остановлена. Для приложений на других языках лучше всего использовать SAM или BOB или SOCKS и включить Java router как отдельный процесс. Некоторые из следующих пунктов применимы только к Java router.
Лицензирование
Убедитесь, что вы соблюдаете лицензионные требования программного обеспечения, которое вы объединяете.
Конфигурация
Проверить конфигурацию по умолчанию
Правильная конфигурация по умолчанию имеет решающее значение. Большинство пользователей не будут изменять настройки по умолчанию. Настройки по умолчанию для вашего приложения могут отличаться от настроек по умолчанию для router, который вы включаете в комплект. При необходимости переопределите настройки router по умолчанию.
Некоторые важные настройки по умолчанию для проверки: максимальная пропускная способность, количество и длина tunnel, максимальное количество участвующих tunnel. Многое из этого зависит от ожидаемой пропускной способности и шаблонов использования вашего приложения.
Настройте достаточную пропускную способность и tunnels, чтобы позволить вашим пользователям вносить вклад в сеть. Рассмотрите возможность отключения внешнего I2CP, поскольку он вам, вероятно, не нужен и может конфликтовать с любым другим запущенным экземпляром I2P. Также посмотрите на конфигурации для отключения завершения JVM при выходе, например.
Соображения по участию в трафике
Может возникнуть соблазн отключить участие в транзитном трафике. Есть несколько способов сделать это (скрытый режим, установка максимального количества tunnel в 0, установка общей пропускной способности ниже 12 КБ/сек). Без участия в транзитном трафике вам не нужно беспокоиться о корректном завершении работы, ваши пользователи не видят использование пропускной способности, не созданное ими, и т.д. Однако есть множество причин, по которым вы должны разрешить участвующие tunnel.
Прежде всего, router работает не очень хорошо, если у него нет возможности “интегрироваться” с сетью, чему значительно способствует строительство tunnel’ей других пользователей через вас.
Во-вторых, более 90% router’ов в текущей сети разрешают транзитный трафик. Это настройка по умолчанию в Java router’е. Если ваше приложение не маршрутизирует трафик для других и становится очень популярным, то оно становится паразитом в сети и нарушает баланс, который у нас есть сейчас. Если оно станет действительно большим, то мы превратимся в Tor и будем тратить время на уговоры людей включить ретрансляцию.
В-третьих, проходящий трафик служит маскирующим трафиком, который помогает обеспечить анонимность ваших пользователей.
Мы настоятельно не рекомендуем отключать участвующий трафик по умолчанию. Если вы это сделаете и ваше приложение станет очень популярным, это может нарушить работу сети.
Постоянство
Вы должны сохранять данные router’а (netDb, конфигурацию и т.д.) между запусками router’а. I2P плохо работает, если приходится выполнять reseed при каждом запуске, это создает огромную нагрузку на наши reseed-серверы и также не очень хорошо для анонимности. Даже если вы включаете router info, I2P нуждается в сохраненных данных профиля для лучшей производительности. Без постоянства данных ваши пользователи будут иметь плохой опыт запуска.
Если вы не можете обеспечить постоянство данных, есть два варианта. Любой из них исключит нагрузку вашего проекта на наши reseed серверы и значительно улучшит время запуска.
Настройте собственные серверы reseed для проекта, которые обслуживают гораздо больше, чем обычное количество router infos в reseed, скажем, несколько сотен. Настройте router на использование только ваших серверов.
Включите в ваш установщик от одной до двух тысяч router infos.
Также задержите или растяните запуск ваших tunnel, чтобы дать router возможность интегрироваться перед построением большого количества tunnel.
Настраиваемость
Предоставьте вашим пользователям возможность изменять конфигурацию важных настроек. Мы понимаем, что вы, вероятно, захотите скрыть большую часть сложности I2P, но важно показать некоторые базовые настройки. В дополнение к настройкам по умолчанию выше, некоторые сетевые настройки, такие как UPnP, IP/порт, могут быть полезными.
Соображения по floodfill
При превышении определенной настройки пропускной способности и соответствии другим критериям работоспособности, ваш router станет floodfill, что может привести к значительному увеличению количества соединений и использования памяти (по крайней мере, с Java router). Подумайте, подходит ли вам это. Вы можете отключить floodfill, но тогда ваши самые быстрые пользователи не будут вносить тот вклад, который могли бы. Это также зависит от типичного времени работы вашего приложения.
Ресидинг
Решите, будете ли вы включать router infos в комплект поставки или использовать наши reseed хосты. Список reseed хостов Java находится в исходном коде, поэтому если вы поддерживаете исходный код в актуальном состоянии, список хостов также будет обновляться. Помните о возможной блокировке враждебными правительствами.
Использовать общие клиенты
Java I2P i2ptunnel поддерживает общие клиенты, где клиенты могут быть настроены на использование единого пула. Если вам требуется несколько клиентов, и если это соответствует вашим целям безопасности, настройте клиенты как общие.
Ограничить количество туннелей
Явно укажите количество туннелей с помощью опций inbound.quantity и outbound.quantity. По умолчанию в Java I2P это 2; по умолчанию в i2pd больше. Укажите в строке SESSION CREATE при использовании SAM для получения согласованных настроек с обоими router’ами. По два входящих/исходящих туннеля достаточно для большинства приложений с низкой-средней пропускной способностью и низким-средним разветвлением. Серверы и P2P приложения с высоким разветвлением могут нуждаться в большем количестве. См. этот пост на форуме
для руководства по расчёту требований для высоконагруженных серверов и приложений.
Укажите SAM SIGNATURE_TYPE
SAM по умолчанию использует DSA_SHA1 для пунктов назначения, что не является желательным. Ed25519 (тип 7) — правильный выбор. Добавьте SIGNATURE_TYPE=7 к команде DEST GENERATE или к команде SESSION CREATE для DESTINATION=TRANSIENT.
Ограничить SAM-сессии
Большинству приложений потребуется только одна SAM-сессия. SAM предоставляет возможность быстро перегрузить локальный router или даже более широкую сеть, если создается большое количество сессий. Если несколько подсервисов могут использовать одну сессию, настройте их с ОСНОВНОЙ сессией и ПОДСЕССИЯМИ (в настоящее время не поддерживается в i2pd). Разумное ограничение по сессиям составляет 3 или 4 в общей сложности, или может быть до 10 для редких ситуаций. Если у вас есть несколько сессий, обязательно указывайте низкое количество туннелей для каждой, см. выше.
Практически в любой ситуации вам не потребуется уникальная сессия для каждого соединения. Без тщательного проектирования это может быстро привести к DDoS-атаке на сеть. Внимательно рассмотрите, действительно ли ваши цели безопасности требуют уникальных сессий. Пожалуйста, проконсультируйтесь с разработчиками Java I2P или i2pd перед реализацией сессий для каждого соединения.
Снижение использования сетевых ресурсов
Обратите внимание, что эти опции в настоящее время не поддерживаются в i2pd. Эти опции поддерживаются через I2CP и SAM (за исключением delay-open, которая доступна только через i2ptunnel). Подробности см. в документации I2CP (а для delay-open — в документации по конфигурации i2ptunnel).
Рассмотрите возможность настройки tunnel’ов вашего приложения на delay-open, reduce-on-idle и/или close-on-idle. Это просто, если вы используете i2ptunnel, но вам придется реализовать часть функционала самостоятельно при прямом использовании I2CP. См. i2psnark для примера кода, который сокращает количество tunnel’ов, а затем закрывает tunnel, даже при наличии фоновой активности DHT.
Жизненный цикл
Возможность обновления
Включите функцию автоматического обновления, если это вообще возможно, или как минимум автоматическое уведомление о новой версии. Наш самый большой страх — это огромное количество router’ов, которые не могут быть обновлены. У нас около 6-8 релизов Java router’а в год, и критически важно для здоровья сети, чтобы пользователи не отставали от обновлений. Обычно более 80% сети переходит на последний релиз в течение 6 недель после выпуска, и мы хотели бы сохранить эту тенденцию. Вам не нужно беспокоиться об отключении встроенной функции автообновления router’а, поскольку этот код находится в консоли router’а, которую вы предположительно не включаете в комплект.
Развертывание
Имейте план постепенного развертывания. Не перегружайте сеть всю сразу. В настоящее время у нас примерно 25 тысяч уникальных пользователей в день и 40 тысяч уникальных пользователей в месяц. Мы, вероятно, можем справиться с ростом в 2-3 раза в год без особых проблем. Если вы ожидаете более быстрый рост, ИЛИ распределение пропускной способности (или распределение времени работы, или любая другая значительная характеристика) вашей пользовательской базы существенно отличается от нашей текущей пользовательской базы, нам действительно нужно обсудить это. Чем больше ваши планы роста, тем важнее все остальное в этом контрольном списке.
Проектирование и поощрение длительного времени работы
Сообщите своим пользователям, что I2P работает лучше всего, если он продолжает работать. Может пройти несколько минут после запуска, прежде чем он будет работать хорошо, и еще больше времени после первой установки. Если ваше среднее время работы составляет менее часа, I2P, вероятно, неправильное решение.
Пользовательский интерфейс
Показать статус
Предоставьте пользователю некоторое указание о том, что tunnel приложений готовы. Призывайте к терпению.
Корректное завершение работы
По возможности отложите завершение работы до истечения срока действия ваших участвующих tunnel’ов. Не позволяйте пользователям легко обрывать tunnel’ы или, по крайней мере, просите их подтвердить это действие.
Образование и пожертвования
Было бы хорошо, если бы вы предоставили своим пользователям ссылки для получения дополнительной информации об I2P и для пожертвований.
Опция внешнего router
В зависимости от вашей пользовательской базы и приложения, может быть полезно предоставить опцию или отдельный пакет для использования внешнего router.
Другие темы
Использование других общих сервисов
Если вы планируете использовать или связывать с другими распространенными I2P сервисами (новостные ленты, подписки hosts.txt, трекеры, outproxy и т.д.), убедитесь, что не перегружаете их, и поговорите с людьми, которые их управляют, чтобы убедиться, что это допустимо.
Проблемы времени / NTP
Примечание: Этот раздел относится к Java I2P. i2pd не включает SNTP-клиент.
I2P включает в себя SNTP-клиент. Для работы I2P требуется правильное время. Система компенсирует неточный системный clock, но это может замедлить запуск. Вы можете отключить SNTP-запросы I2P, но это не рекомендуется, если только ваше приложение не обеспечивает правильность системного времени.
Выберите что и как упаковать
Примечание: Этот раздел касается только Java I2P.
Как минимум вам понадобятся i2p.jar, router.jar, streaming.jar и mstreaming.jar. Вы можете исключить два streaming jar для приложения, работающего только с датаграммами. Некоторым приложениям может потребоваться больше, например i2ptunnel.jar или addressbook.jar. Не забудьте про jbigi.jar или его подмножество для платформ, которые вы поддерживаете, чтобы значительно ускорить криптографические операции. Для сборки требуется Java 7 или выше. Если вы собираете пакеты для Debian / Ubuntu, вам следует потребовать пакет I2P из нашего PPA вместо его включения в комплект. Почти наверняка вам не потребуются, например, susimail, susidns, консоль router и i2psnark.
Следующие файлы должны быть включены в каталог установки I2P, указанный свойством “i2p.dir.base”. Не забудьте каталог certificates/, который необходим для reseeding, и файл blocklist.txt для проверки IP-адресов. Каталог geoip является необязательным, но рекомендуется, чтобы router мог принимать решения на основе местоположения. Если включаете geoip, обязательно поместите файл GeoLite2-Country.mmdb в этот каталог (распакуйте его из installer/resources/GeoLite2-Country.mmdb.gz). Файл hosts.txt может быть необходим, вы можете изменить его, включив любые хосты, используемые вашим приложением. Вы можете добавить файл router.config в базовый каталог для переопределения начальных настроек по умолчанию. Просмотрите и отредактируйте или удалите файлы clients.config и i2ptunnel.config.
Требования лицензии могут требовать включения файла LICENSES.txt и директории licenses.
- Также вы можете захотеть включить файл hosts.txt.
- Обязательно укажите bootclasspath, если вы компилируете Java I2P для своего релиза, а не используете наши готовые бинарные файлы.
Особенности Android
Примечание: Данный раздел относится только к Java I2P.
Наше приложение Android router может использоваться несколькими клиентами. Если оно не установлено, пользователь получит соответствующее уведомление при запуске клиентского приложения.
Некоторые разработчики выразили обеспокоенность тем, что это плохой пользовательский опыт, и они хотят встроить router в свое приложение. У нас в планах есть библиотека сервиса Android router, которая могла бы упростить встраивание. Требуется дополнительная информация.
Если вам требуется помощь, пожалуйста, свяжитесь с нами.
Maven jar-файлы
Примечание: Данный раздел относится только к Java I2P.
У нас есть ограниченное количество наших jar-файлов в Maven Central . Существует множество тикетов в trac, которые нам необходимо рассмотреть для улучшения и расширения выпущенных jar-файлов в Maven Central.
Если вам требуется помощь, пожалуйста, свяжитесь с нами.
Соображения по датаграммам (DHT)
Если ваше приложение использует I2P датаграммы, например, для DHT, доступно множество продвинутых опций для уменьшения накладных расходов и повышения надежности. Это может потребовать времени и экспериментов для хорошей настройки. Учитывайте компромиссы между размером и надежностью. Обращайтесь к нам за помощью. Возможно - и рекомендуется - использовать Датаграммы и Потоковую передачу на одном и том же Destination. Не создавайте отдельные Destination для этого. Не пытайтесь хранить ваши несвязанные данные в существующих сетевых DHT (iMule, bote, bittorrent и router). Создайте свою собственную. Если вы жестко кодируете узлы инициализации, мы рекомендуем иметь несколько.
Исходящие прокси
Outproxy I2P в открытую сеть — это ограниченный ресурс. Используйте outproxy только для обычного просмотра веб-страниц, инициированного пользователем, или другого ограниченного трафика. При любом другом использовании проконсультируйтесь и получите одобрение от оператора outproxy.
Комаркетинг
Давайте работать вместе. Не ждите, пока всё будет готово. Дайте нам ваш Twitter-аккаунт и начинайте писать об этом в твиттере, мы ответим взаимностью.
Вредоносное ПО
Пожалуйста, не используйте I2P во зло. Это может причинить большой вред как нашей сети, так и нашей репутации.
Присоединяйтесь к нам
Это может быть очевидно, но присоединяйтесь к сообществу. Запускайте I2P 24/7. Создайте I2P-сайт о своём проекте. Общайтесь в IRC #i2p-dev. Пишите на форумах. Распространяйте информацию. Мы можем помочь найти вам пользователей, тестировщиков, переводчиков или даже программистов.
Примеры
Примеры приложений
Вы можете установить и поэкспериментировать с Android-приложением I2P, а также изучить его код в качестве примера приложения, которое включает в себя router. Посмотрите, что мы показываем пользователю, а что скрываем. Изучите конечный автомат, который мы используем для запуска и остановки router. Другие примеры: Vuze, Android-приложение Nightweb, iMule, TAILS, iCloak и Monero.
Пример кода
Примечание: Данный раздел относится только к Java I2P.
Ничто из вышеперечисленного на самом деле не объясняет, как написать код для встраивания Java router, поэтому ниже приведен краткий пример.
import java.util.Properties;
import net.i2p.router.Router;
Properties p = new Properties();
// add your configuration settings, directories, etc.
// where to find the I2P installation files
p.addProperty("i2p.dir.base", baseDir);
// where to find the I2P data files
p.addProperty("i2p.dir.config", configDir);
// bandwidth limits in K bytes per second
p.addProperty("i2np.inboundKBytesPerSecond", "50");
p.addProperty("i2np.outboundKBytesPerSecond", "50");
p.addProperty("router.sharePercentage", "80");
p.addProperty("foo", "bar");
Router r = new Router(p);
// don't call exit() when the router stops
r.setKillVMOnEnd(false);
r.runRouter();
...
r.shutdownGracefully();
// will shutdown in 11 minutes or less
Этот код предназначен для случая, когда ваше приложение запускает router, как в нашем Android-приложении. Вы также можете настроить router для запуска приложения через файлы clients.config и i2ptunnel.config вместе с веб-приложениями Jetty, как это делается в наших Java-пакетах. Как всегда, управление состоянием является самой сложной частью.
См. также: javadoc для Router .