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

Arti - це сучасна реалізація Onion-роутера мережі Tor мовою Rust:

Нижче інструкція зі встановлення та налаштування його проксі-сервера з підключенням до мережі через Yggdrasil (у якості VPN). При відповідному налаштуванні клієнтів, це дозволяє приховати факт користування мережею Tor а також підвищує конфіденційність всередині неї, адже вхідні вузли Tor бачитимуть IP адресу провайдера моста (bridge), а міст - бачитиме IPv6 мережі Yggdrasil (до якої в свою чергу, можна підключитися через інші мережі)

Збірка з вихідного коду

При першій збірці програми на Rust, потрібно встановити середовище розробки:

Встановлення останньої версії Rust в Linux

Після чого, забираємо початковий код усіх компонентів Arti та компілюємо його з Сargo:

git clone https://gitlab.torproject.org/tpo/core/arti.git
cd arti
cargo build --release
sudo install target/release/arti /usr/local/bin/arti

Конфігурація

Тут все просто. На сайті є готовий приклад файлу конфігурації з детальними коментарями до кожної опції:

Для підключення до мережі Tor засобами Yggdrasil - достатньо лише вказати потрібні мости, наприклад з цього списку:

У своїй конфігурації, я також явно вказав атрибут `enabled`, щоб використовувати для підключення тільки мости зі списку bridges:

# Bridges (for anticensorship support)
[bridges]

# Should we use configured bridges?
#     If set to false, we will ignore the configured bridges.
#     If set to "auto", we will use any bridges that are configured.
#     If set to true, bridges must be configured and will be used.
enabled = "true"

bridges = [
    "[21b:321:3243:ecb6:a4cf:289c:c0f1:d6eb]:16728 $835FFE642EFA3BB7936663D2365A15D319FB6226",
    "[21f:5234:5548:31e5:a334:854b:5752:f4fc]:9770 $6C4C89ABE4D06987AB1F51C06939410282A1BF58",
    "[224:6723:7ae0:5655:e600:51c9:4300:a2fb]:9001 $F873E91048B40656694BE94ACAB6F0D32CAF8E17",
]
Перевірити статус мостів

Віддалений сервер

З міркувань безпеки, в конфігурації сокету, можна зустріти наступне повідомлення:

# Set up the Arti program to run as a proxy.
[proxy]
# Default port to use when listening to SOCKS connections. We always
# listen on localhost.

В репозиторії можна знайти пропозиції реалізувати сповіщення з безпеки, при використанні хостів відмінних від localhost:

Але бувають ситуації, коли проксі працює на локальному роутері, що відносно безпечно: адже до нього матимуть доступ тільки пристрої локальної мережі; або на віддаленому сервері з відповідним правилом фаєрвол. Перечитавши реалізацію парсера цієї опції, вияснив, що вона таки підтримує вибіркові хости, при чому можна вказати декілька (вектором). Для цього, потрібно вказати хост і порт "рядком" з лапками, у форматі адреси сокета:

socks_listen = "xxx.xxx.xxx.xxx:9150"

Якби навіть цієї опції не було, я все одно обійшов би обмеження "без-програмним" рецептом. Наприклад, зовнішнім проксі на базі Nginx:

TCP streaming over Nginx

Порт на "зовнішньому" хості потрібно обов'язково обмежити засобами iptables, дозволивши потрібний явно (а краще - використовуючи й не стандартний порт)

ufw allow from a.a.a.a to b.b.b.b port 9150 proto tcp

Системний сервіс

Сервіс systemd я пускаю від окремого користувача, до теки якого складатиму журнали і файл конфігурації:

sudo useradd -m arti

Приклад конфігурації для Debian є в репозиторії:

Але в мене вона інша:

[Unit]
Description=System Tor Service (Arti)
After=network.target
Wants=network.target

[Service]
Type=simple

User=arti
Group=arti

ExecStart=/usr/bin/arti --config /home/arti/config.toml -l warn proxy
ExecReload=/bin/kill -HUP ${MAINPID}

KillSignal=SIGINT
LimitNOFILE=16384

NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectHome=yes
ProtectSystem=full

#ReadOnlyDirectories=/
#ReadWriteDirectories=-/var/lib/arti
#ReadWriteDirectories=-/var/log/arti

CapabilityBoundingSet=CAP_NET_BIND_SERVICE

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

[Install]
WantedBy=multi-user.target

Щоб (пере)запустити сервер:

systemctl restart arti

Авто-запуск при старті системи:

systemctl enable arti

Перевірити статус служби:

systemctl status arti

Підключення клієнтських застосунків

В клієнтах IRC, браузерах та інших застосунках - достатньо вказати (SOCKS5) хост/порт проксі-сервера Arti, стандартно:

Налаштування браузера засобами PAC

Якщо метою користування Tor є анонімізація, то для фільтрації прямих з'єднань на Інтернет зручно встановити окремий браузер, вказавши в ньому єдиний проксі. Або/і скористатись маршрутизацією PAC. Вона дозволяє гнучко налаштовувати потрібні правила для окремих URL засобами JS.

Варіант налаштування PAC у браузерах сімейства FireFox - описував на прикладі налаштувань проксі-сервера Yggstack:

Безпечний перегляд сайтів Yggdrasil з Yggstack

Таким чином, вдається уникнути ідентифікації користувача Tor (або іншого проксі) в ареалах, де використання такого може бути заборонено. Наприклад, шляхом вбудованого на сайт зображення, файлу скриптів або стилів у код на сайті.

Утім, описаний вище спосіб запобігає лише одному способу виявлення з поміж багатьох. В цьому плані, браузер Tor - є більш привабливим, адже включає з коробки й інші засоби маскування відбитків пальців: динамічний розміру екрану, шрифти, політику cookies, JS, заголовків HTTP тощо.

Ізоляція середовища

Для більш фундаментальної ізоляції застосунків від спроби зловмисником спровокувати прямий запит в Інтерент, дивіться наступні матеріали:

Ізоляція Linux від прямих Інтернет з'єднань на базі QEMU / Virtual Machine Manager з VSOCK
Обмеження вихідних з'єднань на Інтернет з ufw
Підвищення рівня приватності в застосунках Linux (не панацея але приверне увагу до очевидних проблем)

Описані вище рішення дозволяють безпечно користуватись застосунками, які від початку не розроблялись з метою приватності: більшість клієнтів BitTorrent, криптографічних гаманців, та інші, що працюють за принципом Peer-to-Peer і реалізують технології DNS та PEX.

Тестування з'єднань

Перевірити роботу роутера Arti можна запустивши його в терміналі з аргументом відлагодження:

arti --log-level debug ...

Реалізації журналів я не довіряю і додатково перевіряю трафік графічною утилітою Etherape:

apt install etherape
sudo etherape

Активні інтерфейси можна перевірити командою:

netstat -tulpn | grep arti

Посилання

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