NaïveProxy: установка полной каскадной цепочки

Материал из wolfram
Версия от 19:53, 24 апреля 2026; Владимир (обсуждение | вклад) (Новая страница: « = NaïveProxy: установка полной каскадной цепочки = Данный гайд описывает пошаговое развёртывание каскадного прокси-сервера на базе протокола NaïveProxy. Трафик проходит полную цепочку:<pre> Устройства → OpenWrt роутер (naive) → RU сервер (Caddy + naive) → EU сервер (Caddy) → WARP →...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

NaïveProxy: установка полной каскадной цепочки

Данный гайд описывает пошаговое развёртывание каскадного прокси-сервера на базе протокола NaïveProxy. Трафик проходит полную цепочку:

Устройства → OpenWrt роутер (naive) → RU сервер (Caddy + naive) → EU сервер (Caddy) → WARP → Интернет

На серверах предполагается, что 3x-ui уже установлен и работает.

Предварительные требования

Инфраструктура

Компонент Требования
EU сервер Ubuntu 24.04, публичный IP, домен с A-записью → IP сервера
RU сервер Ubuntu 24.04, публичный IP, домен с A-записью → IP сервера
OpenWrt роутер OpenWrt 22.03+, архитектура aarch64_cortex-a53 или другая
Порт 80 и 443 Должны быть свободны на обоих серверах (3x-ui не занимает эти порты)

DNS-записи (создать до начала)

Запись Тип Значение
your-naive-ru-domain.example.com A IP RU сервера
your-naive-eu-domain.example.com A IP EU сервера

Используемые заглушки

В данном руководстве применяются следующие заглушки. Замени их реальными значениями:

Заглушка Описание
YOUR_RU_SERVER_IP Публичный IP RU сервера
YOUR_EU_SERVER_IP Публичный IP EU сервера
your-naive-ru-domain.example.com Домен для RU сервера (Caddy)
your-naive-eu-domain.example.com Домен для EU сервера (Caddy)
YOUR_EMAIL@example.com Email для Let's Encrypt (уведомления об истечении сертификата)
RU_PROXY_USER Логин пользователя для RU Caddy
RU_PROXY_PASSWORD Пароль пользователя для RU Caddy
EU_PROXY_USER Логин пользователя для EU Caddy
EU_PROXY_PASSWORD Пароль пользователя для EU Caddy

Часть 1: Настройка EU сервера (Exit Node)

Цель: развернуть Caddy с плагином forwardproxy (NaïveProxy) в Docker. Caddy будет принимать зашифрованные соединения от RU сервера и выпускать трафик через WARP.

1.1 Установка Docker

Выполни на EU сервере:

# Обновить пакеты
apt-get update && apt-get upgrade -y

# Установить зависимости
apt-get install -y ca-certificates curl gnupg lsb-release

# Добавить GPG-ключ Docker
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# Добавить репозиторий
echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  > /etc/apt/sources.list.d/docker.list

# Установить Docker
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Проверить
docker --version
docker compose version

Ожидаемый вывод:

Docker version 27.x.x, build ...
Docker Compose version v2.x.x

1.2 Создание структуры каталогов

mkdir -p /opt/caddy-naive/www
cd /opt/caddy-naive

1.3 Создание Dockerfile

Caddy собирается с нестандартным плагином forwardproxy (форк klzgrad/forwardproxy@naive). Используется Go 1.25+ — обязательное требование для текущей версии Caddy.

cat > /opt/caddy-naive/Dockerfile << 'EOF'
FROM golang:1.25-alpine AS builder
RUN apk add --no-cache git
RUN go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
RUN xcaddy build \
    --with github.com/caddyserver/forwardproxy=github.com/klzgrad/forwardproxy@naive

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /go/caddy /usr/local/bin/caddy
EXPOSE 80 443
CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
EOF
Почему Go 1.25-alpine?
Текущая версия Caddy требует Go >= 1.25. Системный Go в Ubuntu 24.04 — версия 1.22, которая не подходит. Поэтому сборка происходит внутри Docker-контейнера с нужной версией.

1.4 Создание docker-compose.yml

cat > /opt/caddy-naive/docker-compose.yml << 'EOF'
services:
  caddy-naive:
    build: .
    container_name: caddy-naive
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./www:/var/www/html:ro
      - caddy_data:/data
      - caddy_logs:/var/log/caddy

volumes:
  caddy_data:
  caddy_logs:
EOF
Почему network_mode
host?
Контейнер использует сетевой стек хоста напрямую. Это необходимо чтобы:
  • Caddy получал реальные клиентские IP для корректной работы probe_resistance
  • Контейнер мог обращаться к 127.0.0.1:24363 (Xray inbound WARP) — локальному сервису хоста

1.5 Создание заглушки для probe_resistance

cat > /opt/caddy-naive/www/index.html << 'EOF'
<!DOCTYPE html>
<html><head><title>Welcome</title></head>
<body><h1>Welcome</h1><p>Nothing to see here.</p></body>
</html>
EOF
Зачем это нужно?
Функция probe_resistance в Caddy скрывает факт наличия прокси.
При обращении без авторизации сервер возвращает эту обычную HTML-страницу вместо ответа прокси.
Это защищает от автоматических сканеров и активных проверок (ТСПУ, DPI).

1.6 Создание Caddyfile

cat > /opt/caddy-naive/Caddyfile << 'EOF'
{
  order forward_proxy before file_server
}

:443, your-naive-eu-domain.example.com {
  tls YOUR_EMAIL@example.com
  forward_proxy {
    basic_auth EU_PROXY_USER EU_PROXY_PASSWORD
    upstream socks5://127.0.0.1:24363
    hide_ip
    hide_via
    probe_resistance
  }
  file_server {
    root /var/www/html
  }
}
EOF
Важные нюансы синтаксиса
* :443, your-naive-eu-domain.example.com — запятая и пробел обязательны. Именно такой синтаксис активирует HTTP/2 для CONNECT-туннелей, без которого NaïveProxy не работает
* upstream socks5://127.0.0.1:24363 — перенаправляет исходящий трафик в Xray inbound (WARP). Если WARP ещё не настроен, эту строку можно убрать — трафик пойдёт напрямую в интернет
* probe_resistance — без параметра означает ответ HTML-заглушкой на неавторизованные запросы

1.7 Настройка Xray inbound для WARP (в 3x-ui)

Данный шаг необходим чтобы выходящий трафик от Caddy уходил через Cloudflare WARP, а не напрямую в интернет.

В панели 3x-ui на EU сервере:

  1. Перейди в раздел "Подключения" → "Создать подключение"
  2. Заполни параметры:
    • Протокол: mixed
    • Мониторинг IP: 127.0.0.1
    • IP: 127.0.0.1
    • Порт: 24363 (или любой свободный)
    • Пароль: выключен
    • UDP: включён
    • Примечание: naive-Caddy
  3. Сохрани подключение

Создать routing rule (Xray настройки → Маршрутизация):

  1. Добавь правило: inbound tag naive-Caddy → outbound WARP
  2. Это направит весь трафик от Caddy через Cloudflare WARP
Проверка WARP inbound
curl -s -x socks5h://127.0.0.1:24363 https://ifconfig.me
# Должен вернуть IP из диапазона Cloudflare: 104.x.x.x или 162.159.x.x

1.8 Сборка и запуск

cd /opt/caddy-naive

# Сборка образа (занимает 3-5 минут — компилируется Go)
docker compose build

# Запуск в фоне
docker compose up -d

# Наблюдение за логами (получение сертификата занимает ~30 секунд)
docker compose logs -f

Ожидаемый вывод в логах:

...
{"level":"info","msg":"certificate obtained successfully","identifier":"your-naive-eu-domain.example.com"}
...

1.9 Проверка EU сервера

# Проверка probe_resistance — должна вернуть HTML страницу (не ошибку прокси)
curl -sv https://your-naive-eu-domain.example.com 2>&1 | grep -E "< HTTP|title"

# Проверка прокси-функциональности через SOCKS5 inbound
curl -s -x socks5h://127.0.0.1:24363 https://ifconfig.me

Часть 2: Настройка RU сервера (Entry Node)

Цель: на RU сервере поднять два компонента:

  1. Caddy (Docker) — принимает соединения от клиентов (роутеров), пробрасывает через локальный naive daemon
  2. naive daemon (systemd) — клиент, который соединяется с EU Caddy по протоколу NaïveProxy

2.1 Установка Docker

Те же команды, что и для EU сервера:

apt-get update && apt-get upgrade -y
apt-get install -y ca-certificates curl gnupg lsb-release

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.asc] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  > /etc/apt/sources.list.d/docker.list

apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

docker --version && docker compose version

2.2 Структура каталогов и файлы Docker

mkdir -p /opt/caddy-naive/www
cd /opt/caddy-naive

Dockerfile идентичен EU серверу:

cat > /opt/caddy-naive/Dockerfile << 'EOF'
FROM golang:1.25-alpine AS builder
RUN apk add --no-cache git
RUN go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
RUN xcaddy build \
    --with github.com/caddyserver/forwardproxy=github.com/klzgrad/forwardproxy@naive

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /go/caddy /usr/local/bin/caddy
EXPOSE 80 443
CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
EOF
cat > /opt/caddy-naive/docker-compose.yml << 'EOF'
services:
  caddy-naive:
    build: .
    container_name: caddy-naive
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./www:/var/www/html:ro
      - caddy_data:/data
      - caddy_logs:/var/log/caddy

volumes:
  caddy_data:
  caddy_logs:
EOF
cat > /opt/caddy-naive/www/index.html << 'EOF'
<!DOCTYPE html>
<html><head><title>Welcome</title></head>
<body><h1>Welcome</h1><p>Nothing to see here.</p></body>
</html>
EOF

2.3 Создание Caddyfile RU сервера

Ключевое отличие от EU: директива upstream socks5://127.0.0.1:10808, которая перенаправляет входящие CONNECT-запросы в локальный naive daemon.

cat > /opt/caddy-naive/Caddyfile << 'EOF'
{
  order forward_proxy before file_server
}

:443, your-naive-ru-domain.example.com {
  tls YOUR_EMAIL@example.com
  forward_proxy {
    basic_auth RU_PROXY_USER RU_PROXY_PASSWORD
    upstream socks5://127.0.0.1:10808
    hide_ip
    hide_via
    probe_resistance
  }
  file_server {
    root /var/www/html
  }
}
EOF
Почему upstream socks5, а не https?
Вариант upstream https://EU_CADDY не работает в данной схеме — Caddy при таком подходе "протекает" заголовки HTTP-ответа в TLS-туннель, что ломает рукопожатие. Правильное решение — цепочка через SOCKS5 к бинарнику naive, который уже корректно реализует протокол NaïveProxy.

2.4 Сборка и запуск Caddy

cd /opt/caddy-naive
docker compose build
docker compose up -d
docker compose logs -f

Ожидаемый вывод:

{"level":"info","msg":"certificate obtained successfully","identifier":"your-naive-ru-domain.example.com"}

2.5 Установка naive daemon (клиент для EU)

2.5.1 Определение архитектуры сервера

uname -m
# x86_64 → нужен пакет для linux-x86_64-static

2.5.2 Скачивание бинарника naive

Перейди на страницу релизов: https://github.com/klzgrad/naiveproxy/releases

Найди архив для своей архитектуры. Для Ubuntu x86_64:

naiveproxy-vXXX-linux-x86_64.tar.xz
# Скачать (замени URL на актуальный из Releases)
cd /tmp
wget https://github.com/klzgrad/naiveproxy/releases/download/vXXX/naiveproxy-vXXX-linux-x86_64.tar.xz

# Распаковать (xzcat нужен если tar не поддерживает .xz напрямую)
tar -xf naiveproxy-vXXX-linux-x86_64.tar.xz
# или
xzcat naiveproxy-vXXX-linux-x86_64.tar.xz | tar -xf -

# Установить бинарник
cp naiveproxy-vXXX-linux-x86_64/naive /usr/bin/naive
chmod +x /usr/bin/naive

# Проверить
naive --version

2.5.3 Создание конфигурации naive daemon

mkdir -p /etc/naive

