Skip to content

Instantly share code, notes, and snippets.

@swrneko
Last active May 29, 2026 10:16
Show Gist options
  • Select an option

  • Save swrneko/09e60de4d3d8f9a551a1a2c1ab9283c5 to your computer and use it in GitHub Desktop.

Select an option

Save swrneko/09e60de4d3d8f9a551a1a2c1ab9283c5 to your computer and use it in GitHub Desktop.
Naive Proxy Guide

NaiveProxy: Ультимативный гайд по настройке (2026)

📺 Видео-версия гайда


Инструкции по установке

1. Подключаемся к серверу:

Советую обменяться ключами с сервером, чтобы потом заходить без пароля.

ssh-copy-id root@<SERVER-IP-ADDRESS>
ssh root@<SERVER-IP-ADDRESS>

2. Далее автоматически обновляем систему:

apt update -y && apt upgrade -y

3. Включаем Google BBR для повышения эффективности обмена трафиком (без этого работать будет медленно):

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

4. Ставим Go последней версии не из репозиториев Debian, так как там версия Go устаревшая:

wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile

5. Качаем исходники модифицированного Caddy с плагином forwardproxy:

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

6. Перед сборкой нужно сделать важный шаг, так как на арендованных VPS часто каталог /tmp бывает слишком мал, а все временные файлы качаются туда — мы подменим его на свой:

mkdir /root/tmp
export TMPDIR=/root/tmp
echo $TMPDIR # Должно вывести /root/tmp

7. Далее собираем Caddy:

~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/klzgrad/forwardproxy@naive

8. Создаём каталог для файла конфига Caddy:

mkdir /etc/caddy
touch /etc/caddy/Caddyfile

9. Этот шаг можно пропустить, но я рекомендую генерировать логин и пароль через openssl. Данные команды выведут 2 строки, сгенерированные в base64, их нужно будет скопировать и использовать на следующем шаге как логин и пароль:

apt install openssl -y # ставим openssl если он не стоит
openssl rand -base64 64 | tr -dc 'A-Za-z0-9' | head -c 16; echo # логин
openssl rand -base64 64 | tr -dc 'A-Za-z0-9' | head -c 16; echo # пароль

10. После вставляем конфиг в Caddyfile, но перед этим нужно поменять:

  • your-domain.com на купленный домен;
  • example@example.com на свою почту (на неё зарегистрируется сертификат);
  • user и pass на свои логин и пароль из предыдущего шага;
  • https://demo.cloudreve.org меняем на любой сайт, под который хотим маскироваться. Также он будет доступен при прямом переходе по твоему домену.
cat <<EOF > /etc/caddy/Caddyfile
:443, your-domain.com
tls example@example.com

route {
 forward_proxy {
   basic_auth user pass
   hide_ip
   hide_via
   probe_resistance
 }

 reverse_proxy https://demo.cloudreve.org {
   header_up Host {upstream_hostport}
   header_up X-Forwarded-Host {host}
 }
}
EOF

11. Перемещаем собранный бинарник Caddy в пользовательский каталог:

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

12. Создаём systemd юнит для автоматического перезапуска:

touch /etc/systemd/system/caddy.service 
cat <<EOF > /etc/systemd/system/caddy.service
[Unit]
Description=Caddy with NaiveProxy
After=network.target network-online.target
Requires=network-online.target

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

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now caddy

13. После запускаем Caddy в фоне. Он автоматически получит TLS-сертификат на указанную почту:

caddy start --config /etc/caddy/Caddyfile 

14. Далее на ПК клиента нужно будет создать файл config.json с таким конфигом и заменить:

  • user на логин, указанный в Caddyfile;
  • pass на пароль, указанный в Caddyfile;
  • demo10.cscot.buzz на домен вашего сервера (НЕ САЙТА МАСКИРОВКИ);
touch config.json
cat <<EOF > config.json
{
  "listen": "socks://127.0.0.1:20808",
  "proxy": "https://user:pass@demo10.cscot.buzz"
}
EOF

🌐 ЧАСТЬ 2: Интеграция с Cloudflare WARP (Опционально)

Нужно, если хотите скрыть IP сервера или разблокировать региональный контент.

1. Установить зависимости:

apt install -y curl gnupg lsb-release

2. Установка WARP клиента:

curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/cloudflare-client.list
apt update && apt install cloudflare-warp -y

3. Настройка режима прокси:

warp-cli registration new
warp-cli mode proxy
warp-cli connect

4. Проброс трафика в Caddy: Добавьте строку upstream socks5://127.0.0.1:40000 в ваш Caddyfile внутрь блока forward_proxy и выполните systemctl restart caddy.


💻 ЧАСТЬ 3: Ссылки на клиенты

@shvepsss-user
Copy link
Copy Markdown

Не понимаю в чем проблема. Поднял 3 VPS. На первых двух использую upstream

