Три прокси на одном сервере: HTTP, SOCKS5 и Shadowsocks

Published: 2026-06-03

На proxy.antonnovikov.com с одного VPS работают три прокси-протокола. Каждый решает свою задачу. Ниже — что где работает, как устроена аутентификация и как FastAPI-приложение следит за доступностью прокси.


Три протокола

HTTP proxy — tinyproxy на порту 3128

tinyproxy — минималистичный HTTP/HTTPS CONNECT-прокси. Один C-бинарник почти без настроек: из заметных только Allow (белый список IP), BasicAuth и расположение access log. Работает как systemd-сервис на хосте, вне кластера.

# /etc/tinyproxy/tinyproxy.conf
Port 3128
Listen 0.0.0.0
Timeout 600
Allow 0.0.0.0/0
BasicAuth proxyuser secretpassword
LogFile "/var/log/tinyproxy/tinyproxy.log"

Применение: настройки прокси в браузере, curl --proxy http://user:pass@host:3128, переменная ALL_PROXY.

SOCKS5 — microsocks на порту 1080

microsocks — крошечный SOCKS5-сервер, тоже на хосте. Поддерживает аутентификацию по паролю. SOCKS5 туннелирует любые TCP-соединения, не только HTTP — SSH, IMAP, кастомные приложения.

bashmicrosocks -p 1080 -u proxyuser -P secretpassword

Применение: приложения, которые не умеют работать через HTTP-прокси, но поддерживают SOCKS5; SSH с ProxyCommand; Telegram Desktop.

Shadowsocks — ss-server на порту 8388

Shadowsocks — прокси на базе SOCKS5 поверх зашифрованного потока, спроектированный так, чтобы DPI было трудно его распознать. Метод шифрования — aes-256-gcm, аутентификация — по общему паролю.

json{
  "server": "0.0.0.0",
  "server_port": 8388,
  "password": "your-secret-password",
  "method": "aes-256-gcm",
  "timeout": 300,
  "mode": "tcp_and_udp"
}

Клиенты: shadowsocks-ng (macOS), Shadowsocks for Android, sing-box, Clash.

Применение: ситуации, когда plain SOCKS5 или HTTP-трафик замедляется или блокируется DPI-фильтрацией.


Systemd-сервисы

Каждый прокси работает как systemd-сервис:

ini# /etc/systemd/system/microsocks.service
[Unit]
Description=microsocks SOCKS5 proxy
After=network.target

[Service]
ExecStart=/usr/local/bin/microsocks -p 1080 -u proxyuser -P secretpassword
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
bashsystemctl enable --now microsocks
systemctl enable --now shadowsocks-server
systemctl enable --now tinyproxy

Эндпоинты проверки состояния

В прокси-роутере есть три TCP-зонда, которые фронтенд опрашивает для отображения живых статус-бейджей:

python@router.get("/health/http")
async def health_http():
    try:
        _, writer = await asyncio.wait_for(
            asyncio.open_connection(settings.proxy_http_host, settings.proxy_http_port),
            timeout=3.0,
        )
        writer.close()
        await writer.wait_closed()
        return Response(status_code=200)
    except Exception:
        return Response(status_code=502)

Все три эндпоинта (/proxy/health/http, /proxy/health/socks5, /proxy/health/ss) открывают сырое TCP-соединение к порту и сразу закрывают. Успешное подключение → 200; любая ошибка → 502.


Статистика трафика

Systemd-коллектор следит за логами прокси и агрегирует счётчик запросов. Эндпоинт /proxy/stats возвращает данные из /var/lib/vpn-status/status.json:

python@router.get("/stats")
async def proxy_stats():
    try:
        data = json.loads(_STATUS_FILE.read_text())
        return JSONResponse(data.get("proxy", {}), headers={"Cache-Control": "no-store"})
    except Exception:
        return JSONResponse({}, headers={"Cache-Control": "no-store"})

Если файл не существует (локальная разработка), эндпоинт возвращает пустой объект вместо 500.


Учётные данные

Все три прокси требуют аутентификации. Учётные данные хранятся в .env, загружаются в Kubernetes Secret и передаются в под как переменные окружения. Класс Settings (pydantic-settings) сопоставляет их:

proxy_http_user / proxy_http_pass     → tinyproxy BasicAuth
proxy_socks5_user / proxy_socks5_pass → microsocks -u/-P
proxy_ss_pass / proxy_ss_method       → Shadowsocks config

Страница прокси отображает эти значения (по умолчанию скрытые, раскрываются по клику).


Правила файрвола

Файрвол на VPS открывает три порта только для известных IP:

bashufw allow from <my-home-ip> to any port 3128 proto tcp
ufw allow from <my-home-ip> to any port 1080 proto tcp
ufw allow from <my-home-ip> to any port 8388 proto tcp udp

Для Shadowsocks нужно proto tcp udp — он поддерживает оба протокола.


Зачем три протокола

Протокол Сложность настройки Поддержка приложений Устойчивость к DPI
HTTP proxy Встроена в браузер, тривиально Только HTTP/HTTPS Низкая
SOCKS5 Средняя Любые TCP-приложения Низкая
Shadowsocks Требует клиент TCP/UDP Высокая (зашифрован)

Три протокола на одном сервере — по цене одного VPS. Для каждой ситуации найдётся нужный инструмент.