Настройка Tor с WebTunnel транспортом в NixOS
Аннотация#
В этой статье рассматривается создание пользовательского NixOS-модуля для настройки Tor с транспортом WebTunnel. WebTunnel — это современный плагируемый транспорт, который маскирует трафик Tor под обычное HTTPS-соединение. Мы создадим декларативную конфигурацию, которая автоматически настраивает SOCKS-прокси на локальном адресе и порту, подключается к WebTunnel-мостам и интегрируется с системным systemd.
Введение#
Tor (The Onion Router) — это свободное программное обеспечение для анонимизации трафика. Однако в некоторых сетях (корпоративных, учебных, общественных) доступ к Tor может быть ограничен из-за политик безопасности или технических ограничений. Для работы в таких условиях используются плагируемые транспорты, которые маскируют Tor-трафик под другие протоколы.
WebTunnel — это транспорт нового поколения, который:
- Маскирует трафик под обычное HTTPS-соединение
- Использует WebSocket для передачи данных
- Требует меньше ресурсов, чем предыдущие транспорты (obfs3, obfs4)
- Не требует дополнительных пакетов вроде
obfs4proxy - Отлично работает в сетях с глубоким анализом пакетов (DPI)
💡 Примечание: WebTunnel особенно полезен, когда стандартное соединение с Tor не работает по техническим причинам.
Структура модуля#
Создадим модуль в modules/core/tor/default.nix:
{
lib,
config,
pkgs,
...
}:
with lib; let
cfg = config.modules.tor;
# Build torrc lines from bridges list
bridgeLines = lib.concatMapStrings (bridge: "${bridge}\n") cfg.bridges;
in {
options.modules.tor = {
enable = lib.mkEnableOption "Enable Tor with webtunnel transport";
socksPort = lib.mkOption {
type = lib.types.port;
default = 9050;
description = "Port for SOCKS proxy";
};
socksAddress = lib.mkOption {
type = lib.types.str;
default = "127.0.0.1";
description = "Address to bind SOCKS proxy";
};
openFirewall = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether to open the Tor ports in the firewall";
};
bridges = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [];
description = "List of webtunnel bridge addresses";
};
};
config = lib.mkIf cfg.enable {
services.tor = {
enable = true;
client.enable = true;
settings = {
SocksPort = "${toString cfg.socksPort} ${cfg.socksAddress}";
ClientTransportPlugin = "webtunnel exec ${pkgs.webtunnel}/bin/client";
UseBridges = lib.mkIf (cfg.bridges != []) 1;
Bridge = lib.mkIf (cfg.bridges != []) (lib.splitString "\n" (lib.trim bridgeLines));
};
# Open firewall if requested
openFirewall = cfg.openFirewall;
};
};
}
Разбор ключевых элементов#
Опции модуля#
| Опция | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
modules.tor.enable |
boolean | false |
Включает модуль |
modules.tor.socksPort |
port | 9050 |
Порт SOCKS-прокси |
modules.tor.socksAddress |
string | "127.0.0.1" |
Адрес для прослушивания |
modules.tor.bridges |
list of strings | [] |
Список WebTunnel-мостов |
modules.tor.openFirewall |
boolean | false |
Открыть порты в фаерволе |
Настройка Tor#
services.tor.enable = true— активирует сервис Torclient.enable = true— режим клиента (не реле)settings.SocksPort— настраивает SOCKS-проксиClientTransportPlugin— указывает путь к бинарнику WebTunnelBridge— список мостов для подключения
Динамическая генерация мостов#
bridgeLines = lib.concatMapStrings (bridge: "${bridge}\n") cfg.bridges;
Эта функция преобразует список мостов в строки формата torrc:
Bridge webtunnel <IP:port> url=<wss_url>
Подключение модуля#
1. Добавьте импорт в modules/core/default.nix#
{ ... }:
{
imports = [
# ... другие модули
./tor
];
}
2. Настройте в конфигурации хоста#
В hosts/desktop/configuration.nix (или другом хосте):
{ ... }:
{
modules.tor = {
enable = true;
socksPort = 9050;
socksAddress = "127.0.0.1";
bridges = [
"webtunnel 192.0.2.3:1 url=https://bridge.example.com/abc123"
"webtunnel [2001:db8::1]:443 url=https://bridge2.example.com/xyz789"
];
};
}
Получение WebTunnel-мостов#
Мосты можно получить на официальном сайте Tor Project:
- Перейдите на https://bridges.torproject.org/
- Нажмите “Get Bridges”
- Выберите “WebTunnel” в списке транспортов
- Скопируйте строки мостов в конфигурацию
Формат строки моста:
webtunnel <IP:port> <fingerprint> url=<wss_url> ver=<version>
⚠️ Важно: Мосты могут со временем переставать работать. Периодически обновляйте их для стабильного соединения.
Использование#
После применения конфигурации:
sudo nixos-rebuild switch
Проверка статуса#
systemctl status tor
journalctl -u tor -f
Настройка приложений#
Настройте приложения на использование SOCKS-прокси:
Firefox:
- Настройки → Общие → Параметры сети → Настроить
- Выберите “Ручная настройка прокси”
- SOCKS-хост:
127.0.0.1, Порт:9050 - Выберите “SOCKS v5”
curl:
curl --socks5-hostname 127.0.0.1:9050 https://check.torproject.org
proxychains:
# /etc/proxychains.conf
socks5 127.0.0.1 9050
Отладка#
Логи Tor#
journalctl -u tor --since "10 minutes ago"
Проверка подключения к мостам#
# Проверяем, что сервис запущен
systemctl is-active tor
# Проверяем сгенерированный torrc
cat /etc/tor/torrc | grep -E "Bridge|ClientTransport"
Типичные проблемы#
| Проблема | Решение |
|---|---|
no running bridges |
Проверьте актуальность мостов |
transport not found |
Убедитесь, что пакет webtunnel доступен |
connection refused |
Проверьте socksAddress и фаервол |
bootstrap stalled |
Попробуйте другие мосты |
Заключение#
Созданный модуль предоставляет декларативный способ настройки Tor с WebTunnel-транспортом в NixOS. Преимущества подхода:
- ✅ Полностью декларативная конфигурация
- ✅ Автоматическое управление через systemd
- ✅ Лёгкое обновление мостов
- ✅ Интеграция с NixOS-модулями
- ✅ Минимальные зависимости (только
pkgs.webtunnel) - ✅ Работает в сложных сетевых условиях
Модуль готов к использованию в production-средах и легко адаптируется под конкретные требования сети.
🎯 Совет: Для максимальной приватности используйте Tor в сочетании с другими инструментами безопасности и соблюдайте цифровую гигиену.