Аннотация#

В этой статье рассматривается создание пользовательского 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#

  1. services.tor.enable = true — активирует сервис Tor
  2. client.enable = true — режим клиента (не реле)
  3. settings.SocksPort — настраивает SOCKS-прокси
  4. ClientTransportPlugin — указывает путь к бинарнику WebTunnel
  5. Bridge — список мостов для подключения

Динамическая генерация мостов#

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:

  1. Перейдите на https://bridges.torproject.org/
  2. Нажмите “Get Bridges”
  3. Выберите “WebTunnel” в списке транспортов
  4. Скопируйте строки мостов в конфигурацию

Формат строки моста:

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 в сочетании с другими инструментами безопасности и соблюдайте цифровую гигиену.

Дополнительные ресурсы#