Лёгкий Proxy

Лёгкий Proxy

Иногда прокси нужен быстро:
для тестов, CI/CD, подключения сервисов или временной инфраструктуры.
Docker Compose — самый простой и чистый способ сделать это за пару минут.

Ниже — 3 варианта: SOCKS5, **HTTP-proxy, **HA-proxy**. Можно поднимать по отдельности или оба сразу.

Вариант 1: SOCKS5-proxy за 1 минуту

SOCKS5 — самый универсальный тип прокси. Работает практически с любым трафиком.

docker-compose.yml

services:
  socks5-proxy:
    image: serjs/go-socks5-proxy:latest
    container_name: socks5-proxy
    restart: unless-stopped
    ports:
      - "1080:1080"
    environment:
      # REQUIRE_AUTH=false — если нужна прокси без авторизации
      - REQUIRE_AUTH=true
      - PROXY_USER=user
      - PROXY_PASSWORD=asdasd!
    networks:
      - proxy-network
    healthcheck:
      test: ["CMD", "nc", "-z", "localhost", "1080"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  proxy-network:
    driver: bridge

Вариант 2: HTTP-proxy (Tinyproxy)

HTTP-прокси подходит для браузеров и простых сценариев (curl, apt, сервисы, которые не умеют SOCKS).

docker-compose.yml

services:
  http-proxy:
    image: vimagick/tinyproxy:latest
    container_name: http-proxy
    restart: unless-stopped
    ports:
      - "3128:3128"
    environment:
      - PORT=3128
      # логин:пароль для basic auth
      - AUTH=myuser:mypassword123
    networks:
      - proxy-network
    healthcheck:
      test: ["CMD", "nc", "-z", "localhost", "3128"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  proxy-network:
    driver: bridge

Вариант 3: HA-proxy Transparent

Прозрачный прокси 443 через HAProxy (TCP passthrough)

0) Термины

  • edge — защитный сервер с публичным IP, на него приходит весь трафик :443
  • origin — реальный сервер с сайтом/сервисом на :443
  • passthrough — HAProxy не расшифровывает TLS, просто проксирует TCP

1) Требования

  • На edge открыт порт 443/tcp наружу
  • На origin порт 443/tcp доступен только с IP edge (рекомендуется)
  • HAProxy будет работать в режиме mode tcp

2) Установка HAProxy на edge (Ubuntu/Debian)

sudo apt update
sudo apt install -y haproxy
haproxy -v
sudo nano /etc/haproxy/haproxy.cfg

global
  log /dev/log local0
  log /dev/log local1 notice
  maxconn 20000
  daemon

defaults
  log     global
  mode    tcp
  option  tcplog
  timeout connect 5s
  timeout client  1m
  timeout server  1m

frontend ft_443
  bind *:443
  mode tcp
  default_backend bk_origin_443

backend bk_origin_443
  mode tcp
  # Базовая проверка доступности TCP
  server origin ORIGIN_IP:443 check

sudo haproxy -c -f /etc/haproxy/haproxy.cfg

sudo systemctl restart haproxy
sudo systemctl enable haproxy

3) Проверка что passthrough работает

curl -vk https://<EDGE_DOMAIN_OR_IP>/

4) Важно: на origin будут видны IP HAProxy (как исправить)

В режиме TCP passthrough origin не знает реальный IP клиента.

Решение: включить PROXY protocol от HAProxy до origin.

4.1) Включаем PROXY protocol в HAProxy

В backend добавь send-proxy-v2:

backend bk_origin_443
  mode tcp
  server origin ORIGIN_IP:443 send-proxy-v2 check

sudo haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl restart haproxy  

4.2) Настраиваем origin (пример для Nginx)

На origin в nginx нужно слушать 443 с proxy_protocol.

Пример (если nginx терминирует TLS на origin):

server {
  listen 443 ssl proxy_protocol;
  server_name example.com;

  # доверяем только edge
  set_real_ip_from <EDGE_IP>;
  real_ip_header proxy_protocol;

  ssl_certificate     /etc/ssl/fullchain.pem;
  ssl_certificate_key /etc/ssl/privkey.pem;

  location / {
    proxy_pass http://127.0.0.1:8080;
  }
}
Важно: set_real_ip_from должен быть именно IP edge, иначе можно подделать IP.

Перезагрузка nginx:

sudo nginx -t && sudo systemctl reload nginx

5) Закрываем origin от всего мира (рекомендовано)

На origin разрешаем вход на 443 только с edge:

UFW (пример)

sudo ufw allow from <EDGE_IP> to any port 443 proto tcp
sudo ufw deny 443/tcp
sudo ufw status verbose

6) (Опционально) SNI routing: разные origin на одном 443

Если на edge нужно маршрутизировать по домену (SNI), добавляем inspect TLS ClientHello:

frontend ft_443
  bind *:443
  mode tcp

  tcp-request inspect-delay 5s
  tcp-request content accept if { req.ssl_hello_type 1 }

  use_backend bk_site1 if { req.ssl_sni -i site1.example.com }
  use_backend bk_site2 if { req.ssl_sni -i site2.example.com }
  default_backend bk_origin_443

backend bk_site1
  mode tcp
  server s1 10.0.0.10:443 send-proxy-v2 check

backend bk_site2
  mode tcp
  server s2 10.0.0.11:443 send-proxy-v2 check

7) Логи и отладка на edge

sudo journalctl -u haproxy -f
sudo tail -f /var/log/haproxy.log

8) Готовый чеклист

  • HAProxy слушает *:443 на edge
  • backend указывает на ORIGIN_IP:443
  • (опция) send-proxy-v2 включен
  • origin умеет proxy_protocol и доверяет только edge IP
  • origin закрыт firewall’ом для всего мира, открыт только для edge
  • Проверка curl -vk https://EDGE/ проходит