Skip to content

Instantly share code, notes, and snippets.

@swrneko
Last active April 29, 2026 04:09
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: Ссылки на клиенты

@swrneko
Copy link
Copy Markdown
Author

swrneko commented Apr 9, 2026

Как для MAC OS поднять, есть информация ?

думаю можно почитать официальную документацию. ссылка в описании под видео

@swrneko
Copy link
Copy Markdown
Author

swrneko commented Apr 9, 2026

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

хорошо, подумаю

@swrneko
Copy link
Copy Markdown
Author

swrneko commented Apr 9, 2026

к v2rayNG можно подключить?

можно попробовать

@colorprint
Copy link
Copy Markdown

А в Nekobox как добавлять?

@swrneko
Copy link
Copy Markdown
Author

swrneko commented Apr 9, 2026

А в Nekobox как добавлять?

в видео всё есть

@vvyce
Copy link
Copy Markdown

vvyce commented Apr 10, 2026

на ios можно как-то поставить?

@swrneko
Copy link
Copy Markdown
Author

swrneko commented Apr 10, 2026

на ios можно как-то поставить?

честно хз, не пробовал. но вроде как есть hiddify и слышал что в нём есть поддержка этого протокола. но это не точно.

@FapToBblu232
Copy link
Copy Markdown

на ios можно как-то поставить?

Есть приложуха "Fugu" прям в сторе, там есть поддержка naive

@44snarky
Copy link
Copy Markdown

Сейчас пробую и постоянно утыкаюсь в SSL_ERROR_SYSCALL — что-то обрывается внутри самого NaiveProxy или на этапе его общения с Caddy, хотя http.handlers.forward_proxy в порядке вроде. Ubuntu24.

@44snarky
Copy link
Copy Markdown

44snarky commented Apr 12, 2026

Сейчас пробую и постоянно утыкаюсь в SSL_ERROR_SYSCALL

Разобрался. Caddy упирается в то, что хочет заграбастать весь 443, хоть тресни, никаких компромиссов и гибкости. Сертификаты можно и свои, но 443 отдай, теперь чешу репу как с прокси протоколом пробрасывать остальное хозяйство. Попутно потестил ещё пару клиентов на Андроиде — Exclave и Husi, вполне пригодные и миленькие.

@Demmarch
Copy link
Copy Markdown

Возможные проблемы

[0412/185836.440887:ERROR:net/socket/ssl_client_socket_impl.cc:924] handshake failed; returned -1, SSL error code 1, net_error -100
[0412/185836.441302:ERROR:net/socket/ssl_client_socket_impl.cc:924] handshake failed; returned -1, SSL error code 1, net_error -100
[0412/185836.442044:ERROR:net/socket/ssl_client_socket_impl.cc:924] handshake failed; returned -1, SSL error code 1, net_error -100
[0412/185836.442877:ERROR:net/socket/ssl_client_socket_impl.cc:924] handshake failed; returned -1, SSL error code 1, net_error -100
Эти логи отдаёт naiveproxy на клиенте (твоем ПК)

Решение

Первое - проверить конфиги и факт того, что вы добавили айпи сервера в конфигурации домена (A-запись)
После проверки, надо понять, что вы может быть дурачком как я, который 2 раза запустил caddy start --config /etc/caddy/Caddyfile (caddy тут кста молодец, вообще не сообщает о том, что ты его второй раз запустил при уже запущенном процессе)
Мне помогло следующее:
На сервере:

systemctl stop caddy
ps aux | grep caddy
kill <все процессы caddy которые вы нашли>
systemctl start caddy

@demin-alexey
Copy link
Copy Markdown

Спасибо за гайд, полет нормальный. Но на ios не смог завести. Fugu2, v2ray, sing-box, hiddify -хотя и заявлена поддержка naive, не работает. Кто знает как завести на ios?

@maksmqks
Copy link
Copy Markdown

Спасибо за гайд, полет нормальный. Но на ios не смог завести. Fugu2, v2ray, sing-box, hiddify -хотя и заявлена поддержка naive, не работает. Кто знает как завести на ios?

Karing на ios работает с NaiveProxy

@swrneko
Copy link
Copy Markdown
Author

swrneko commented Apr 13, 2026 via email

@MaxxMartinn
Copy link
Copy Markdown

Для тех кто ищет на IOS и MacOS - karing (https://github.com/KaringX/karing). Создаете файл на маке naive-karing.json. Его же можно использовать и для ios karing.
 02 43 44

@44snarky
Copy link
Copy Markdown

чешу репу как с прокси протоколом пробрасывать остальное хозяйство

Даже не пытался развязывать войну за сокет с Layer4, пробросил обычные сайты Nginx через tls_insecure_skip_verify просто изменив порт в конфигах, а вот от Reality на 3x-ui пришлось отказаться в той моей конструкции, когда фронтом стоял Nginx со stream-развязкой по SNI — в нынешней конфигурации такой фокус не проходит. Но Caddy хоть и строптивая, но сообразительная — сама отказалась от zerossl, которая не даёт русским, сертификаты все автоматом от Let's Encrypt. С нестандартными случаями пришлось повозиться, но тоже решаемо.

@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: ссылка на ветку.

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

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