Три прокси на одном сервере: 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. Для каждой ситуации найдётся нужный инструмент.