cat > /etc/naive/config.json << 'EOF'
{
  "listen": "socks://127.0.0.1:10808",
  "proxy": "https://EU_PROXY_USER:EU_PROXY_PASSWORD@your-naive-eu-domain.example.com",
  "log": ""
}
EOF
Что происходит
  • listen — naive слушает SOCKS5 на localhost:10808 (именно сюда смотрит upstream в Caddyfile RU)
  • proxy — подключается к EU Caddy по протоколу NaïveProxy (HTTP/2 CONNECT over TLS, трафик неотличим от обычного Chrome HTTPS)

2.5.4 Создание systemd-сервиса

cat > /etc/systemd/system/naive.service << 'EOF'
[Unit]
Description=NaïveProxy client daemon
After=network.target

[Service]
ExecStart=/usr/bin/naive /etc/naive/config.json
Restart=always
RestartSec=5
User=nobody

[Install]
WantedBy=multi-user.target
EOF
# Активировать и запустить
systemctl daemon-reload
systemctl enable naive
systemctl start naive

# Проверить статус
systemctl status naive

Ожидаемый вывод:

● naive.service - NaïveProxy client daemon
     Loaded: loaded (/etc/systemd/system/naive.service; enabled)
     Active: active (running)

2.6 Проверка цепочки с RU сервера

# Тест HTTP через naive daemon → EU → WARP
curl -s -x socks5h://127.0.0.1:10808 http://ifconfig.me
# Должен вернуть IP EU сервера или Cloudflare WARP IP

# Тест HTTPS
curl -s -x socks5h://127.0.0.1:10808 https://ifconfig.me
# Должен вернуть тот же результат

Часть 3: Настройка OpenWrt роутера

Цель: запустить naive как клиент на роутере, подключить podkop для избирательной маршрутизации через RU Caddy.

3.1 Определение архитектуры роутера

uname -m
# aarch64 → нужен пакет openwrt-aarch64_cortex-a53-static
# или x86_64, mipsel, armv7l — зависит от модели роутера
# Подробнее об архитектуре
cat /etc/openwrt_release | grep ARCH

3.2 Скачивание бинарника naive для OpenWrt

На странице релизов https://github.com/klzgrad/naiveproxy/releases найди архив:

naiveproxy-vXXX-openwrt-aarch64_cortex-a53.tar.xz

(замени архитектуру на свою)

# Создать каталог
mkdir -p /etc/naive

# Скачать (замени URL)
cd /tmp
wget https://github.com/klzgrad/naiveproxy/releases/download/vXXX/naiveproxy-vXXX-openwrt-aarch64_cortex-a53.tar.xz
Важно
OpenWrt использует BusyBox tar, который не поддерживает .xz напрямую.

Используй pipe с xzcat:

# Если xz не установлен:
opkg update && opkg install xz

# Распаковать через pipe
xzcat naiveproxy-vXXX-openwrt-aarch64_cortex-a53.tar.xz | tar -xf -

# Установить бинарник
cp naiveproxy-vXXX-openwrt-aarch64_cortex-a53/naive /usr/bin/naive
chmod +x /usr/bin/naive

# Проверить
naive --version

3.3 Создание конфигурации

cat > /etc/naive/config.json << 'EOF'
{
  "listen": "socks://127.0.0.1:1080",
  "proxy": "https://RU_PROXY_USER:RU_PROXY_PASSWORD@your-naive-ru-domain.example.com",
  "log": ""
}
EOF
Чем этот конфиг отличается от конфига на RU сервере
  • Роутер подключается к RU Caddy (не к EU напрямую) — это первое звено каскада
  • Слушает на порту 1080 (стандарт для SOCKS5, podkop по умолчанию ожидает его)

3.4 Создание init-скрипта procd

cat > /etc/init.d/naive << 'EOF'
#!/bin/sh /etc/rc.common

START=95
STOP=01
USE_PROCD=1

start_service() {
    procd_open_instance
    procd_set_param command /usr/bin/naive /etc/naive/config.json
    procd_set_param respawn
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_close_instance
}
EOF

chmod +x /etc/init.d/naive
Почему START=95?
Сервис должен запускаться после сети (START=20) и других зависимостей. 95 — безопасное значение.

