Эта страница была обновлена 2023-01 и содержит сведения для версии маршрутизатора 2.1.0.

Обзор

На этой странице рассказывается о подключении всего бинарного файла маршрутизатора I2P к вашему приложению. Не про написание приложения для работы с I2P (как в комплекте, так и извне). However, many of the guidelines may be useful even if not bundling a router.

Многие проекты объединяют или говорят об объединении I2P. Это здорово, если все сделано правильно. Если сделать неправильно, это может нанести реальный вред нашей сети. Маршрутизатор I2P сложен, и скрыть всю сложность от пользователей может быть непросто. На этой странице рассматриваются некоторые общие рекомендации.

Most of these guidelines apply equally to Java I2P or i2pd. However, some guidelines are specific to Java I2P and are noted below.

Общайтесь с нами

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

Выбирайте маршрутизатор с умом

Если ваше приложение на Java или Scala, то выбор прост - используйте Java-маршрутизатор. Если на C/C++, мы рекомендуем i2pd. Разработка i2pcpp прекращена. Для приложений на других языках лучше всего использовать SAM, BOB или SOCKS и подключать Java-маршрутизатор как отдельный процесс. Некоторые из следующих пунктов относятся только к Java-маршрутизатору.

Лицензирование

Убедитесь, что вы соответствуете лицензионным требованиям ПО, которое устанавливаете.

Configuration

Проверьте конфигурацию по умолчанию

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

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

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

Анализ участвующего трафика

Может возникнуть желание отключить участвующий трафик. Есть несколько способов сделать это (скрытый режим, установка максимального количества туннелей на 0, установка общей пропускной способности ниже 12 КБайт/с). Без участвующего трафика вам не нужно беспокоиться о плавном отключении, ваши пользователи не видят использование пропускной способности, не созданной ими, и т.д. Однако существует множество причин, по которой вам нужно разрешить туннели с участвующим трафиком.

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

Во-вторых, более 90% маршрутизаторов в текущей сети разрешают участвующий трафик. Настройка по умолчанию в Java-маршрутизаторе. Если ваше приложение не маршрутизируется для других и становится очень популярным, то это просто пиявка в сети, что нарушает баланс, который есть сейчас. Если оно становится действительно большим, тогда мы превращаемся в Tor и тратим время на то, чтобы упрашивать людей включить ретрансляцию.

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

Мы настоятельно не рекомендуем отключать участвующий трафик по умолчанию. Если вы сделаете это и ваше приложение станет очень популярным, это может привести к разрыву сети.

Продолжительность

You must save the router's data (netdb, configuration, etc.) between runs of the router. I2P does not work well if you must reseed each startup, and that's a huge load on our reseed servers, and not very good for anonymity either. Even if you bundle router infos, I2P needs saved profile data for best performance. Without persistence, your users will have a poor startup experience.

There are two possibilities if you cannot provide persistence. Either of these eliminates your project's load on our reseed servers and will significantly improve startup time.

1) Set up your own project reseed server(s) that serve much more than the usual number of router infos in the reseed, say, several hundred. Configure the router to use only your servers.

2) Bundle one to two thousand router infos in your installer.

Also, delay or stagger your tunnel startup, to give the router a chance to integrate before building a lot of tunnels.

Конфигурируемость

Дайте своим пользователям возможность изменить конфигурацию важных параметров. Мы понимаем, что вы, вероятно, захотите скрыть большую часть сложности I2P, но важно показать некоторые основные настройки. В дополнение к вышеуказанным настройкам по умолчанию, некоторые сетевые настройки, такие как UPnP, IP/port, могут быть полезны.

Анализ Floodfill

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

Начальная загрузка

Решите, будете вы передавать информацию о маршрутизаторе или использовать наши reseed-хосты. Список хостов Java reseed находится в исходном коде, так что если вы поддерживаете исходный код в актуальном состоянии, список хостов также будет обновляться. Помните о возможной блокировке со стороны враждебных правительств.

Use Shared Clients

Java I2P i2ptunnel supports shared clients, where clients may be configured to use a single pool. If you require multiple clients, and if consistent with your security goals, configure the clients to be shared.

Limit Tunnel Quantity

Specify tunnel quantity explicitly with the options inbound.quantity and outbound.quantity. The default in Java I2P is 2; the default in i2pd is higher. Specify in the SESSION CREATE line using SAM to get consistent settings with both routers. Two each in/out is sufficient for most low-to-medium bandwidth and low-to-medium fanout applications. Servers and high-fanout P2P applications may need more. See this forum post for guidance on calculating requirements for high-traffic servers and applications.