Caddyfile выглядит так.
{
order forward_proxy before file_server
}
:443, Мой домен {
tls моя почта
forward_proxy {
basic_auth логин пасс
hide_ip
hide_via
probe_resistance
upstream https://логин:пасс@доменкудаапстримим:443
}
file_server {
root /var/www/html
}
}

Что я делаю не так?
Узел 1 → Узел 2 (HTTPS) – ✅ работает

Узел 1 как прокси с upstream на Узел 2 – ❌ 502

@Hollydayland
Copy link
Copy Markdown

https://habr.com/ru/articles/1020080/
есть мысли на счет актуального клиента для android?
Попытался настроить karing, но через мобильную сеть на нем больше 0,5 МБ/с выжать не удалось, хотя через ту же сеть на том же конфиге nekobox выдает полную скорость

@44snarky
Copy link
Copy Markdown

есть мысли на счет актуального клиента для android?
https://github.com/xchacha20-poly1305/husi
https://github.com/dyhkwong/Exclave

@44snarky
Copy link
Copy Markdown

upstream https://логин:пасс@доменкудаапстримим:443
Узел 1 как прокси с upstream на Узел 2 – ❌ 502
А если так:
upstream naive+https://логин:пасс@доменкудаапстримим:443

@44snarky
Copy link
Copy Markdown

upstream https://логин:пасс@доменкудаапстримим:443
Узел 1 как прокси с upstream на Узел 2 – ❌ 502
А если так:
upstream naive+https://логин:пасс@доменкудаапстримим:443

Нет, он сам не понимает. Так что нужно на локалке поднимать клиента с Socks5 и коннектиться уже к нему. Такой бутерброд проксей.

@demin-alexey
Copy link
Copy Markdown

Это нормально, что голосовая связь в телеграмме не работает с Naive? При том, что все остальное работает, соединение во время звонка не устанавливается пишет: exchanging encryption keys. Спросил у ai - говорит мол так и должно быть, UDP-трафик не проходит через NaiveProxy, типо из-за этого

@44snarky
Copy link
Copy Markdown

Это нормально, что голосовая связь в телеграмме не работает с Naive? При том, что все остальное работает, соединение во время звонка не устанавливается пишет: exchanging encryption keys. Спросил у ai - говорит мол так и должно быть, UDP-трафик не проходит через NaiveProxy, типо из-за этого

Ну правильно говорит. Это прокси, а UDP — поток. Чтобы передавать, нужна отдельная инкапсуляция в TCP. Я пока не пробовал, но в теории может быть.

@44snarky
Copy link
Copy Markdown

upstream https://логин:пасс@доменкудаапстримим:443
Узел 1 как прокси с upstream на Узел 2 – ❌ 502
А если так:
upstream naive+https://логин:пасс@доменкудаапстримим:443

Нет, он сам не понимает. Так что нужно на локалке поднимать клиента с Socks5 и коннектиться уже к нему. Такой бутерброд проксей.

И опять я наврал. Стандартный модуль reverse_proxy в Caddy умеет работать с http, https, h2c, fastcgi и даже unix сокетами, но он не понимает протокол SOCKS5 как тип апстрима. Сейчас проверил, работает upstream https://user:pass@domain.tld:443

@Arrissi
Copy link
Copy Markdown

Arrissi commented Apr 21, 2026

go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
-bash: go: command not found что делать с этим

@mark20123644-rgb
Copy link
Copy Markdown

а бесплатно както можно

@DevAnlim
Copy link
Copy Markdown

DevAnlim commented Apr 24, 2026

Вот авто установщик https://github.com/DevAnlim/vpn-installer

@Ieveltyanna
Copy link
Copy Markdown

Настройка клиента NaiveProxy на Routerich (Podkop). Возможно также сработает и на другом OpenWRT роутере:
https://gist.github.com/Ieveltyanna/575ee02a5a23f11ebf9a32018d27a4cc

@Ieveltyanna
Copy link
Copy Markdown

Однострочник для установки naive proxy на VPS:
https://github.com/Ieveltyanna/naive-caddy-installer

wget -qO- https://raw.githubusercontent.com/Ieveltyanna/naive-caddy-installer/main/setup.sh | sudo bash

Требует только наличие домена. После запуска скрипта будет напечатаны QR-код и URL для подключения.

Поддерживается установка рядом с 3x-ui (если cтавили скриптом 3x-ui-pro):

wget -qO- https://raw.githubusercontent.com/Ieveltyanna/naive-caddy-installer/main/3x-ui/setup.sh | sudo bash

@M4CK4L3N
Copy link
Copy Markdown

Это нормально, что голосовая связь в телеграмме не работает с Naive? При том, что все остальное работает, соединение во время звонка не устанавливается пишет: exchanging encryption keys. Спросил у ai - говорит мол так и должно быть, UDP-трафик не проходит через NaiveProxy, типо из-за этого

В naiveproxy пока нет поддержки UDP-трафика, но я нашёл issue в репозитории автора, и там говорится, что разработка UDP уже ведётся.

