# Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil I2P - це альтернативна мережа, характерною рисою якої є анонімізація користувача. На відміну від Tor, має принципово іншу модель маршрутизації, де стек IP не використовується як такий, а дані відправника вільно циркулюють роєм через випадкові вузли ретрансляції, допоки не досягнуть точки призначення. Таким чином, відправник даних є не визначеним мережею. Утім, для підключення до I2P глобально, часто використовується Інтернет. Особливістю цього гайду є спосіб підключення до мережі I2P без прямих звернень Інтернет, через додатковий шар [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom). Може бути корисним у випадках, якщо ваш провайдер блокує піринговий трафік. * _В інших випадках, такий спосіб може бути менш "анонімним" через можливість генерації необмеженої кількості адрес Yggdrasil з підміною ними "незалежних" вузлів ([Атака Сивілли](https://uk.wikipedia.org/wiki/Атака_Сивілли)) - таким чином, для себе важливо правильно обирати пріоритети налаштувань і розуміти мету, з якою використовується I2P. Адже якщо метою є саме анонімізація а не наприклад ретрансляція певного сервісу для користувачів з обмеженим доступом - то для таких цілей, на мою думку, краще використовувати звичайний Інтернет піринг або приватний ботнет._ Метою цього матеріалу не є детальний опис принципу роботи мережі I2P і анонімізація зокрема. Матеріал створено лише у якості нотатки, з досвіду публікації Веб-сайту для [української спільноти адміністраторів альтернативних мереж](https://devzone.org.ua/topic/ukrayinska-spilnota-administratoriv-alternatyvnykh-merez) на прохання деяких користувачів, для чого й був потрібен локальний роутер. Якщо вам не потрібно публікувати сайт чи анонімно користуватися мережею I2P, можна просто скористатися наявними вихідними SOCKS/HTTP проксі, в т.ч. для Yggdrasil. ## Роутер Існує декілька відомих мені реалізацій роутера I2P: * [i2p.i2p](https://github.com/i2p/i2p.i2p) (Java) - оригінальна реалізація * [i2p-rs](https://github.com/i2p/i2p-rs) (Rust) - спроба реалізації роутера сучасною мовою, утім стан готовності цього проєкту мені не відомий * [i2pd](https://github.com/PurpleI2P/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 ``` Також, вручну скопіював [сертифікати](https://github.com/PurpleI2P/i2pd/tree/openssl/contrib/certificates) ініціальних вузлів до створеної теки `/var/lib/i2pd`, інакше в конфігі доведеться вимкнути опцію `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 Власне, сайт (та будь який інший сервіс) публікується доволі просто: для цього використовуються так звані "[тунелі](https://i2pd.readthedocs.io/en/latest/user-guide/tunnels/)" які проксуватимуть внутрішній трафік 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`: ``` /etc/nginx.conf server_names_hash_bucket_size 128; ``` ## Додаткові заходи Як сказано на початку матеріалу, його метою не є анонімізація. Роботу роутера я не перевіряв на предмет витоків з'єднань в Інтернет, публікація анонімного сайту (a.k.a. eepsite) - окрема тема. Якщо для вас це чутливе питання, зверніть увагу на попередні публікації, що можуть частково допомогти з ізоляцією потенційних витоків: * [Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK](https://devzone.org.ua/post/izoliatsiia-linux-vid-priamykh-internet-zyednan-na-bazi-qemu-virtual-machine-manager-i-vsock) * [Обмеження вихідних з'єднань на Інтернет з ufw](https://devzone.org.ua/post/obmezennia-vykhidnykh-zyednan-na-internet-z-ufw) * [Безпечний перегляд сайтів Yggdrasil з Yggstack](https://devzone.org.ua/post/bezpechnyy-perehliad-saytiv-yggdrasil-z-yggstack)