devzone.org.ua/post/vstanovlennia-routera-i2p-z-pidkliuchenniam-cherez-yggdrasil.md
2025-11-01 14:28:20 +02:00

16 KiB
Raw Permalink Blame History

Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil

I2P - це альтернативна мережа, характерною рисою якої є анонімізація користувача. На відміну від Tor, має принципово іншу модель маршрутизації, де стек IP не використовується як такий, а дані відправника вільно циркулюють роєм через випадкові вузли ретрансляції, допоки не досягнуть точки призначення. Таким чином, відправник даних є не визначеним мережею.

Утім, для підключення до I2P глобально, часто використовується Інтернет. Особливістю цього гайду є спосіб підключення до мережі I2P без прямих звернень Інтернет, через додатковий шар Yggdrasil. Може бути корисним у випадках, якщо ваш провайдер блокує піринговий трафік.

  • В інших випадках, такий спосіб може бути менш "анонімним" через можливість генерації необмеженої кількості адрес Yggdrasil з підміною ними "незалежних" вузлів (Атака Сивілли) - таким чином, для себе важливо правильно обирати пріоритети налаштувань і розуміти мету, з якою використовується I2P. Адже якщо метою є саме анонімізація а не наприклад ретрансляція певного сервісу для користувачів з обмеженим доступом - то для таких цілей, на мою думку, краще використовувати звичайний Інтернет піринг або приватний ботнет.

Метою цього матеріалу не є детальний опис принципу роботи мережі I2P і анонімізація зокрема. Матеріал створено лише у якості нотатки, з досвіду публікації Веб-сайту для української спільноти адміністраторів альтернативних мереж на прохання деяких користувачів, для чого й був потрібен локальний роутер. Якщо вам не потрібно публікувати сайт чи анонімно користуватися мережею I2P, можна просто скористатися наявними вихідними SOCKS/HTTP проксі, в т.ч. для Yggdrasil.

Роутер

Існує декілька відомих мені реалізацій роутера I2P:

  • i2p.i2p (Java) - оригінальна реалізація
  • i2p-rs (Rust) - спроба реалізації роутера сучасною мовою, утім стан готовності цього проєкту мені не відомий
  • i2pd (C++) - на мою думку, найбільш повноцінна реалізація, що підтримує з коробки режим роботи Yggdrasil-only

i2pd

Для i2pd є готові збірки та репозиторії для різних дистрибутивів, але сам я завжди надаю перевагу збірці останніх версій програм з початкового коду. Нижче описаний саме такий спосіб, можливо з часом він може втратити свою актуальність через оновлення кодової реалізації. Детальна інструкція доступна в документації, а нижче - приклад встановлення для Debian / Linux.

Встановлення

git clone https://github.com/PurpleI2P/i2pd.git
cd i2pd/build
cmake .
make

Власне, для Debian, можна зібрати пакунок .deb (що може бути більш правильним з точки зору адміністрування) але я встановлював вручну, адже буде зкомпільовано лише один бінарний файл i2pd, який потрібно перемістити до системної теки:

sudo make install

Створення системного користувача

Роутер i2pd я запускатиму від окремого системного користувача зі стандартними привілеями:

useradd -m i2pd

Конфігурація i2pd

Тепер потрібно створити файл конфігурації, його я розмістив за адресою /etc/i2pd.conf, хоча ви можете додати його до теки користувача, при цьому змінивши шляхи у прикладах нижче:

nano /etc/i2pd.conf

Оригінальний файл конфігурації доступний в репозиторії, нижче я наведу тільки змінені його опції, але буде правильним звірити їх актуальність на момент встановлення:

# рівень деталізації журналів, я змінив щоб не засмічувати пам'ять
loglevel = error

# вимикаємо стандартні інтерфейси,
# так як в цьому прикладі підключення відбувається через Yggdrasil
ipv4 = false
ipv6 = false

# вимикаємо не задіяну в конфігурації Yggdrasil функціональність
[ntcp2]
enabled = false
[ssu2]
enabled = false

# доступ до веб-адмінки роутера
# цей пункт можна лишити стандартним,
# але в мене в address вказано статичну адресу (віддаленого сервера)
# IP не повинен бути 0.0.0.0, бо доступ буде відхилено через фільтр
[http]
address = 127.0.0.1
auth = true
user = user
pass = pass

# дані опції потрібні, якщо ви користуєтесь I2P, наприклад в браузері
# в мене роутер працює на сервері (для веб-сайту) тому ці сокети вимкнено
[socksproxy]
enabled = false
[httpproxy]
enabled = false

# в мережі I2P використовується окремий протокол комунікації,
# якщо ви не плануєте підключатись до роутера через клієнтський софт, вимикаємо
[sam]
enabled = false

# вмикаємо конфігурацію роутера для роботи в режимі Yggdrasil
[meshnets]
yggdrasil = true

# роутер в режимі yggdrasil слухатиме всі мережі IPv6 (::)
# оголосити сервіс можна й на конкретній адресі нижче
# перевірити результат можна з `netstat -tulpn | grep i2pd`
# yggaddress = xxx::xxx...

