mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-19 22:12:39 +00:00
160 lines
No EOL
19 KiB
Markdown
160 lines
No EOL
19 KiB
Markdown
# Анонімний піринг 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:
|
||
|
||

|
||
|
||
І вказати актуальний його хост (_Configuration_ > _Tunnel Configuration_ > _I2CP Host_)
|
||
|
||

|
||
|
||
В принципі, можна вказати до запуску, у файлі `/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_)
|
||
|
||

|
||
|
||
Тут можна поставити значення "2" або навіть "1", адже заплутаність маршруту - не є останнім засобом анонімізації, яку використовує I2P: зокрема клієнт I2PSnark генерує випадкові PeerID, а трафік в каналі є зашифрованим, до того ж (у моєму випадку) загорнутий в Yggdrasil. Не варто зайвий раз навантажувати транзитні вузли ціною вашого ж часу на завантаження серіалу.
|
||
|
||
### Налаштування швидкості
|
||
|
||
I2PSnark має "комфортні" обмеження з коробки, тобто такі, що не перевантажують пропускний канал роутера. Тому, якщо ви, як і я, не дуже активно сьорфите мережею I2P, можна збільшити ліміти на вхідний / вихідний трафік в розділі _Configuration_ > _Torrent Options_ > _Bandwidth limit_:
|
||
|
||

|
||
|
||
### Налаштування локального сховища
|
||
|
||
Варто звернути увагу на те, де будуть зберігатись завантажені та поширювані файли. Вказати шлях до кореневої теки можна в розділі _Configuration_ > _Data Storage_ > _Data directory_:
|
||
|
||

|
||
|
||
* Якщо в _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. Створюючи новий торент для відвантаження на цей трекер, переконайтесь, що його адресу додано до списку:
|
||
|
||

|
||
* можна вказати альтернативні трекери (колонка _Alternates_) для кращої конективності DHT;
|
||
* поле "_Content Filters_" - наскільки я розумію, дозволяє прибрати з роздачі системні файли;
|
||
* поле "_Data to seed_" - назва файлу або теки у файловій системі (відносно _Data directory_) або абсолютний альтернативний шлях, який з досвіду вище я використовувати не раджу.
|
||
|
||
Якщо ви користуєтесь іншим трекером і його немає в стандартному списку, додати такий (як і налаштувати власні фільтри) можна в _Configuration_ > _Trackers_ і _Torrent create file filtering_ відповідно:
|
||
|
||

|
||
|
||
### Поради з безпеки
|
||
|
||
Будь-який роутер 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) |