Guide 02 — Network

NaïveProxy Guide

NaïveProxy прячет трафик внутри обычного HTTPS к вашему домену. Собираем Caddy с forwardproxy, поднимаем systemd-сервис и подключаем клиент.

Published
Platform
Linux amd64
Level
Advanced
Read
9 min

Нужен домен, направленный на IP сервера, и открытые порты 80 и 443 — их открывает гайд по настройке VPS. Дальше всё выполняется от root.

Установка Go

Скрипт берёт последнюю версию Go, распаковывает её в /usr/local и прописывает путь в ~/.bashrc. Сборка Caddy идёт через go install, поэтому Go нужен до неё.

Bash
LATEST_GO=$(curl -sSL "https://go.dev/dl/?mode=json" | grep -o '"version": "go[^"]*"' | head -n 1 | cut -d '"' -f 4) && \
echo "Качаем $LATEST_GO..." && \
curl -sSLO "https://go.dev/dl/${LATEST_GO}.linux-amd64.tar.gz" && \
rm -rf /usr/local/go && \
tar -C /usr/local -xzf "${LATEST_GO}.linux-amd64.tar.gz" && \
rm -f "${LATEST_GO}.linux-amd64.tar.gz" && \
export PATH=$PATH:/usr/local/go/bin && \
grep -qxF 'export PATH=$PATH:/usr/local/go/bin' ~/.bashrc || echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc && \
go version

Сборка сервера и конфигурация

Ставим xcaddy и собираем Caddy с naive-форком forwardproxy:

Bash
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy=github.com/klzgrad/forwardproxy@naive

Создаём каталог для конфига и открываем его в редакторе:

Bash
mkdir -p /etc/caddy
nano -I /etc/caddy/Caddyfile

Конфиг для своего сайта

Caddy терминирует TLS, проксирует через forward_proxy и раздаёт статику из /var/www/example.com/html.

Caddyfile
{
  http_port 80
  https_port 443
  order forward_proxy before file_server
}

:443, example.com {
  tls my@email.com

  forward_proxy {
    basic_auth ВАШ_ЛОГИН ВАШ_ПАРОЛЬ
    hide_ip
    hide_via
    probe_resistance
  }

  file_server {
    root /var/www/example.com/html
  }
}
Перед сохранением

Замените example.com, my@email.com и логин с паролем на свои. Сохранить: Ctrl + O → Enter → Ctrl + X.

Конфиг для стороннего сайта

Если своего контента нет, reverse_proxy отдаёт запросы на чужой сайт — здесь yastatic.net. Заголовки Host подменяются, чтобы upstream принял запрос.

Caddyfile
{
  http_port 80
  https_port 443
  order forward_proxy before reverse_proxy
}

:443, example.com {
  tls my@email.com

  forward_proxy {
    basic_auth ВАШ_ЛОГИН ВАШ_ПАРОЛЬ
    hide_ip
    hide_via
    probe_resistance
  }

  reverse_proxy https://yastatic.net {
    header_up Host {upstream_hostport}
    header_up X-Forwarded-Host {host}
  }
}

Перемещаем собранный бинарник в системный каталог и делаем исполняемым:

Bash
chmod +x caddy
mv caddy /usr/bin/

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

Bash
nano /etc/systemd/system/caddy.service

Содержимое unit-файла:

systemd
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
User=root
Group=root
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

Сохраняем файл и включаем автозапуск:

Bash
systemctl daemon-reload
systemctl enable --now caddy

Запуск и проверка

Сервис уже запущен через enable --now. Смотрим статус:

Bash
systemctl status caddy
Если не стартует

Смотрите логи: journalctl -u caddy -f. Чаще всего дело в занятом порту, неверном домене или опечатке в Caddyfile.

Настройка клиента

Клиенты по платформам

Поставьте клиент с поддержкой NaïveProxy под свою ОС:

Параметры подключения

Добавьте подключение с типом Naive и укажите данные из конфига:

Домен
example.com
Порт
443
Логин
ВАШ_ЛОГИН
Пароль
ВАШ_ПАРОЛЬ

Ссылка для импорта

Проще всего добавить подключение ссылкой — клиент разберёт её сам:

Link
naive+https://ВАШ_ЛОГИН:ВАШ_ПАРОЛЬ@example.com:443#Naive