mirror of
https://github.com/hackdiaz-dev/free-turn-proxy.git
synced 2026-10-12 09:41:53 +02:00
f1b047e9e5
Клиент всегда отправляет Client ID первой DTLS app-record, сервер всегда читает. Флаг -auth и URI-параметр auth удалены — рассинхрон client/server невозможен. -clients-file на сервере включает только проверку ID по allowlist clients.json. Также: - clients.json и client_config.json пишутся с правами 0o600 - исправлены все находки golangci-lint (errcheck, gosec, govet shadow) Примечание: удалён флаг -auth и URI-параметр auth; Client ID теперь всегда в первой записи туннеля — старые клиенты/серверы несовместимы.
161 lines
8.2 KiB
Markdown
161 lines
8.2 KiB
Markdown
# Развёртывание сервера
|
||
|
||
Для работы сервера 24/7 его необходимо настроить как службу. У вас есть два пути: **Docker** (рекомендуется) или классический **systemd**.
|
||
|
||
> [!TIP]
|
||
> **Автоматическая установка**
|
||
> Проще всего развернуть сервер с помощью интерактивного скрипта (выполнит установку Docker/systemd, настройку файрвола и обфускации):
|
||
> ```bash
|
||
> curl -fsSL https://raw.githubusercontent.com/samosvalishe/free-turn-proxy/master/scripts/install-server.sh -o install-server.sh
|
||
> sudo bash install-server.sh
|
||
> ```
|
||
> Скрипт идемпотентен: **повторный запуск** обнаружит существующую установку и предложит меню — *обновить версию* (конфиг и ключ сохраняются), *переконфигурировать* или *удалить*. При установке можно выбрать конкретную версию релиза или `latest`.
|
||
>
|
||
> Если вы хотите всё настроить руками — следуйте инструкциям ниже.
|
||
|
||
---
|
||
|
||
## Подготовка: Ключ обфускации
|
||
|
||
Если вы настраиваете всё вручную, сгенерируйте общий 64-символьный hex-ключ. Он должен совпадать на сервере и клиенте:
|
||
|
||
```bash
|
||
openssl rand -hex 32
|
||
```
|
||
*Скопируйте ключ — далее в примерах он обозначен как `<ВАШ_КЛЮЧ>`.*
|
||
|
||
---
|
||
|
||
## Способ 1: Docker Compose (Рекомендуется)
|
||
|
||
1. Установите Docker, если его еще нет:
|
||
```bash
|
||
curl -fsSL https://get.docker.com -o get-docker.sh && sudo sh get-docker.sh
|
||
```
|
||
|
||
2. Создайте директорию проекта и файл `docker-compose.yml`:
|
||
```bash
|
||
mkdir -p /opt/free-turn-proxy && cd /opt/free-turn-proxy
|
||
nano docker-compose.yml
|
||
```
|
||
|
||
3. Вставьте конфиг (замените порты и `<ВАШ_КЛЮЧ>` на свои):
|
||
```yaml
|
||
services:
|
||
free-turn-proxy:
|
||
image: ghcr.io/samosvalishe/free-turn-proxy:latest
|
||
container_name: free-turn-proxy
|
||
network_mode: "host" # Важно для прямого доступа к локальному WireGuard (127.0.0.1:51820)
|
||
restart: unless-stopped
|
||
environment:
|
||
- CONNECT_ADDR=127.0.0.1:51820 # Порт ВАШЕГО VPN (WG/AmneziaWG/Xray)
|
||
- LISTEN_ADDR=0.0.0.0:56000 # Внешний порт, к которому будет подключаться клиент
|
||
- MODE=udp # udp для WG/Amnezia, tcp для Xray/VLESS
|
||
- OBF_PROFILE=rtpopus # Обязательная маскировка
|
||
- OBF_KEY=<ВАШ_КЛЮЧ> # Ваш сгенерированный 64-hex ключ
|
||
# Раскомментируйте ниже, чтобы включить авторизацию по Client ID
|
||
# - CLIENTS_FILE=/opt/free-turn-proxy/clients.json
|
||
# volumes:
|
||
# - /opt/free-turn-proxy/clients.json:/opt/free-turn-proxy/clients.json
|
||
```
|
||
|
||
4. Запустите контейнер:
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
*Посмотреть логи: `docker compose logs -f`*
|
||
|
||
---
|
||
|
||
## Способ 2: systemd (Без Docker)
|
||
|
||
1. Скачайте бинарник в `/opt/free-turn-proxy`:
|
||
```bash
|
||
sudo mkdir -p /opt/free-turn-proxy
|
||
sudo curl -L -o /opt/free-turn-proxy/server https://github.com/samosvalishe/free-turn-proxy/releases/latest/download/server-linux-amd64
|
||
sudo chmod +x /opt/free-turn-proxy/server
|
||
```
|
||
*(Для ARM-сервера замените `-amd64` на `-arm64`)*
|
||
|
||
2. Создайте файл службы:
|
||
```bash
|
||
sudo nano /etc/systemd/system/free-turn-proxy.service
|
||
```
|
||
|
||
3. Вставьте конфиг (замените порты и `<ВАШ_КЛЮЧ>` на свои):
|
||
```ini
|
||
[Unit]
|
||
Description=Free TURN Proxy Server
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
# Укажите ваши порты и ключ обфускации.
|
||
# Для авторизации по Client ID добавьте: -clients-file /opt/free-turn-proxy/clients.json
|
||
ExecStart=/opt/free-turn-proxy/server -listen 0.0.0.0:56000 -connect 127.0.0.1:51820 -obf-profile rtpopus -obf-key <ВАШ_КЛЮЧ>
|
||
Restart=always
|
||
RestartSec=5
|
||
User=nobody
|
||
Group=nogroup
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
*(Примечание: `User=nobody` не может биндить порты < 1024 — используйте внешний порт > 1024)*
|
||
|
||
4. Запустите службу и добавьте в автозагрузку:
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now free-turn-proxy.service
|
||
```
|
||
*Статус: `sudo systemctl status free-turn-proxy.service`*
|
||
|
||
---
|
||
|
||
## Настройка Файрвола
|
||
|
||
Откройте внешний порт. Сервер слушает по **UDP** (DTLS-over-UDP), даже если вы используете `MODE=tcp` для Xray:
|
||
|
||
```bash
|
||
# Для UFW (Ubuntu/Debian)
|
||
sudo ufw allow 56000/udp
|
||
|
||
# Либо через iptables напрямую
|
||
sudo iptables -I INPUT -p udp --dport 56000 -j ACCEPT
|
||
sudo netfilter-persistent save # если установлен
|
||
```
|
||
|
||
---
|
||
|
||
## Авторизация по Client ID (Опционально)
|
||
|
||
По умолчанию любой клиент с верным `-obf-key` может релеить трафик. Чтобы ограничить доступ конкретным списком клиентов, включите авторизацию.
|
||
|
||
1. Создайте пустой список на сервере:
|
||
```bash
|
||
echo "[]" | sudo tee /opt/free-turn-proxy/clients.json
|
||
```
|
||
2. Включите авторизацию:
|
||
- **В Docker:** раскомментируйте переменные `CLIENTS_FILE` и `volumes` в `docker-compose.yml`, затем выполните `docker compose up -d`.
|
||
- **В systemd:** добавьте флаг `-clients-file /opt/free-turn-proxy/clients.json` в `ExecStart`, затем `systemctl daemon-reload && systemctl restart free-turn-proxy`.
|
||
3. Управляйте клиентами (см. раздел [Управление Client ID в flags.md](flags.md#управление-client-id-команды-сервера)).
|
||
4. На клиенте задайте `-client-id <id>` (либо используйте автогенерируемый) и добавьте этот ID в `clients.json` на сервере. Клиент отправляет ID автоматически.
|
||
|
||
---
|
||
|
||
## Справка: Переменные окружения для Docker
|
||
|
||
Если вы запускаете через голый `docker run`, вам пригодятся эти переменные (аналогичны флагам бинарника):
|
||
|
||
| Переменная | По умолчанию | Описание |
|
||
| --- | --- | --- |
|
||
| `CONNECT_ADDR` | **обязательна** | IP и порт вашего VPN (бэкенда) |
|
||
| `LISTEN_ADDR` | `0.0.0.0:56000` | Внешний адрес прослушивания |
|
||
| `MODE` | `udp` | Режим туннеля: `udp` (для WG/Amnezia) \| `tcp` (для Xray/VLESS) |
|
||
| `OBF_PROFILE` | `none` | Значение `-obf-profile`: `none` \| `rtpopus` |
|
||
| `OBF_KEY` | пусто | Значение `-obf-key` (обязателен при `OBF_PROFILE != none`) |
|
||
| `CLIENTS_FILE`| пусто | Путь к JSON-файлу (`/opt/free-turn-proxy/clients.json`) для авторизации |
|
||
| `DEBUG` | `false` | Включает debug-логи (`true` / `false`) |
|
||
|
||
> **Внимание при Bridge Mode:** Если вы уберете `network_mode: "host"` и пробросите порты через `-p 56000:56000/udp`, то `CONNECT_ADDR=127.0.0.1:51820` будет указывать **внутрь** контейнера Docker. В таком случае прокси не найдет ваш WireGuard. Используйте IP хоста в `CONNECT_ADDR` или оставляйте `network_mode: "host"`.
|