Radicle: обмеження витоків пірингового трафіку


Вже не вперше забуваю і повторно задовбую розробників цим питанням. Тому вирішив написати нотатку для себе та інших. Матеріал в процесі тестування, фінальний аудит трафіку ще не проводився.


Radicle, як й інші P2P платформи (за поодинокими виключеннями типу I2PSnark, опцій фільтрації мережі в i2pd чи Alfis DNS) має властивість розсилати та приймати конекти з різних мереж. Через це мене банить провайдер VPN, згідно свого DPI вважаючи, що я качаю торенти.


Отже, в Radicle (щонайменше v1.6.0-61) немає ніяких спеціальних інструментів фільтрації. Навіть якщо ви з'єднаєтесь з єдиним вузлом через Yggdrasil - ваша нода неодмінно отримає від нього "солянку" IPv6 адрес на клірнет (які той, в свою чергу, "нахапав" з інших вузлів) і спробує з'єднатись з ними на етапі `rad sync`.


В торент-клієнтах, така між-пірингова комунікація звичайно відбувається засобами PEX, який достатньо вимкнути (хоча й клієнт/бібліотека librqbit такої опції не має і там рішення полягає в так званих блок-списках Bittorrent). Тут же мені порадили користуватись засобами проксі або обмеженнями systemd.



Обмеження засобами проксі


В Radicle є декілька різновидів конфігурації проксі:

https://radicle.xyz/guides/user#configuring-radicle-in-mixed-mode


вони вказуються у файлі `~/.radicle/config.json`:


1. `node.proxy` - глобальний застосовується до всього трафіку, тому його можна використовувати у зв'язкці з наприклад privoxy, маршрутизуючи трафік згідно хосту HTTP, або sqiud засобами ACL.

2. `node.onion` - ці правила застосовуються виключно до адрес прихованих сервісів, тому нам не підходять

3. `node.i2p` - поки не реалізований, але рух в цьому напрямку відбувається (утім, дивитись пункт #2)

Прогрес інтеграції сокетів I2P


Оскільки на сервері вже є налаштована інфраструктура, для себе я використовуватиму такий віддалений варіант, бо він дозволяє не пускати Tor локально і не чекати на ініціалізацію. Для себе, ви можете налаштувати локальний проксі, виключивши з інструкцій дозволи фаєрволу для ::1/127.0.0.1.


gost


gost (Go Simple Tunnel) - це мінімалістичний але потужний інструмент проксування, який вміє не тільки різні протоколи, але й дозволяє будувати складні маршрути:

https://github.com/ginuerzh/gost


У випадку Radicle, який працює лише з SOCKS, потрібно зробити наступне:


git clone https://github.com/ginuerzh/gost.git
cd gost/cmd/gost
go build

Проксі можна запускати використовуючи файл конфігурації:

gost -C /path/to/config.json

стандартний приклад


Але я перевірив роботу на прикладі аргументів командного рядка. Конфігурація аргументів передбачає маршрутизацію на три мережі: Tor, Yggdrasil та Mycelium - останні дві йтимуть за відповідним діапазоном "напряму", через так званий `bypass`:


gost -L "socks5://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8119?bypass=0200::/7,0400::/7" \
     -F "socks5://[::1]:9150"

Для запуску системного сервісу, мною використовується наступний пресет:


#/etc/systemd/system/gost.service
[Unit]
Wants=network.target
After=network.target

[Service]
User=gost
Group=gost

Type=simple
ExecStart=/usr/local/bin/gost \
    -L "socks5://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8119?bypass=0200::/7,0400::/7" \
    -F "socks5://[::1]:9150"

StandardOutput=file:///home/gost/debug.log
StandardError=file:///home/gost/error.log

[Install]
WantedBy=multi-user.target

Окремо дозволив себе в iptables:


ufw allow from xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx \
            to 202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148 port 8119

Додавши наступні рядки до `~/.radicle/config.json` і перезавантаживши клієнтський вузол, я можу з'єднуватись з усіма вузлами мереж, доступних на сервері:


"node": {
    "proxy": "http://[202:68d0:f0d5:b88d:1d1a:555e:2f6b:3148]:8119"
}

Обмеження засобами systemd


IP Accounting and Access Lists with systemd


Обмеження засобами контейнеризації та віртуалізації


Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK


Дивіться також


Обмеження вихідних з'єднань на Інтернет з ufw

Встановлення Onion-роутера Arti з підключенням до мережі Tor через Yggdrasil



/uk/