Syncthing. Частный релей

2026-05-25 · 5 мин. для прочтения
blog computer-science

Syncthing. Частный релей.

Содержание

1 Общая информация

  • Релейный сервер (relay server) в Syncthing выполняет роль посредника при передаче данных между вашими устройствами.
  • Он нужен, когда прямое (peer-to-peer) соединение между устройствами установить невозможно.
  • Этот механизм используется для передачи файлов.
  • Если устройства не могут соединиться напрямую, они используют релей (ретранслятор) для передачи данных.
  • Релей — это резервный канал.
  • Syncthing всегда пытается установить в первую очередь прямое соединение (используя порт 22000).
  • Только если это не удаётся, он переключается на релей.
  • Поэтому в настройках клиентов мы оставляем default (прямые соединения) и добавляем адрес частного релея как дополнительный способ связи.

1.1 Работа релея

  • Пусть устройства находятся за разными межсетевыми экранами (NAT), в сетях с ограничениями или без публичных IP-адресов. Они «не видят» друг друга напрямую. В этом случае Syncthing автоматически пытается использовать релей:

  • Устройство А подключается к релейному серверу.

  • Устройство Б подключается к тому же релейному серверу.

  • Релей получает зашифрованные данные от А и перенаправляет их к Б, и наоборот.

Таким образом, релей не хранит ваши файлы и не может их расшифровать (трафик сквозным образом шифруется между устройствами). Он просто временно передаёт зашифрованный поток, решая проблему сетевой недоступности.

1.2 Когда релей необходим

  • Устройства находятся в разных локальных сетях без возможности прямой маршрутизации.
  • Отсутствует публичный IP-адрес хотя бы у одного из них.
  • Не удаётся настроить проброс портов (port forwarding) на роутере.
  • Сеть блокирует прямые входящие соединения (например, корпоративный файрвол).

1.3 Публичные и частные релеи

  • Публичные релеи — бесплатные, предоставляются сообществом.
    • Syncthing по умолчанию использует глобальный пул таких серверов.
    • Они могут быть перегружены, медленны, и их доступность не гарантируется.
  • Частный (приватный) релей — ваш собственный сервер:
    • контроль над доступом (благодаря токену);
    • стабильность и предсказуемую скорость;
    • конфиденциальность — трафик не уходит через чужие серверы;
    • независимость от состояния публичных релеев.

2 Установка и настройка сервера релея

2.1 Общая информация

  • Для создания приватного релея необходимо запустить сервер strelaysrv на машине с публичным IP-адресом, к которой будут иметь доступ все ваши устройства.

  • Порт по умолчанию

    • Сервер слушает порт 22067.
  • Настройки для приватности

    • Отключение от публичного пула
      • Ключевой параметр -pools""=, который гарантирует, что ваш релей не будет анонсирован в общем пуле.
    • Токен безопасности (опционально)
      • Параметр -token="МойСекретныйТокен" гарантирует, что подключиться к вашему релею смогут только те клиенты, которые знают этот токен.

2.2 Установка программы

  • Rocky Linux:
    • Установка репозитория EPEL

      sudo dnf install epel-release
      
    • Установка пакета

      sudo dnf install syncthing-tools
      
    • Пакет syncthing-tools содержит в себе strelaysrv и stdiscosrv (сервер обнаружения).

2.3 Межсетевой экран

  • Сервер релея должен быть доступен из интернета. Убедитесь, что порт 22067 (по умолчанию для TCP-соединений) открыт.

2.3.1 Настройка firewalld

  • Откройте порт:

    sudo firewall-cmd --permanent --add-port=22067/tcp
    sudo firewall-cmd --reload
    
  • Порт для веб-статистики (22070/tcp) можно не открывать, если сервер используется частным образом.

2.3.2 Проброс портов

  • Если сервер находится за роутером (NAT), потребуется настроить на нем проброс порта 22067 (Port Forwarding) на локальный IP-адрес сервера.

2.4 Каталоги

  • Создайте пользователя strelaysrv.
  • Создайте каталог /etc/strelaysrv для хранения ключей.
  • Ключи генерируются при первом запуске.
    sudo useradd strelaysrv
    sudo mkdir /etc/strelaysrv
    sudo chown strelaysrv /etc/strelaysrv
    sudo -u strelaysrv /usr/bin/strelaysrv -keys /etc/strelaysrv
    

2.5 Генерация токена

2.5.1 С помощью openssl

  • Генерирует 48 случайных байт и кодирует их в base64, обрезая до 48 символов:
    openssl rand -base64 48 | tr -d '\n' | cut -c1-48
    

2.5.2 С помощью pwgen

  • Флаг -s — полностью случайный, 48 — длина, 1 — одна строка:
    pwgen -s 48 1
    

2.5.3 С помощью /dev/urandom

  • Прямое чтение случайных данных с фильтрацией только разрешённых символов:
    cat /dev/urandom | tr -dc 'A-Za-z0-9' | head -c48
    

2.6 Настройка systemd-сервиса

  • Создайте файл сервиса:

    sudo touch /etc/systemd/system/strelaysrv.service
    
  • Вставьте следующее содержимое:

    [Unit]
    Description=Syncthing Relay Server
    After=network.target
    Documentation=man:strelaysrv(1)
    
    [Service]
    Restart=always
    #WorkingDirectory=/var/lib/syncthing-relaysrv
    #EnvironmentFile=/etc/default/syncthing-relaysrv
    #ExecStart=/usr/bin/strelaysrv -nat=${NAT} $RELAYSRV_OPTS
    ExecStart=/usr/bin/strelaysrv -keys=/etc/strelaysrv -status-srv="" -pools="" -token="YOUR_VERY_SECRET_TOKEN"
    
    # Hardening
    User=strelaysrv
    Group=strelaysrv
    ProtectSystem=strict
    ReadWritePaths=/etc/strelaysrv
    NoNewPrivileges=true
    PrivateTmp=true
    PrivateDevices=true
    ProtectHome=true
    SystemCallArchitectures=native
    MemoryDenyWriteExecute=true
    
    [Install]
    WantedBy=multi-user.target
    Alias=syncthing-relaysrv.service
    
    • -keys=/etc/strelaysrv : указывает серверу хранить сгенерированные ключи в этой директории.
    • -pools="" : параметр для приватности; отключает отправку данных о вашем сервере в публичные пулы серверов Syncthing.
    • -token="YOUR_VERY_SECRET_TOKEN" : (рекомендуется) устанавливает секретный пароль, без которого никто не сможет использовать ваш релей.
    • -status-srv="" : отключает публичный веб-интерфейс для просмотра статистики.
  • Запустите сервис и добавьте его в автозагрузку:

    sudo systemctl daemon-reload
    sudo systemctl enable --now strelaysrv.service
    
  • Проверьте статус и найдите адрес для подключения:

    # Проверка статуса
    sudo systemctl status strelaysrv.service
    
    # Поиск уникального адреса (URL) вашего релея в логах
    sudo journalctl -u strelaysrv.service -f
    
  • В логах вы увидите строку, которая начинается с relay://.

  • Она будет иметь вид:

    relay://<Ваш_Публичный_IP>:22067/?id=<Уникальный_ID_Сервера>&token=YOUR_VERY_SECRET_TOKEN
    
  • Скопируйте её полностью — она потребуется для клиентов.

3 Настройка клиентских устройств

3.1 Через веб-интерфейс

  • Откройте веб-интерфейс Syncthing (обычно http://127.0.0.1:8384).
  • Перейдите в “Действия” (Actions) -> “Настройки” (Settings) в правом верхнем углу.
  • Выберите вкладку “Соединение” (Connection).
  • В поле “Адреса для прослушивания протокола синхронизации” (Sync Protocol Listen Addresses) вставьте скопированный relay:// адрес после default (через запятую).
  • Ключевое слово default гарантирует, что если ваши устройства окажутся в одной локальной сети, они будут обмениваться данными напрямую, а не через релей.

3.2 Через файл конфигурации

  • Файл конфигурации config.xml.
  • Добавьте строки в узел <relayservers> в секции <options>.
    <options>
        <!-- ... другие настройки ... -->
        <listenAddress>default</listenAddress> <!-- Строка "default" для прямых подключений ОБЯЗАТЕЛЬНА -->
        <listenAddress>relay://ВАШ_IP_ИЛИ_ДОМЕН:22067/?id=УНИКАЛЬНЫЙ_ID_РЕЛЕЯ&token=ВАШ_ТОКЕН</listenAddress>
        <!-- ... другие настройки ... -->
    </options>
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Работаю профессором на кафедре теории вероятностей и кибербезопасности Российского университета дружбы народов им. Патриса Лумумбы. Научные интересы относятся к области теоретической физики и математического моделирования.