Так як я не змінював стандартні шляхи, через помилку запуску згодом, додатково руками створив теку для збереження даних профілю (у вас це може бути тека користувача або інша)

mkdir /var/lib/i2pd
chown i2pd:i2pd /var/lib/i2pd

Також, вручну скопіював сертифікати ініціальних вузлів до створеної теки /var/lib/i2pd, інакше в конфігі доведеться вимкнути опцію reseed.verify

Systemd

Тепер створімо сервіс systemd. В мене він відрізняється від стандартного:

#/etc/systemd/system/i2pd.service

[Unit]
Wants=network.target

# сервіс повинен запускатись після сервісу Yggdrasil
# у вас тут може бути інша конфігурація, залежна від конкретної мережі
# та способу її ініціації
After=yggdrasil.service

[Service]

# запуск від окремого користувача
User=i2pd
Group=i2pd

# роутер використовує дочірні процеси
Type=forking

ExecStart=/usr/local/bin/i2pd --conf=/etc/i2pd.conf --daemon --service

# лишив як в оригіналі, можливо це потрібно для реалізації i2pd
LimitNOFILE=8192

# фактично, шлях журналів буде таким, як вказано в /etc/i2pd.conf
# StandardOutput=file:///home/i2pd/debug.log
# StandardError=file:///home/i2pd/error.log

[Install]
WantedBy=multi-user.target
  • systemctl enable i2pd - автостарт
  • systemctl start i2pd - запуск (на цьому етапі, роутер Yggdrasil має бути активним)
  • systemctl status i2pd - статус

Ініціальний запуск роутера

При першому запуску, ініціалізація мережі в мене відбувалась не одразу: системний сервіс вилітав з помилками підключення до вузлів. Наскільки я розумію, це пов'язано з відсутністю або малою кількістю ресідів Yggdrasil в мережі I2P. Якщо у вас вже є аналогічний вузол, що працює на такому (локальному) конфігі, можна спробувати імпортувати профіль мережі з нього або підняти звідти ресід: це робиться утилітою pyseeder. Якщо ви знаєте адресу Yggdrasil вузла онлайн, то можете просто спробувати додати його в конфігурацію reseed.yggurls і перезапустити i2pd.

Якщо конекту досі немає, і ваш роутер по якимось причинам вже пускався в режимі Інтернет, варто (після зупинки сервіса i2pd) спробувати видалити теку:

rm -rf /var/lib/i2pd/netDb

або якщо тека нова і там немає налаштувань тунелів, то очистити її повністю:

rm -rf /var/lib/i2pd/*

Після змін вище, не забуваємо перезапустити роутер:

systemctl restart i2pd

Через деякий час, ініціалізація мережі таки відбулась, але що було причиною точно не знаю.

Перевірити статус роботи роутера можна перейшовши у браузері за адресою його адмінки. Цю адресу ми вказували в опції http.address

Публікація Веб-сайту в I2P

Власне, сайт (та будь який інший сервіс) публікується доволі просто: для цього використовуються так звані "тунелі" які проксуватимуть внутрішній трафік I2P на вказаний локальний сервіс, наприклад сервер Nginx.

Створімо новий файл /var/lib/i2pd/tunnels.conf, або відредагуємо існуючий, якщо його немає:

[nginx]
# протокол
type = http
# хост, який прослуховує веб-сервер або Nginx
host = 127.0.0.1
# порт, у моєму випадку SSL/443 не використовується
port = 80
# внутрішній порт вхідного трафіку з I2P
inport = 80
# ідентифікатор тунелю, цей файл буде створено автоматично
keys = nginx.dat

Адреси .i2p не є частиною ваших приватних ключів, як це реалізовано в Yggdrasil, натомість адреса I2P є ідентифікатором маршруту. На прикладі нашої конфігурації вище, вам потрібно зберегти резервну копію nginx.dat що відповідає за публічну адресу Веб-сайту.

Подивитись яка у вас адреса - можна у Веб-адмінці роутера, у вкладці I2P tunnels > Server Tunnels. Опціонально, можна зареєструвати короткий домен, але така система реєстрації не є централізованою і має ряд вимог (зокрема щодо термінів обслуговування), від того це тема для окремого матеріалу.

Nginx

Налаштування Nginx я не змінював, бо сайт спільноти слухає різні інтерфейси, в той час як опція host тунелю i2pd пересилає з'єднання на локальний IPv6 Yggdrasil. Утім, якщо планується публікація сайту виключно в мережі I2P з server_name = xxx.i2p тоді потрібно додатково змінити файл /etc/nginx.conf:

server_names_hash_bucket_size 128;

Додаткові заходи

Як сказано на початку матеріалу, його метою не є анонімізація. Роботу роутера я не перевіряв на предмет витоків з'єднань в Інтернет, публікація анонімного сайту (a.k.a. eepsite) - окрема тема. Якщо для вас це чутливе питання, зверніть увагу на попередні публікації, що можуть частково допомогти з ізоляцією потенційних витоків: