Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Гайд · Сеть

Выход сервера в интернет через внешний прокси: sing-box-клиент на VPS

Бывает наоборот: не вы ходите через сервер, а сам сервер должен выйти в интернет через выбранный вами прокси. Разбираем, как поднять на VPS прокси-клиент на sing-box и завернуть его исходящий трафик через нужный маршрут. С проверкой на живом стенде.

Сентябрь 2026Fatmetal~7 мин
Задача

Когда серверу нужен свой выход в интернет

Приложение на VPS тянет образы с Docker Hub, ставит пакеты из npm, дергает API LLM-провайдера - и упирается в то, что из вашего дата-центра эти ресурсы недоступны или тормозят. Решение - поднять на сервере прокси-клиент, который перенаправит его исходящий трафик через выбранный маршрут.

Важно с самого начала: VPS тут - клиент, а не сервер. Он не раздает VPN людям, а сам ходит наружу через апстрим-прокси по вашей подписке. Это управляемый исходящий канал для одной коробки, а не сервис для третьих лиц.

Почему не Happ, а sing-box

Happ, v2rayN, Nekoray - это приложения с окном и треем для телефона и десктопа. На headless-сервере им нечего показывать, они там просто не запускаются. Нужен тот же движок, но без интерфейса. Мы берем sing-box - один бинарь, современные протоколы (VLESS, Reality, Trojan, Shadowsocks), работает как systemd-сервис и умеет как локальный SOCKS/HTTP-прокси, так и прозрачный режим на всю машину.

sing-boxVLESSRealitySOCKS/HTTPsystemd
Шаг 1

Ставим sing-box

bash <(curl -fsSL https://sing-box.app/install.sh)

Или скачайте бинарь с релизов проекта и положите в /usr/local/bin/sing-box. Проверка: sing-box version.

Шаг 2

Конфиг: апстрим-прокси плюс локальный вход

Возьмите один узел из своей подписки (ссылка вида vless://...) и перенесите его параметры в /etc/sing-box/config.json. Локальный вход mixed слушает только 127.0.0.1 - наружу его не видно.

{
  "inbounds": [
    { "type": "mixed", "listen": "127.0.0.1", "listen_port": 2080 }
  ],
  "outbounds": [
    {
      "type": "vless",
      "tag": "proxy",
      "server": "ВАШ_ПРОКСИ_ХОСТ",
      "server_port": 443,
      "uuid": "ВАШ_UUID",
      "flow": "xtls-rprx-vision",
      "tls": {
        "enabled": true,
        "server_name": "ВАШ_SNI",
        "utls": { "enabled": true, "fingerprint": "chrome" },
        "reality": { "enabled": true, "public_key": "ВАШ_PBK", "short_id": "ВАШ_SID" }
      }
    }
  ]
}
i

Если провайдер подписки отдает формат sing-box (JSON) - берите его напрямую, руками переносить параметры не придется.

Шаг 3

systemd-сервис

# /etc/systemd/system/sing-box.service
[Unit]
Description=sing-box egress client
After=network-online.target

[Service]
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable --now sing-box
Шаг 4

Направляем трафик сервера через прокси

Локальный прокси поднят на 127.0.0.1:2080. Дальше три сценария - от точечного к сквозному.

Точечно (одна команда или сессия):

export ALL_PROXY=socks5h://127.0.0.1:2080
export HTTPS_PROXY=http://127.0.0.1:2080

Docker (чтобы образы тянулись через прокси) - частая боль в РФ:

# /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:2080"
Environment="HTTPS_PROXY=http://127.0.0.1:2080"
Environment="NO_PROXY=localhost,127.0.0.1"
systemctl daemon-reload && systemctl restart docker

Вся машина (прозрачный режим): добавьте в sing-box inbound типа tun с авто-маршрутизацией - тогда весь исходящий трафик коробки идет через прокси без правки каждого приложения. Мощно, но требует аккуратности с маршрутами (см. оговорки ниже).

Шаг 5

Проверяем

curl --proxy socks5h://127.0.0.1:2080 https://api.ipify.org ; echo

В ответ должен прийти IP апстрим-прокси, а не вашего VPS. Если так - трафик пошел через выбранный маршрут.

Факт

Проверено на стенде

Мы не пишем с потолка. Подняли два сервера в РФ-сети: один как апстрим-узел (VLESS + Reality на sing-box), второй как клиентский VPS с той же настройкой, что выше. Версия - sing-box 1.14.1.

# без прокси - сервер ходит от своего адреса
$ curl -s https://api.ipify.org
45.15.159.111

# через локальный sing-box (SOCKS) - выход уже с адреса апстрима
$ curl -s --proxy socks5h://127.0.0.1:2080 https://api.ipify.org
45.15.159.114

# то же по HTTP-прокси (этот путь использует Docker)
$ curl -s --proxy http://127.0.0.1:2080 https://api.ipify.org
45.15.159.114

Трафик клиентской коробки реально ушел через выбранный узел: адрес сменился с ...111 на ...114. Задержка через прокси - около 0,34 с, ответ 200. И SOCKS, и HTTP-вход работают из одного локального порта 2080, так что и приложения через ALL_PROXY, и Docker через HTTP_PROXY идут одним каналом.

Оговорки, которые сэкономят вам вечер

Не закольцуйте себя

Если включаете прозрачный режим на всю машину, а сеть у вас одна и IP один - оставьте исключения для SSH и панели управления, иначе рискуете отрезать себе доступ. Проще начинать с точечного проксирования (Docker, конкретные сервисы) и только потом идти в tun.

Прокси - только на localhost

listen 127.0.0.1, наружу порт не открывать. Иначе получите открытый прокси, которым воспользуется кто угодно.

Зависимость от апстрима

Ваш сервер теперь зависит от внешнего прокси: упал апстрим - встали пуллы и запросы. Для критичных сервисов держите запасной узел в подписке и Restart=on-failure. И помните: это исходящий канал вашего сервера, а не сервис для раздачи доступа третьим лицам.

Итог

Один бинарь sing-box превращает VPS в аккуратного клиента, который ходит в интернет через выбранный вами маршрут: образы тянутся, пакеты ставятся, API отвечают - без плясок с недоступными ресурсами. Happ и другие клиенты с интерфейсом остаются для ваших устройств, на сервере же работает их движок без окна. Нужен сервер под такой сценарий - поднимите его за пару минут.

Разборы и гайды по self-hosted - в Telegram-каналеНовые гайды и карточки в маркетплейсе первыми @fatmetal_channel →

Гайд Fatmetal. Проверено на живом стенде (sing-box 1.14.1), сентябрь 2026.