3.5 Запуск и автозапуск

# Включить автозапуск
/etc/init.d/naive enable

# Запустить сейчас
/etc/init.d/naive start

# Проверить статус
/etc/init.d/naive status

3.6 Проверка

# Тест подключения через наивный прокси
curl -s -x socks5h://127.0.0.1:1080 http://ifconfig.me
# Должен вернуть IP WARP или EU сервера (НЕ IP роутера или RU сервера)

3.7 Настройка podkop

В интерфейсе podkop (LuCI или CLI):

  1. Тип прокси: SOCKS5
  2. Адрес: socks5://127.0.0.1:1080
  3. Сохрани и применй настройки

После этого все устройства домашней сети, трафик которых podkop перенаправляет, будут автоматически идти через полную цепочку: Роутер → RU Caddy → EU Caddy → WARP → Интернет.

3.8 Управление сервисом на роутере

Команда Действие
/etc/init.d/naive start Запустить
/etc/init.d/naive stop Остановить
/etc/init.d/naive restart Перезапустить
/etc/init.d/naive status Статус
/etc/init.d/naive enable Добавить в автозапуск
/etc/init.d/naive disable Убрать из автозапуска

Часть 4: Управление пользователями (утилита naive-users)

На RU сервере доступна CLI-утилита для управления пользователями Caddy без ручного редактирования Caddyfile.

4.1 Установка утилиты

Скопируй файл naive-users.sh с рабочей машины на сервер:

# На рабочей машине (Windows PowerShell):
scp naive-users.sh root@YOUR_RU_SERVER_IP:/usr/local/bin/naive-users.sh

На RU сервере:

# Убрать Windows-окончания строк (CRLF → LF) если файл создан на Windows
sed -i 's/\r//' /usr/local/bin/naive-users.sh

# Сделать исполняемым
chmod +x /usr/local/bin/naive-users.sh

# Создать короткий алиас (опционально)
echo 'alias naive-users="sudo bash /usr/local/bin/naive-users.sh"' >> ~/.bashrc
source ~/.bashrc

4.2 Запуск

sudo bash /usr/local/bin/naive-users.sh
# или после создания алиаса:
naive-users

Главное меню:

╔══════════════════════════════════════╗
║   NaïveProxy User Manager (RU)       ║
║   Домен: your-naive-ru-domain...     ║
╚══════════════════════════════════════╝

  Активных клиентов: 2

  1. Список клиентов
  2. Добавить клиента
  3. Удалить клиента
  4. Показать конфиг клиента
  0. Выход

4.3 Функции утилиты

Список клиентов

Показывает нумерованный список всех basic_auth записей из Caddyfile.

=== Список клиентов ===
  1. alice
  2. bob
  3. router-home

  Всего: 3 клиент(ов)

Добавить клиента

Запрашивает имя. Пароль можно ввести вручную или нажать Enter — пароль сгенерируется автоматически (20 символов, криптостойкий). После добавления Caddy автоматически перезапускается и сразу выводится готовый config.json для клиента.

=== Добавить клиента ===
Имя пользователя: alice
Пароль (Enter = сгенерировать автоматически): [Enter]
  Сгенерирован пароль: xK9mPqR2nLvT8hQw3Yz5

Пользователь 'alice' добавлен.
Перезапуск Caddy...
Caddy перезапущен успешно.

┌─────────────────────────────────────────────┐
│  config.json для naive (ПК / роутер)        │
└─────────────────────────────────────────────┘
{
  "listen": "socks://127.0.0.1:1080",
  "proxy": "https://alice:xK9mPqR2nLvT8hQw3Yz5@your-naive-ru-domain.example.com",
  "log": ""
}

Путь на роутере OpenWrt:  /etc/naive/config.json
Путь на Windows ПК:       рядом с naive.exe
SOCKS5 адрес для podkop:  socks5://127.0.0.1:1080

Удалить клиента

Показывает список, просит указать номер, требует подтверждение (y/N), затем удаляет строку из Caddyfile и перезапускает Caddy.

Показать конфиг клиента

Выбрать существующего пользователя из списка — утилита прочитает логин и пароль из Caddyfile и выведет готовый config.json, который нужно скопировать на клиентское устройство.

4.4 Как добавить нескольких пользователей

Caddy поддерживает произвольное количество basic_auth записей. Каждый пользователь имеет уникальные логин и пароль, но все они используют одну и ту же цепочку:

RU Caddy → naive daemon → EU Caddy → WARP → Интернет
Важно
отзыв доступа происходит мгновенно — достаточно удалить пользователя через утилиту и Caddy перезапустится. Клиент получит ошибку аутентификации при следующей попытке соединения.

Часть 5: Проверка полной цепочки

5.1 Пошаговая проверка

Шаг Команда Где выполнять Ожидаемый результат
1 curl -s -x socks5h://127.0.0.1:24363 https://ifconfig.me EU сервер Cloudflare WARP IP (104.x.x.x)
2 curl -s -x socks5h://127.0.0.1:10808 https://ifconfig.me RU сервер Тот же WARP IP
3 curl -s -x socks5h://127.0.0.1:1080 https://ifconfig.me OpenWrt роутер Тот же WARP IP
4 Открыть браузер через podkop Устройство в сети IP отличается от домашнего

5.2 Проверка probe_resistance

# Запрос без авторизации — должна вернуться HTML-страница, а не ошибка прокси
curl -sv https://your-naive-ru-domain.example.com 2>&1 | grep -E "< HTTP|<title"
# Ожидается: HTTP/2 200 и <title>Welcome</title>

5.3 Просмотр логов

# Caddy (EU или RU сервер)
cd /opt/caddy-naive && docker compose logs -f

# naive daemon (RU сервер)
journalctl -u naive -f

# naive daemon (OpenWrt роутер)
logread -f | grep naive

5.4 Перезапуск компонентов

Компонент Команда
Caddy EU cd /opt/caddy-naive && docker compose restart
Caddy RU cd /opt/caddy-naive && docker compose restart
naive daemon RU systemctl restart naive
naive daemon OpenWrt /etc/init.d/naive restart

Приложение: Структура файлов

EU сервер

/opt/caddy-naive/
├── Dockerfile          ← сборка Caddy с плагином forwardproxy
├── docker-compose.yml  ← network_mode: host, монтирование томов
├── Caddyfile           ← домен, TLS, basic_auth, upstream WARP
└── www/
    └── index.html      ← заглушка для probe_resistance

RU сервер

/opt/caddy-naive/
├── Dockerfile
├── docker-compose.yml
├── Caddyfile           ← upstream socks5://127.0.0.1:10808
└── www/
    └── index.html

/usr/bin/naive                      ← бинарник naive daemon
/etc/naive/config.json              ← конфиг: listen 10808, proxy → EU Caddy
/etc/systemd/system/naive.service   ← автозапуск через systemd
/usr/local/bin/naive-users.sh       ← утилита управления пользователями

OpenWrt роутер

/usr/bin/naive              ← бинарник naive (архитектура роутера)
/etc/naive/config.json      ← конфиг: listen 1080, proxy → RU Caddy
/etc/init.d/naive           ← автозапуск через procd (START=95)

Приложение: Частые ошибки

Ошибка Причина Решение
requires go >= 1.25.0 при сборке Системный Go устарел Dockerfile уже использует golang:1.25-alpine — ошибка не возникнет
wrong version number в curl через Caddy RU Caddy использует upstream https:// вместо SOCKS5 Заменить на upstream socks5://127.0.0.1:10808
Content-Length: 0 для HTTP GET через Caddy Нормальное поведение forwardproxy для не-CONNECT запросов Не является ошибкой
tar: invalid tar magic на OpenWrt BusyBox tar не поддерживает .xz tar -xf -
$'\r': command not found в bash-скрипте Windows CRLF окончания строк Выполнить sed -i 's/\r//' /путь/к/скрипту.sh
Caddy не получает сертификат Порт 80 занят другим сервисом grep :80, освободить порт
naive daemon не подключается к EU Неверные креды или домен в config.json Проверить journalctl -u naive, перепроверить Caddyfile EU
probe_resistance возвращает ошибку прокси Отсутствует file_server блок в Caddyfile Добавить file_server { root /var/www/html }