10 KiB
Pyseeder: підтримка екосистеми I2P в мережі Yggdrasil
Так як при першій ініціалізації вузла i2pd засобами Yggdrasil (для форуму спільноти) виникли деякі затримки, вирішив слідом за конектом свого роутера - підняти й додатковий ресід для інших локальних юзерів.
Pyseeder
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
USER:GROUP- ваше значення
Копіюємо туди файл 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;
}
}
- не забудьте додати відповідні маски підмережі або використовуйте основну адресу на іншому порту, якщо 80 зайнятий
- також після змін треба оновити конфігурацію
systemctl reload nginx
Генерація ключа і сертифіката
pyseeder keygen --cert /var/www/pyseeder/user_at_mail.i2p.crt --private-key /path/to/priv_key.pem --signer-id noreply@localhost
--certпотрібен якщо на цільовому сервері увімкнена опціяreseed.verify = true; якщо ви плануєте стати "офіційним" ресідом, його також потрібно додати до репозиторію i2pd через PR (інакше користувачу потрібно буде вказати цей сертифікат при імпорті пірів для верифікації постачальникаi2pseeds.su3)--private-key- власне приватний ключ, яким підписуються дані для експорту--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
YOUR_PASSWORD- пароль, який було вказано приpyseeder keygen(або кропаємо все до|та додаємо аргумент--no-encryptionякщо пароль відсутній)--netdb- шлях до бази мережі I2P, це може бути відфільтрована скриптом або "жива" база вузла--outfile- публічна тека на Веб-сервері, звідки інші піри зможуть її забрати--signer-id- той само, що вказувався при генерації ключів
Для оновлення по розкладу 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
- в прикладі вказані сценарії з використанням паролю і без (розкоментуйте потрібне)
- замініть значення
YOUR_PASSWORD,/path/toіnoreply@localhostна ваші - додаємо права на виконання:
chmod +x crontab.sh
І додамо завдання:
crontab -e
- виконується від потрібного користувача
@hourly /path/to/crontab.sh
Фільтрація вузлів Yggdrasil
В принципі, можна користуватись утилітою з командного рядка (після активації . venv/bin/activate) але у випадку піра Yggdrasil, бажано не просто здампити накопичену базу NetDB, але й відфільтрувати вузли Yggdrasil для локальних користувачів, зокрема - віддавати їх в пріоритеті. Цю задачу виконує скрипт y2r.sh.
Перед його запуском, важливо актуалізувати в ньому наступні шляхи:
netdb- донор: ймовірно, база активного вузла/var/lib/i2pd/netDboutdb- не публічна копія з відфільтрованими результатами роботиy2r.shsed -i "s/>[0-9]\{1,1000\}</>$yggaddr</" /srv/pyseeder/output/seed.html- інші можна лишити як є (тимчасові файли стандартно зберігатимуться в
/tmp/*)
Цей скрипт зручно виконувати через crontab з іншого скрипта, перед з командою pyseeder reseed
Збереження тимчасових файлів в оперативній пам'яті
Оскільки pyseeder зберігає тимчасові дампи netDb в файл, щоб не зношувати SSD, я монтую локації y2r.sh в оперативну пам'ять. Для цього в /etc/fstab додаю на вибір:
tmpfs
Цей варіант дозволяє коректно розставити права на запис і вказати потрібні опції. Також він передбачає розширення пам'яті за рахунок swap у разі перевищення фізичного простору:
tmpfs /path/to/tmp-net-db tmpfs defaults 0 0
Зміни вступають в силу після перезапуску системи, якщо потрібно в рамках поточної сесії:
mount -t tmpfs -o defaults tmpfs /path/to/tmp-net-db
- опції
defaultsможуть розширюватись, наприклад..,noatime,nosuid,nofail,size=64M
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
- для запобігання помилки парсера, важливо вказати слеш в кінці URL