Specify SAM SIGNATURE_TYPE

SAM defaults to DSA_SHA1 for destinations, which is not what you want. Ed25519 (type 7) is the correct selection. Add SIGNATURE_TYPE=7 to the DEST GENERATE command, or to the SESSION CREATE command for DESTINATION=TRANSIENT.

Limit SAM Sessions

Most applications will only need one SAM session. SAM provides the ability to quickly overwhelm the local router, or even the broader network, if a large number of sessions are created. If multiple sub-services can use a single session, set them up with a PRIMARY session and SUBSESSIONS (not currently supported on i2pd). A reasonable limit to sessions is 3 or 4 total, or maybe up to 10 for rare situations. If you do have multiple sessions, be sure to specify a low tunnel quantity for each, see above.

In almost no situation should you require a unique session per-connection. Without careful design, this could quickly DDoS the network. Carefully consider if your security goals require unique sessions. Please consult with the Java I2P or i2pd developers before implementing per-connection sessions.

Уменьшить использование сетевого ресурса

Note that these options are not currently supported on i2pd. These options are supported via I2CP and SAM (except delay-open, which is via i2ptunnel only). See the I2CP documentation (and, for delay-open, the i2ptunnel configuration documentation) for details.

Рассмотрите возможность настройки туннелей приложений на delay-open, reduce-on-idle и/или close-on-idle. Это просто, если вы используете i2ptunnel, но вам придется реализовать некоторые из этих функций самостоятельно, если вы используете I2CP напрямую. Смотрите i2psnark для кода, который уменьшает количество туннелей и затем закрывает туннель, даже при наличии некоторой фоновой активности DHT.

Life Cycle

Обновляемость

Если это возможно, имейте функцию автоматического обновления или уведомления о выходе новой версии. Больше всего мы не хотим огромного количества маршрутизаторов, которые невозможно обновить. Мы выпускаем около 6-8 версий Java-маршрутизатора в год, и для состояния сети очень важно, чтобы пользователи не отставали. Обычно более 80% пользователей сети переходят на последнюю версию в течение 6 недель после релиза, и мы хотели бы, чтобы так было и впредь. Вам не нужно беспокоиться об отключении встроенной функции автоматического обновления маршрутизатора, поскольку этот код находится в консоли маршрутизатора, которую вы, предположительно, не подключаете.

Развертка

Планируйте постепенное развертывание. Не перегружайте сеть сразу. В настоящее время у нас примерно 25K уникальных пользователей в день и 40K уникальных пользователей в месяц. Мы, вероятно, сможем без особых проблем справиться с ростом в 2-3 раза в год. Если вы ожидаете более быстрого роста, чем это, ИЛИ распределение пропускной способности (или распределение времени работы, или любой другой существенной характеристики) вашей пользовательской базы значительно отличается от нашей текущей пользовательской базы, нам очень важно обсудить это. Чем масштабнее ваши планы роста, тем важнее все остальное в этом контрольном списке.

Проектирование и поощрение длительного времени работы

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

User Interface

Показать статус

Давайте пользователю понять, что туннели приложений готовы. Поощряйте терпение.

Успешное выключение

Если возможно, отложите отключение до истечения срока действия участвующих туннелей. Не позволяйте своим пользователям легко ломать туннели или, по крайней мере, просите их подтвердить это.

Обучение и пожертвования

Было бы хорошо, если бы вы дали своим пользователям ссылки, по которым можно узнать больше о I2P и сделать пожертвование.

Опция внешнего маршрутизатора

В зависимости от вашей пользовательской базы и приложения, может быть полезно предоставить опцию или отдельный пакет для использования внешнего маршрутизатора.

Other Topics

Использование других общих услуг

Если вы планируете использовать другие распространенные сервисы I2P (новостные ленты, подписки hosts.txt, трекеры, аутпрокси и т.д.), убедитесь, что вы их не перегружаете, и поговорите с людьми, которые ими управляют, чтобы убедиться, что все в порядке.

Проблемы со временем / NTP

Note: This section refers to Java I2P. i2pd does not include an SNTP client.

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

Выберите, что и как вы связываете

Note: This section refers to Java I2P only.

