Pyseeder: підтримка екосистеми I2P в мережі Yggdrasil

Так як при першій ініціалізації вузла i2pd засобами Yggdrasil виникли деякі затримки, вирішив слідом за конектом свого роутера - підняти й додатковий ресід для інших локальних юзерів.

Pyseeder

pyseeder (https://github.com/PurpleI2P/pyseeder) - утиліта командного рядка, написана мовою Python. Вона використовується для різних задач, зокрема для генерації файлу i2pseeds.su3, необхідного для пошуку вузлів при першому запуску роутера I2P (в i2pd, він звичайно вказується в i2pd.conf). Це працює приблизно так, як DNS сід гаманців BitCoin.

Інструкції з користування pyseeder описані в README.md проєкту:

Нижче опишу лише свою конфігурацію.

Встановлення

Для Debian / Linux знадобились такі пакунки:

apt install python3 python3-virtualenv build-essential libssl-dev libffi-dev

Від користувача, яким планується подальший запуск:

git clone https://github.com/PurpleI2P/pyseeder.git
cd pyseeder
virtualenv --python=python3 venv
. venv/bin/activate
pip3 install .

Nginx

В pyseeder, мене спочатку заплутала наявність сервера, адже для DNS сіда BitCoin - потрібен саме він. Тут же все простіше: потрібно просто згенерувати дамп "пірів" у статичний файл і розмістити його у теці яку слухає будь який Веб-сервер, зокрема Nginx.

Створімо публічну теку:

mkdir /var/www/pyseeder
chown USER:GROUP /var/www/pyseeder

Копіюємо туди файл seed.html з теки yggdrasil:

cp yggdrasil/seed.html /var/www/pyseeder

Приклад налаштувань хосту Nginx можна знайти у файлі reseed_nginx.conf:

Я організував свій хост наступним чином:

limit_req_zone $binary_remote_addr zone=reseed:512k rate=10r/m;
server {
    root /var/www/pyseeder;
    listen [302:68d0:f0d5:b88d::9216]:80;
    # на цьому сервері також прослуховується 0400::/7 (Mycelium)
    # listen [505:6847:c778:61a1::9216]:80;
    index seed.html;
        location /i2pseeds.su3 {
        limit_req zone=reseed burst=5;
        if ($http_user_agent !~* "Wget/1.11.4" ) { return 403; }
        }
    location /user_at_mail.i2p.crt {
                limit_req zone=reseed;
        }
}

Генерація ключа і сертифіката

pyseeder keygen --cert /var/www/pyseeder/user_at_mail.i2p.crt --private-key /path/to/priv_key.pem --signer-id noreply@localhost

Генерація i2pseeds.su3

YOUR_PASSWORD="Pa55w0rd"
echo $YOUR_PASSWORD | pyseeder reseed --netdb /path/to/netDb --private-key /path/to/priv_key.pem --outfile /var/www/pyseeder/i2pseeds.su3 --signer-id noreply@localhost

Для оновлення по розкладу crontab, створімо скрипт `crontab.sh`:

 #!/bin/bash
cd /path/to/pyseeder
. venv/bin/activate
#YOUR_PASSWORD="Pa55w0rd"
#echo $YOUR_PASSWORD | pyseeder reseed --netdb /path/to/netDb --private-key /path/to/priv_key.pem --outfile /var/www/pyseeder/i2pseeds.su3 --signer-id noreply@localhost
pyseeder reseed --no-encryption --netdb /path/to/netDb --private-key /path/to/priv_key.pem --outfile /var/www/pyseeder/i2pseeds.su3 --signer-id noreply@localhost
deactivate

І додамо завдання:

crontab -e
@hourly /path/to/crontab.sh

Фільтрація вузлів Yggdrasil

В принципі, можна користуватись утилітою з командного рядка (після активації `. venv/bin/activate`) але у випадку піра Yggdrasil, бажано не просто здампити накопичену базу NetDB, але й відфільтрувати вузли Yggdrasil для локальних користувачів, зокрема - віддавати їх в пріоритеті. Цю задачу виконує скрипт:

y2r.sh

Перед його запуском, важливо актуалізувати в ньому наступні шляхи:

Цей скрипт зручно виконувати через crontab з іншого скрипта, перед з командою `pyseeder reseed ...`

Збереження тимчасових файлів в оперативній пам'яті

Оскільки pyseeder зберігає тимчасові дампи netDb в файл, щоб не зношувати SSD, я монтую локації y2r.sh в оперативну пам'ять. Для цього в `/etc/fstab` додаю на вибір:

1) tmpfs

Цей варіант дозволяє коректно розставити права на запис і вказати потрібні опції. Також він передбачає розширення пам'яті за рахунок swap у разі перевищення фізичного простору:

tmpfs  /path/to/tmp-net-db  tmpfs  defaults  0  0

Зміни вступають в силу після перезапуску системи, якщо потрібно в рамках поточної сесії - монтуємо:

mount -t tmpfs -o defaults tmpfs /path/to/tmp-net-db

2) ramfs

У такому випадку, використовується лише фізична пам'ять, але для неї буде не доступний запис від користувача (crontab.sh). Змінити права після монтування (на прикладі вище) можна через `crontab -e` від root:

@reboot chown USER:GROUP /path/to/tmp-net-db

але наскільки безпечним такий сценарій буде для динамічних даних ресіда - вирішуйте самостійно.

Тестування

Для перевірки, на цільовому сервері (з попередньо встановленим pyseeder) виконуємо команду:

pyseeder transport.pull --urls http://[302:68d0:f0d5:b88d::9216]/ --outfile /path/to/i2pseeds.su3

Посилання

Веб-версія цього матеріалу з коментарями на DevZone

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

Встановлення роутера i2pd з підключенням до мережі I2P через Yggdrasil