gemlog/public/uk/setup-i2pd-with-i2p-network-connection-over-yggdrasil.gmi
2025-10-03 07:27:31 +03:00

232 lines
No EOL
15 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil
I2P - це альтернативна мережа, характерною рисою якої є анонімізація користувача. На відміну від Tor, має принципово іншу модель маршрутизації, де стек IP не використовується як такий, а дані відправника вільно циркулюють роєм через випадкові вузли ретрансляції, допоки не досягнуть точки призначення. Таким чином, відправник даних є не визначеним мережею.
Утім, для підключення до I2P глобально, часто використовується Інтернет. Особливістю цього гайду є спосіб підключення до мережі I2P без прямих звернень Інтернет, через додатковий шар Yggdrasil. Може бути корисним у випадках, якщо ваш провайдер блокує піринговий трафік.
Метою цього матеріалу не є детальний опис принципу роботи мережі I2P і анонімізація зокрема. Матеріал створено лише у якості нотатки, з досвіду публікації Веб-сайту для української спільноти адміністраторів альтернативних мереж на прохання деяких користувачів, для чого й був потрібен локальний роутер. Якщо вам не потрібно публікувати сайт чи анонімно користуватися мережею I2P, можна просто скористатися наявними вихідними SOCKS/HTTP проксі, в т.ч. для Yggdrasil.
## Роутер
Існує декілька відомих мені реалізацій роутера I2P:
=> https://github.com/i2p/i2p.i2p i2p.i2p (Java) - оригінальна реалізація
=> https://github.com/i2p/i2p-rs i2p-rs (Rust) - стан готовності цього проєкту мені не відомий
=> https://github.com/PurpleI2P/i2pd i2pd (C++) - найбільш повноцінна реалізація, що підтримує з коробки режим роботи Yggdrasil-only
### i2pd
Для i2pd є готові збірки та репозиторії для різних дистрибутивів, але сам я завжди надаю перевагу збірці останніх версій програм з початкового коду. Нижче описаний саме такий спосіб, можливо з часом він може втратити свою актуальність через оновлення кодової реалізації. Детальна інструкція доступна в документації:
=> https://i2pd.readthedocs.io/en/latest/devs/building/unix/
нижче - приклад встановлення для Debian / Linux.
### Встановлення
``` bash
git clone https://github.com/PurpleI2P/i2pd.git
cd i2pd/build
cmake .
make
```
Власне, для Debian, можна зібрати пакунок .deb (що може бути більш правильним з точки зору адміністрування) але я встановлював вручну, адже буде зкомпільовано лише один бінарний файл i2pd, який потрібно перемістити до системної теки:
``` bash
sudo make install
```
### Створення системного користувача
Роутер i2pd я запускатиму від окремого системного користувача зі стандартними привілеями:
```
useradd -m i2pd
```
### Конфігурація i2pd
Тепер потрібно створити файл конфігурації, його я розмістив за адресою /etc/i2pd.conf, хоча ви можете додати його до теки користувача, при цьому змінивши шляхи у прикладах нижче:
``` bash
nano /etc/i2pd.conf
```
Оригінальний файл конфігурації [доступний в репозиторії](https://github.com/PurpleI2P/i2pd/blob/openssl/contrib/i2pd.conf), нижче я наведу тільки змінені його опції, але буде правильним звірити їх актуальність на момент встановлення:
``` /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...
```
Так як я не змінював стандартні шляхи, через помилку запуску згодом, додатково руками створив теку для збереження даних профілю (у вас це може бути тека користувача або інша)
``` bash
mkdir /var/lib/i2pd
chown i2pd:i2pd /var/lib/i2pd
```
Також, вручну скопіював сертифікати ініціальних вузлів до створеної теки /var/lib/i2pd:
=> https://github.com/PurpleI2P/i2pd/tree/openssl/contrib/certificates
інакше в конфігі доведеться вимкнути опцію `reseed.verify`
### Systemd
Тепер створімо сервіс systemd. В мене він відрізняється від стандартного:
=> https://github.com/PurpleI2P/i2pd/blob/openssl/contrib/i2pd.service
``` /etc/systemd/system/i2pd.service
#/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](https://github.com/PurpleI2P/pyseeder). Якщо ви знаєте адресу Yggdrasil вузла онлайн, то можете просто спробувати додати його в конфігурацію `reseed.yggurls` і перезапустити i2pd.
Якщо конекту досі немає, і ваш роутер по якимось причинам вже пускався в режимі Інтернет, варто (після зупинки сервіса i2pd) спробувати видалити теку:
``` bash
rm -rf /var/lib/i2pd/netDb
```
або якщо тека нова і там немає налаштувань тунелів, то очистити її повністю:
``` bash
rm -rf /var/lib/i2pd/*
```
Після змін вище, не забуваємо перезапустити роутер:
``` bash
systemctl restart i2pd
```
Через деякий час, ініціалізація мережі таки відбулась, але що було причиною точно не знаю.
Перевірити статус роботи роутера можна перейшовши у браузері за адресою його адмінки. Цю адресу ми вказували в опції `http.address`
### Публікація Веб-сайту в I2P
Власне, сайт (та будь який інший сервіс) публікується доволі просто: для цього використовуються так звані "тунелі" які проксуватимуть внутрішній трафік I2P на вказаний локальний сервіс, наприклад сервер Nginx. Детальніше про їх типи, можна почитати тут:
=> https://i2pd.readthedocs.io/en/latest/user-guide/tunnels/ I2P tunnel configuration
Створімо новий файл /var/lib/i2pd/tunnels.conf, або відредагуємо існуючий, якщо його немає:
``` /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;
```
Додаткову інформацію по налаштуванням Nginx, можна також знайти тут:
=> http://wiki.ilita.i2p/Создание_eep-сайтаа_базе_Nginx_и_I2Pd#итап_4._Настройка_nginx
## Додаткові заходи
Як сказано на початку матеріалу, його метою не є анонімізація. Роботу роутера я не перевіряв на предмет витоків з'єднань в Інтернет, публікація анонімного сайту (a.k.a. eepsite) - окрема тема. Якщо для вас це чутливе питання, зверніть увагу на попередні публікації, що можуть частково допомогти з ізоляцією потенційних витоків:
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock.gmi Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK
=> filter-outgoing-connections-with-ufw.gmi Обмеження вихідних з'єднань на Інтернет з ufw
=> safe-yggdrasil-websites-browsing-with-yggstack.gmi Безпечний перегляд сайтів Yggdrasil з Yggstack
## Посилання
=> https://devzone.org.ua/post/vstanovlennia-routera-i2p-z-pidkliuchenniam-cherez-yggdrasil Веб-версія цього матеріалу з коментарями на DevZone
### Читайте також
=> yggdrasil-is-network-with-distributed-routing.gmi Yggdrasil - мережа з децентралізованою маршрутизацією