Как минимум, вам понадобятся i2p.jar, router.jar, streaming.jar и mstreaming.jar. Вы можете опустить два потоковых банка для приложений, использующих только дейтаграммы. Некоторым приложениям может понадобиться больше, например, i2ptunnel.jar или addressbook.jar. Не забудьте jbigi.jar или его подмножество для поддерживаемых вами платформ, чтобы сделать криптографию намного быстрее. Для сборки требуется Java 7 или выше. Если вы собираете пакеты Debian / Ubuntu, вам следует потребовать пакет I2P из нашего PPA вместо того, чтобы использовать его в комплекте. Вам почти наверняка не нужны, например, susimail, susidns, консоль маршрутизатора и i2psnark.

Следующие файлы должны быть включены в каталог установки I2P, указанный с помощью свойства "i2p.dir.base". Не забудьте сертификаты/каталог, который необходим для ресида, и blocklist.txt для проверки IP-адресов. Каталог geoip необязателен, но рекомендуется, чтобы маршрутизатор мог принимать решения на основе местоположения. Если вы включаете geoip, обязательно поместите файл GeoLite2-Country.mmdb в этот каталог (заархивируйте его из файла installer/resources/GeoLite2-Country.mmdb.gz). Файл hosts.txt может быть необходим, вы можете изменить его, чтобы включить любые хосты, которые использует ваше приложение. Вы можете добавить файл router.config в базовый каталог, чтобы отменить начальные настройки по умолчанию. Просмотрите и отредактируйте или удалите файлы clients.config и i2ptunnel.config.

Лицензионные требования могут потребовать включения файла LICENSES.txt и каталог лицензий.

  • Возможно, вы также захотите обьединить файл hosts.txt.
  • Be sure to specify a bootclasspath if you are compiling Java I2P for your release, rather than taking our binaries.

Android анализ

Note: This section refers to Java I2P only.

Наше приложение маршрутизатора Android может использоваться несколькими клиентами. Если оно не установлено, пользователю будет предложено запустить клиентское приложение.

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

Если вам требуется помощь, свяжитесь с нами.

Maven jars

Note: This section refers to Java I2P only.

We have a limited number of our jars on Maven Central. There are numerous trac tickets for us to address that will improve and expand the released jars on Maven Central.

Если вам требуется помощь, свяжитесь с нами.

Рассмотрение датаграммы (DHT)

Если ваше приложение использует датаграммы I2P, например, для DHT, есть множество дополнительных опций для снижения накладных расходов и повышения надежности. Может понадобиться некоторое время и экспериментирование, чтобы добиться хорошей работы. Помните о компромиссах между размером и надежностью. Обратитесь к нам, если нужна помощь. Можно - и рекомендуется - использовать датаграммы и потоки на одном и том же адресе назначения. Не создавайте для этого отдельные адреса назначения. Не пытайтесь хранить свои несвязанные данные в существующих сетевых DHT (iMule, bote, bittorrent и router). Создайте свой собственный. Если вы жестко кодируете seed-узлы, мы рекомендуем иметь несколько.

Outproxies

I2P outproxies to the clearnet are a limited resource. Use outproxies only for normal user-initiated web browsing or other limited traffic. For any other usage, consult with and get approval from the outproxy operator.

Комаркетинг

Давайте работать вместе. Не ждите, пока все будет сделано. Поделитесь своим Twitter и начните писать об этом, мы ответим вам взаимностью.

Вредоносное ПО

Не используйте I2P для нехороших целей. Это может нанести большой ущерб и нашей сети, и нашей репутации.

Присоединяйтесь к нам

Присоединяйтесь к сообществу. Запускайте I2P 24/7, 7 дней в неделю. Заведите сайт I2P о своем проекте. Общайтесь в IRC #i2p-dev. Пишите на форумах. Распространяйте информацию. Мы можем помочь вам найти пользователей, тестеров, переводчиков или даже кодеров.

Examples

Примеры приложений

Вы можете установить и поиграть с приложением I2P для Android и посмотреть его код, чтобы увидеть пример приложения, в котором используется маршрутизатор. Посмотрите, что мы показываем пользователю, а что скрываем. Посмотрите на машину состояний, которую мы используем для запуска и остановки маршрутизатора. Другие примеры: Vuze, приложение Nightweb для Android, iMule, TAILS, iCloak и Monero.

Пример кода

Note: This section refers to Java I2P only.

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

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

Этот код предназначен для случая, когда ваше приложение запускает маршрутизатор, как в нашем приложении для Android. Вы также можете заставить маршрутизатор запускать приложение через файлы clients.config и i2ptunnel.config, вместе с веб-приложениями Jetty, как это сделано в наших Java-пакетах. Как всегда, управление состоянием - самая сложная часть.

See also: the Router javadocs.