# Анонімний піринг BitTorrent з I2PSnark та i2pd

Давно цікавлюсь тематикою альтернативних мереж, зокрема - експериментую з Yggdrasil в контексті BitTorrent. Про мережу I2P (https://uk.wikipedia.org/wiki/I2P) знаю давно, але мені жодного разу не доводилось нею користуватись. Утім, організувавши на прохання деяких користувачів доступ по I2P до форуму адміністраторів альтернативних мереж, налаштувавши дзеркало свого блогу Gemini, та ретрансляцію каналів eQtv і Громадське радіо, стало цікаво також спробувати цю мережу і в контексті торентів.

Для одночасного обміну файлами в Інтернет, Yggdrasil і Mycelium - я користуюсь вільним клієнтом qBittorrent (https://www.qbittorrent.org), що з коробки працює на всі мережі (Інтернет та Yggdrasil через подвійний стек IPv4/IPv6) і має гнучкі налаштування для керування великими колекціями. Але Yggdrasil не є анонімною мережею, а qBittorrent - допускає в такому випадку непередбачені з'єднання в гібридному режимі, оскільки розроблявся перш за все для максимальної конективності, а не для анонімізації/деперсоналізації. Так, в ньому є експериментальна опція I2P та універсальна реалізація проксі SOCKS5, але я вже помічав за цим клієнтом "сюрпризи" у вигляді вихідних з'єднань на веб-сокет IPv4 при біндінгу на IPv6 та інші нюанси, що в цілому залежать від конкретної версії.

Ситуація не краще й з віднайденою мною бібліотекою librqbit (на базі якої мав намір створити приватно-орієнтований клієнт GTK для оверлейних мереж) де наприклад не можливо вимкнути PEX (https://en.wikipedia.org/wiki/Peer_exchange), для чого треба користуватись костилями blacklist. Взагалі, тему приватного користування торентами в контексті оверлейних мереж краще розкрити окремо, бо тут є що розповісти.

## Інфраструктура I2P

В своїй конфігурації I2P, я використовую C++ роутер i2pd:
=> https://github.com/PurpleI2P/i2pd

- оскільки він дозволяє з коробки налаштувати підключення в режимі Yggdrasil-only (минаючи прямі з'єднання в Інтернет) і може бути корисним в умовах, коли піринговий трафік через Інтернет може бути не бажаним.

Переглянувши доступні клієнти:
=> https://i2pd.readthedocs.io/en/latest/tutorials/filesharing/

- відкинув вже згаданий qBittorrent і BiglyBT (https://www.biglybt.com/) через їх універсальність; XD (https://github.com/majestrate/XD) - як такий, що "крашить" i2pd. Тому з кандидатів лишився I2P-only I2PSnark.

### I2PSnark

I2PSnark - є частиною Java роутера I2P.Plus:
=> https://gitlab.com/i2pplus/I2P.Plus

Але моя збірка використовує i2pd (C++). На щастя, розробники заморочились і написали скрипт для генерації артефакту
=> https://gitlab.com/i2pplus/I2P.Plus/-/jobs/artifacts/master/raw/i2psnark-standalone.zip?job=Java8 i2psnark-standalone.zip

- тобто цей клієнт можна запустити як окрему програму та під'єднати до наявного демона i2pd через API/I2CP (один з протоколів комунікації застосунків мережі I2P)

Для "встановлення" в Linux, достатньо розпакувати архів до потрібної вам теки з програмами користувача і запустити скрипт `launch-i2psnark` (для Windows це наче має бути `launch-i2psnark.bat`). Якщо потрібно зібратись з сорсу - дивіться інструкції генерації артефакту відповідно до актуальної версії, особисто я не бачу сенсу білдитись тут руками. Само собою, для запуску I2PSnark повинна бути встановлена віртуальна машина Java:

``` bash
apt install default-jre
```

### 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:
=> anonymous-torrents-with-i2psnark-over-i2pd/i2psnark-settings-button.png Кнопка налаштувань I2PSnark в браузері (скріншот)

І вказати актуальний його хост (Configuration > Tunnel Configuration > I2CP Host)
=> anonymous-torrents-with-i2psnark-over-i2pd/i2cp-host-configuration.png Налаштування хосту I2CP в I2PSnark (скріншот)

В принципі, можна вказати до запуску, у файлі i2psnark.config:
``` /i2psnark/i2psnark.config.d/i2psnark.config
i2psnark.i2cpHost=a.a.a.a
```

### Налаштування довжини ланцюжка з'єднань

На що варто звернути увагу перед початком обміну файлами - це довжина "хопів" або точок ретрансляції. Ці налаштування знаходяться в тому ж розділі (Configuration > Tunnel Configuration > Inbound Settings та Outbound Settings)
=> anonymous-torrents-with-i2psnark-over-i2pd/tunnel-hops-settings-in-i2psnark.png Налаштування довжини тунелів I2PSnark (скріншот)

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

### Налаштування швидкості

I2PSnark має "комфортні" обмеження з коробки, тобто такі, що не перевантажують пропускний канал роутера. Тому, якщо ви, як і я, не дуже активно сьорфите мережею I2P, можна збільшити ліміти на вхідний / вихідний трафік в розділі Configuration > Torrent Options > Bandwidth limit:
=> anonymous-torrents-with-i2psnark-over-i2pd/i2psnark-bandwidth-limit.png Налаштування ліміту швидкості каналу I2PSnark

### Налаштування локального сховища

Варто звернути увагу на те, де будуть зберігатись завантажені та поширювані файли. Вказати шлях до кореневої теки можна в розділі Configuration > Data Storage > Data directory:
=> anonymous-torrents-with-i2psnark-over-i2pd/i2psnark-data-directory-settings.png Налаштування локального сховища I2PSnark

* Якщо в 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://6a4kxkg5wp33p25qqhgwl6sj4yh4xuf5b3p3qldwgclebchm3eea.b32.i2p b32
- він вже входить до стандартного пресету I2PSnark; створюючи новий торент для відвантаження на цей трекер - переконайтесь, що його адресу додано до списку:
=> anonymous-torrents-with-i2psnark-over-i2pd/i2psnark-bittorrent-trackers.png Додавання трекерів до нової роздачі в I2PSnark
* можна вказати альтернативні трекери (колонка Alternates) для кращої конективності DHT;
* поле "Content Filters" - наскільки я розумію, дозволяє прибрати з роздачі системні файли;
* поле "Data to seed" - назва файлу або теки у файловій системі (відносно Data directory) або абсолютний альтернативний шлях, який з досвіду вище я використовувати не раджу.

Якщо ви користуєтесь іншим трекером і його немає в стандартному списку, додати такий (як і налаштувати власні фільтри) можна в Configuration > Trackers і Torrent create file filtering відповідно:
=> anonymous-torrents-with-i2psnark-over-i2pd/i2psnark-content-filter-trackers-settings.png Налаштування користувацьких трекерів та фільтрів в I2PSnark

### Поради з безпеки

Будь-який роутер I2P реалізує класичну технологію пірингу (P2P), це означає, що ваш пристрій надсилатиме запити на випадкові адреси IP, отримані в процесі роботи роутера (подібно до звичайного клієнта BitTorrent). I2P не маскує ваше користування цією мережею, а лише ідентичність в ній. Тому, якщо такі технології, зокрема що базовані на BitTorrent/DHT - частково або повністю обмежені у вашій країні як такі, підключайтесь до I2P через VPN або локальні мережі типу Yggdrasil. Проаналізувати якість налаштувань та активні підключення (наявність витоків трафіку), зручно програмою Etherape:
=> https://etherape.sourceforge.io

Якщо у вас є сумніви стосовно якості реалізації i2pd / I2PSnark, скористайтесь додатковими засобами віртуалізації, наприклад без використання мережного інтерфейсу як такого:
=> linux-isolation-from-direct-internet-connections-based-on-qemu-virtual-machine-manager-with-vsock.gmi Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK

## Посилання

=> gemini://bbs.geminispace.org/s/I2P/33859 Обговорення матеріалу на BBS
=> https://devzone.org.ua/post/anonimne-korystuvannia-bittorrent-z-i2psnark-ta-i2pd Веб-адаптація цього матеріалу з коментарями на DevZone

### Тематичні відео

Acetone

=> https://www.youtube.com/watch?v=Csf7YQY9JOc BitTorrent over I2P. Анонимный обмен файлами через даркнет без регистрации и СМС | №12
=> http://tracker2.postman.i2p/index.php?view=TorrentDetail&id=67062 BitTorrent роздача цього відео на tracker2.postman.i2p
=> http://tracker2.postman.i2p/index.php?view=TPoolDetail&id=1450 Пул "Acetone Video archive" на tracker2.postman.i2p

LibreTrack

=> https://www.youtube.com/watch?v=WLA7_SLNUco Работа с торрентами в сети I2P

### Читайте також

=> yggdrasil-is-network-with-distributed-routing.gmi Yggdrasil - мережа з децентралізованою маршрутизацією
=> setup-i2pd-with-i2p-network-connection-over-yggdrasil.gmi Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil