mirror of
https://codeberg.org/postscriptum/gemlog.git
synced 2026-02-19 06:22:41 +00:00
226 lines
No EOL
15 KiB
Text
226 lines
No EOL
15 KiB
Text
# Встановлення роутера 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
|
||
```
|
||
|
||
Так як я не змінював стандартні шляхи, через помилку запуску згодом, додатково руками створив теку для збереження даних профілю (у вас це може бути тека користувача або інша)
|
||
|
||
``` 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.
|
||
|
||
Створімо новий файл /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 - мережа з децентралізованою маршрутизацією |