Пока что максимум можно воспользоваться форком forwardproxy от @aUsernameWoW с экспериментальной реализацией UDP over TCP: ссылка на ветку.

Но я пока данный форк не тестил, поэтому насколько он хорошо работает сказать не могу.

@M4CK4L3N
Copy link
Copy Markdown

Это нормально, что голосовая связь в телеграмме не работает с Naive? При том, что все остальное работает, соединение во время звонка не устанавливается пишет: exchanging encryption keys. Спросил у ai - говорит мол так и должно быть, UDP-трафик не проходит через NaiveProxy, типо из-за этого

В naiveproxy пока нет поддержки UDP-трафика, но я нашёл issue в репозитории автора, и там говорится, что разработка UDP уже ведётся.

Пока что максимум можно воспользоваться форком forwardproxy от @aUsernameWoW с экспериментальной реализацией UDP over TCP: ссылка на ветку.

Но я пока данный форк не тестил, поэтому насколько он хорошо работает сказать не могу.

Сейчас попробовал, там нужно на сервере собрать caddy через команду:

~/go/bin/xcaddy build --with github.com/caddyserver/forwardproxy@caddy2=github.com/aUsernameWoW/forwardproxy@naive

И на клиенте в конфиге в пункте outbound указать:

    "udp_over_tcp": {
        "enabled": true,
        "version": 2
    }

Вроде все работает стабильно, но будет ли он так хорошо обходить dpi как оригинал пока не знаю.

@magabtw
Copy link
Copy Markdown

magabtw commented May 8, 2026

Для обхода белых списков Naive не требует [второй] Российский VPS? Или я что-то не так понял...

@Siberik-a
Copy link
Copy Markdown

Работал работал. И хорошо работал. Тут перед 9 мая бац и все. Толи спалился где-то, толи целыми подсетями глушат. Вот эти все покупки доменов, регистрации, может уже и через это все сливают?

@M4CK4L3N
Copy link
Copy Markdown

M4CK4L3N commented May 9, 2026

Для обхода белых списков Naive не требует [второй] Российский VPS? Или я что-то не так понял...

Для обхода белых списков поидее нужен домен который находится в белых списках непосредственно, при этом это относится к любому vpn протоколу. Поэтому желательно иметь второй relay vps сервер, например с доменом вк или яндекса или другим доменом из белого списка, который будет работать даже во время белых списков.

@M4CK4L3N
Copy link
Copy Markdown

M4CK4L3N commented May 9, 2026

Работал работал. И хорошо работал. Тут перед 9 мая бац и все. Толи спалился где-то, толи целыми подсетями глушат. Вот эти все покупки доменов, регистрации, может уже и через это все сливают?

Возможно это связано с блокировками мобильной сети в Москве в честь 9 мая.

@seriousStranger
Copy link
Copy Markdown

в 2 бинаря звпустить через это можно https://github.com/seriousStranger/rachav
просто скачать актуальную версию naive и положить рядом с бинарником rachav, он уже сам его запустит + панель + авто сертификаты

@AlgoApi
Copy link
Copy Markdown

AlgoApi commented May 20, 2026

Сделай пожалуйста поднятие этого скрипта через Dokploy - гораздо упростит запуск через докер контейнер и не понадобится вручную что-то делать на сервере. У Dokploy есть Traeffik под капотом - будет просто подключить если что домен и сразу автоматом будет стоять продление сертификата.

@agentHits получилось?

@agentHits
Copy link
Copy Markdown

Сделай пожалуйста поднятие этого скрипта через Dokploy - гораздо упростит запуск через докер контейнер и не понадобится вручную что-то делать на сервере. У Dokploy есть Traeffik под капотом - будет просто подключить если что домен и сразу автоматом будет стоять продление сертификата.

@agentHits получилось?

вот что я сделал DevAnlim/vpn-installer#1 автор не закинул PR

@kostasoft
Copy link
Copy Markdown

Спасибо за инструкцию. Я сначала делал отдельно на "классическом" Caddy, устанавливал отдельно Sing-box, и делал перенаправление (тоже по инструкции).
Сейчас снес caddy и sign-box и сделал по Вашей инструкции. Все завелось без проблем.
Но есть нюанс: стоявший параллельно nginx (который слушает только 80 порт) конфликтует с Caddy. Я временно отключил Nginx. Можно ли nginx вообще удалить использовать этот "кастомно" собранный Caddy для элементарного подключения сайтов как file_server?
Если да, то пожалуйста, скажите, что нужно дописать в конфиг Caddyfile из инструкции, чтобы, к примеру, на обращение к нему по адресу domen1.com:80 он отправил на /var/www/domen1, а по адресу domen2.com:443 он отправил на /var/www/domen2
Специально прошу помощи с учетом разных портов, и чтобы для domen1.com, Caddy не пытался получить сертификат (я его заворачиваю через Cloudflare)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment