# Анонімний піринг BitTorrent з I2PSnark та i2pd Давно цікавлюсь тематикою альтернативних мереж, зокрема - експериментую з [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereza-z-detsentralizovanym-routynhom) в контексті BitTorrent. Про мережу [I2P](https://uk.wikipedia.org/wiki/I2P) знаю давно, але мені жодного разу не доводилось нею користуватись. Утім, організувавши на прохання деяких користувачів доступ по I2P до [форуму адміністраторів альтернативних мереж](https://devzone.org.ua/topic/ukrayinska-spilnota-administratoriv-alternatyvnykh-merez), [налаштувавши дзеркало свого блогу Gemini](https://devzone.org.ua/post/publikatsiia-kapsuly-gemini-v-i2p-na-prykladi-servera-agate), та [ретрансляцію каналів eQtv і Громадське радіо](https://devzone.org.ua/post/proksuvannia-m3u8-zasobamy-icecast), стало цікаво також спробувати цю мережу і в контексті торентів. Для одночасного обміну файлами в Інтернет, Yggdrasil і Mycelium - я користуюсь вільним клієнтом [qBittorrent](https://www.qbittorrent.org), що з коробки працює на всі мережі (Інтернет та Yggdrasil через подвійний стек IPv4/IPv6) і має гнучкі налаштування для керування великими колекціями. Але Yggdrasil не є анонімною мережею, а qBittorrent - допускає в такому випадку непередбачені з'єднання в гібридному режимі, оскільки розроблявся перш за все для максимальної конективності, а не для анонімізації/деперсоналізації. Так, в ньому є експериментальна опція I2P та універсальна реалізація проксі SOCKS5, але я вже помічав за цим клієнтом "сюрпризи" у вигляді вихідних з'єднань на веб-сокет IPv4 при біндінгу на IPv6 та інші нюанси, що в цілому залежать від конкретної версії. Ситуація не краще й з віднайденою мною бібліотекою [librqbit](https://docs.rs/librqbit/latest/librqbit/) (на базі якої мав намір створити приватно-орієнтований клієнт GTK для оверлейних мереж) де наприклад не можливо вимкнути [PEX](https://en.wikipedia.org/wiki/Peer_exchange), для чого треба користуватись костилями blacklist. Взагалі, тему приватного користування торентами в контексті оверлейних мереж краще розкрити окремо, бо тут є що розповісти. ## Інфраструктура I2P В своїй конфігурації I2P, я використовую C++ роутер [i2pd](https://github.com/PurpleI2P/i2pd), оскільки він дозволяє з коробки [налаштувати підключення в режимі Yggdrasil-only](https://devzone.org.ua/post/vstanovlennia-routera-i2p-z-pidkliuchenniam-cherez-yggdrasil) (минаючи прямі з'єднання в Інтернет) і може бути корисним в умовах, коли піринговий трафік через Інтернет може бути не бажаним. Переглянувши [доступні клієнти](https://i2pd.readthedocs.io/en/latest/tutorials/filesharing/), відкинув вже згаданий qBittorrent і [BiglyBT](https://www.biglybt.com/) через їх універсальність; [XD](https://github.com/majestrate/XD) - як такий, що "крашить" i2pd. Тому з кандидатів лишився I2P-only [I2PSnark](https://gitlab.com/i2pplus/I2P.Plus/-/tree/master/apps/i2psnark). ### I2PSnark Як видно з посилання, клієнт I2PSnark - є частиною Java роутера [I2P.Plus](https://gitlab.com/i2pplus/I2P.Plus), у той час як моя збірка використовує i2pd (C++). На щастя, розробники заморочились і написали скрипт для генерації артефакту "[standalone](https://gitlab.com/i2pplus/I2P.Plus/-/jobs/artifacts/master/raw/i2psnark-standalone.zip?job=Java8)" - тобто цей клієнт можна запустити як окрему програму та під'єднати до наявного демона i2pd через API [I2CP](https://geti2p.net/uk/docs/protocol/i2cp) (один з протоколів комунікації застосунків мережі I2P) Для "встановлення" в Linux, достатньо розпакувати архів до потрібної вам теки з програмами користувача і запустити скрипт `launch-i2psnark` (для Windows це наче має бути `launch-i2psnark.bat`). Якщо потрібно зібратись з сорсу - дивіться інструкції генерації артефакту відповідно до актуальної версії, особисто я не бачу сенсу білдитись тут руками. Само собою, для запуску I2PSnark повинна бути встановлена віртуальна машина Java. ### i2pd Пара слів про i2pd. По-перше, якщо в налаштуваннях роутера не увімкнено протокол I2CP - вмикаємо: ``` /etc/i2pd.conf #/etc/i2pd.conf [i2cp] enabled = true ``` * або запускаємо роутер з аргументом `--i2cp.enabled=true` По-друге, цей роутер в мене встановлено на віддаленому сервері, тому якщо запустити стандартну конфігурацію I2PSnark, він не зможе підключитись до локалхосту (`127.0.0.1`). Якщо у вас аналогічна ситуація, відредагуємо додатково: ``` /etc/i2pd.conf #/etc/i2pd.conf [i2cp] address = a.a.a.a ``` * `a.a.a.a` - IP адреса віддаленого i2pd роутера, це може бути локальна IPv4 або IPv6 адреса Якщо роутер віддалений, не забуваємо відкрити відповідний порт для клієнтського хосту: ``` bash ufw allow from b.b.b.b to a.a.a.a port 7654 proto tcp ``` * `b.b.b.b` - адреса, де встановлено клієнт I2PSnark * `a.a.a.a` - адреса роутера i2pd * якщо `a.a.a.a` == `127.0.0.1` або `::1` (тобто I2PSnark і i2pd на одному пристрої) то відкривати порт не потрібно ## Запуск Як згадано вище, запуск I2PSnark відбувається командою: ``` bash ./launch-i2psnark ``` * після цього має автоматично відкритись вкладка типового браузера за адресою http://127.0.0.1:8002/i2psnark/ ### Приклад systemd Для зручності запуску, в системах Linux можна створити системний сервіс: ``` /etc/systemd/system/i2psnark.service #/etc/systemd/system/i2psnark.service [Unit] After=network.target [Service] Type=idle # useradd -m i2psnark User=i2psnark Group=i2psnark # за умови, що I2PSnark розпаковано до теки користувача WorkingDirectory=/home/i2psnark ExecStart=/home/i2psnark/i2psnark/launch-i2psnark # опціонально, можна вказати як null # StandardOutput=file:///home/i2psnark/debug.log # StandardError=file:///home/i2psnark/error.log [Install] WantedBy=multi-user.target ``` * `systemctl start i2psnark` - старт * `systemctl enable i2psnark` - додати в авто-запуск * `systemctl status i2psnark` - перевірка статусу * `systemctl stop i2psnark` - зупинити ### Підключення до віддаленого роутера i2pd У разі, якщо роутер i2pd віддалений, перше що треба зробити - це зайти до налаштувань WebUI: ![Кнопка налаштувань I2PSnark в браузері](https://devzone.org.ua/storage/posts/2025/10/24/8ADzR48l2Rnx8cCrDnoVmntGoXAWk7mRK1bIpVBL.png) І вказати актуальний його хост (_Configuration_ > _Tunnel Configuration_ > _I2CP Host_) ![Налаштування хосту I2CP в I2PSnark](https://devzone.org.ua/storage/posts/2025/10/24/KitbzyZ9zJYCQaQQv9dlJKRSm1BKYCDfL347YYIk.png) В принципі, можна вказати до запуску, у файлі `/i2psnark/i2psnark.config.d/i2psnark.config`: ``` /i2psnark/i2psnark.config.d/i2psnark.config i2psnark.i2cpHost=a.a.a.a ``` ### Налаштування довжини ланцюжка з'єднань На що варто звернути увагу перед початком обміну файлами - це довжина "хопів" або точок ретрансляції. Ці налаштування знаходяться в тому ж розділі (_Configuration_ > _Tunnel Configuration_ > _Inbound Settings_ та _Outbound Settings_) ![Налаштування довжини тунелів I2PSnark](https://devzone.org.ua/storage/posts/2025/10/24/dsMq2hZyK6EngFe8Vg7X70SSJnQvC00MBgDplMGS.png) Тут можна поставити значення "2" або навіть "1", адже заплутаність маршруту - не є останнім засобом анонімізації, яку використовує I2P: зокрема клієнт I2PSnark генерує випадкові PeerID, а трафік в каналі є зашифрованим, до того ж (у моєму випадку) загорнутий в Yggdrasil. Не варто зайвий раз навантажувати транзитні вузли ціною вашого ж часу на завантаження серіалу. ### Налаштування швидкості I2PSnark має "комфортні" обмеження з коробки, тобто такі, що не перевантажують пропускний канал роутера. Тому, якщо ви, як і я, не дуже активно сьорфите мережею I2P, можна збільшити ліміти на вхідний / вихідний трафік в розділі _Configuration_ > _Torrent Options_ > _Bandwidth limit_: ![Налаштування ліміту швидкості каналу I2PSnark](https://devzone.org.ua/storage/posts/2025/10/29/Fxctgu1wcL02mHyCOLPA86FzDDfDwIlZBteSMmzr.png) ### Налаштування локального сховища Варто звернути увагу на те, де будуть зберігатись завантажені та поширювані файли. Вказати шлях до кореневої теки можна в розділі _Configuration_ > _Data Storage_ > _Data directory_: ![Налаштування локального сховища I2PSnark](https://devzone.org.ua/storage/posts/2025/10/29/mAouGuTZB8ZXQKT9BtRPqD84JMFpCpGyinRhPczP.png) * Якщо в _Data directory_ через файловий менеджер або FTP додати торент-файли, вони будуть автоматично розпізнані клієнтом і з'являться в списку на головній сторінці Веб-панелі, а дані торентів - будуть завантажені відносно її кореня * I2PSnark підтримує символічні посилання, тому якщо у вас для сховища примонтовані різні диски з файлами, для них в _Data directory_ можна створити вказівники командою `ln -s` ### Користування Стосовно інтерфейсу, хто користувався торентами і здатен поставити описаний вище софт - зорієнтується як додавати через веб-адмінку файли `.torrent` і посилання Magnet. Зі свого першого досвіду, можу сказати, що цей клієнт дуже "дивний" і так би мовити не інтерактивний. Тут потрібен час, щоб вивчити кожний його нюанс, тому не поспішайте сідити з нього великі колекції. Декілька порад, що можуть стати в нагоді початківцям: * При першому запуску, дочекайтесь індексації каталогу і відбудови усіх роздач у спику. Поки вона не завершиться, не варто додавати нові, бо вони з'являться тільки після завершення усіх попередніх процесів у черзі. Можливо, це пов'язано з реалізацією UI/API, але таке враження що I2PSnark працює в одному потоці і не реагує, коли ви шлете через WebUI нову команду. Це дуже збиває з толку, бо консоль і журнали не реєструють ініціацію нових подій. * Не додавайте кастомні шляхи при імпорті торентів з WebUI, окрім того що вказано в _Data directory_. Я так робив та після хард-ребуту (зникло світло), в мене відвалились роздачі розміщені за рамками стандартної теки - довелось руками писати символічні посилання. Ці шляхи я згодом віднайшов у профілі I2PSnark (`/path/to/i2psnark.config.d/xx/xx.config`), але їх зміна в мене не працює; можливо там є часові мітки або ще щось мені не відоме. * Зверніть увагу, що в екосистемі I2P торенти мають не формальний ліміт файлів (inode) 2000 на торент. Таке ж значення вказане в I2PSnark. Хоча ця опція є в налаштуваннях, вона доступна тільки на читання. В принципі, ви можете її змінити в конфігурації профілю (`i2psnark.maxFilesPerTorrent=5000`) і перезапустити клієнт, але інші користувачі I2PSnark не зможуть її обробити, якщо як і ви, не змінили цей стандартний ліміт локально. Тобто ваша роздача буде напів-сумісною з мережею: також, відомі трекери валідують кількість файлів на торент. Якщо ваша роздача містить більше 2000 файлів, їх варто або заархівувати або розбити на окремі торенти, які згодом організувати в рамках так званого "пулу" або "колекції". ### Трекери Щодо трекерів, то в мережі I2P є різні ресурси, найвідоміший і найстаріший з них - це [tracker2.postman.i2p](http://tracker2.postman.i2p) ([b32](http://6a4kxkg5wp33p25qqhgwl6sj4yh4xuf5b3p3qldwgclebchm3eea.b32.i2p)) він вже входить до стандартного пресету I2PSnark. Створюючи новий торент для відвантаження на цей трекер, переконайтесь, що його адресу додано до списку: ![Додавання трекерів до нової роздачі в I2PSnark](https://devzone.org.ua/storage/posts/2025/10/30/5AVkv7Coxle43iCOQRel68gfEqpTFpNO6I5dux0k.png) * можна вказати альтернативні трекери (колонка _Alternates_) для кращої конективності DHT; * поле "_Content Filters_" - наскільки я розумію, дозволяє прибрати з роздачі системні файли; * поле "_Data to seed_" - назва файлу або теки у файловій системі (відносно _Data directory_) або абсолютний альтернативний шлях, який з досвіду вище я використовувати не раджу. Якщо ви користуєтесь іншим трекером і його немає в стандартному списку, додати такий (як і налаштувати власні фільтри) можна в _Configuration_ > _Trackers_ і _Torrent create file filtering_ відповідно: ![Налаштування користувацьких трекерів та фільтрів в I2PSnark](https://devzone.org.ua/storage/posts/2025/10/30/OALMUSfqWciyaFDP37igNgsM9ZmcZZxKeVQ5spGG.png) ### Поради з безпеки Будь-який роутер I2P реалізує класичну технологію пірингу (P2P), це означає, що ваш пристрій надсилатиме запити на випадкові адреси IP, отримані в процесі роботи роутера (подібно до звичайного клієнта BitTorrent). I2P не маскує ваше користування цією мережею, а лише ідентичність в ній. Тому, якщо такі технології, зокрема що базовані на BitTorrent/DHT - частково або повністю обмежені у вашій країні як такі, підключайтесь до I2P через VPN або локальні мережі типу [Yggdrasil](https://devzone.org.ua/post/vstanovlennia-routera-i2p-z-pidkliuchenniam-cherez-yggdrasil). Проаналізувати якість налаштувань та активні підключення (наявність витоків трафіку), зручно програмою [Etherape](https://etherape.sourceforge.io). Якщо у вас є сумніви стосовно якості реалізації i2pd / I2PSnark, скористайтесь додатковими засобами віртуалізації, наприклад без використання мережного інтерфейсу як такого: * [Ізоляція 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)