Proxy mesh в Kubernetes: Tor exit nodes и гео-маршрутизация через hola-proxy

Published: 2026-04-19

В кластере infra работает namespace proxy с двумя видами исходящих прокси: кластер Tor с ротацией exit node и экземпляры hola-proxy, которые туннелируют трафик через residential IP в конкретных странах.


Namespace proxy

namespace: proxy
├── tor-proxy          ← rotating-tor-http-proxy (HAProxy + N Tor-цепочек)
├── hola-proxy-jp      ← японский exit node через Hola peer network
├── hola-proxy-sg      ← сингапурский exit node
└── hola-proxy-au      ← австралийский exit node

Все прокси слушают на порту 8080 внутри кластера. Внешний доступ — через маршруты APISIX или напрямую по VPN.


Tor rotating proxy

Использует zhaow-de/rotating-tor-http-proxy — контейнер, запускающий N пар Privoxy+Tor за HAProxy. Каждая цепочка — отдельная Tor-идентичность, HAProxy выбирает их по round-robin.

yamlapiVersion: apps/v1
kind: Deployment
metadata:
  name: tor-proxy
  namespace: proxy
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: tor-proxy
          image: registry.example.com/docker/proxy/rotating-tor-http-proxy:latest
          env:
            - name: TOR_INSTANCES
              value: "10"
          ports:
            - containerPort: 30118  # порт HAProxy frontend
          resources:
            requests:
              memory: "512Mi"
              cpu: "200m"
            limits:
              memory: "1Gi"
              cpu: "500m"

10 экземпляров Tor = 10 одновременных цепочек, round-robin. Каждый запрос получает другой IP exit node. Контейнер открывает HAProxy на порту 30118.


Экземпляры hola-proxy (маршрутизация через Tor)

Каждая страна — отдельный Deployment. hola-proxy направляет трафик через Tor-прокси для анонимизации:

yamlapiVersion: apps/v1
kind: Deployment
metadata:
  name: hola-proxy-jp
  namespace: proxy
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: hola-proxy-jp
          image: registry.example.com/docker/proxy/hola-proxy:latest
          args:
            - -bind-address
            - 0.0.0.0:8080
            - -country
            - jp
            - -proxy
            - http://tor-proxy.proxy.svc.cluster.local:30118
            - -timeout
            - 35s
            - -verbosity
            - "20"
          resources:
            requests:
              memory: "64Mi"
              cpu: "50m"
            limits:
              memory: "256Mi"
              cpu: "300m"
          startupProbe:
            tcpSocket:
              port: 8080
            failureThreshold: 30
            periodSeconds: 5
          readinessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 10
          livenessProbe:
            tcpSocket:
              port: 8080
            initialDelaySeconds: 20
            periodSeconds: 20
            failureThreshold: 3

Hola использует P2P residential exit node. Tor анонимизирует подключение от кластера к Hola peer network.

startupProbe с 30 попытками (150 секунд суммарно) даёт hola-proxy время на установку первого peer-соединения.


Service

yamlapiVersion: v1
kind: Service
metadata:
  name: hola-proxy-jp
  namespace: proxy
spec:
  type: ClusterIP
  selector:
    app: hola-proxy
    country: jp
  ports:
    - name: http
      port: 8080
      targetPort: 8080

Аналогично для sg, au. Внутренний адрес: hola-proxy-jp.proxy.svc.cluster.local:8080.


Маршрут APISIX для внешнего доступа

Публикация прокси через APISIX (доступ по VPN):

yamlapiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: proxy-jp
  namespace: proxy
spec:
  http:
    - name: proxy-jp
      match:
        hosts:
          - proxy-jp.infra.example.com
        paths:
          - "/*"
      backends:
        - serviceName: hola-proxy-jp
          servicePort: 8080

Почему сырые манифесты, а не HelmRelease

Deployments лежат в spoke/proxy/ как обычный YAML, а не как HelmRelease:

  1. Шаблонизация по окружениям не нужна — эти прокси существуют только на infra
  2. Страновые прокси не имеют смысла на dev/test
  3. Спецификация пода простая — сырой YAML читается чище, чем чарт с единственным шаблоном

Источник образа

Образ hola-proxy собирается из внутреннего GitLab-проекта и пушится в registry.example.com. Учётные данные для pull — из imagePullSecret gitlab-registry-docker (SealedSecret в spoke/secrets/).


Проверка состояния прокси

Проверить все поды прокси:

bashkubectl get pods -n proxy -o wide

Протестировать конкретный exit node:

bash# Тест японского IP
curl -x http://hola-proxy-jp.proxy.svc.cluster.local:8080 https://api.myip.com

# Тест Tor rotating proxy
curl -x http://tor-proxy.proxy.svc.cluster.local:30118 https://check.torproject.org/api/ip

Проверить логи на ошибки соединения:

bashkubectl logs -n proxy deployment/hola-proxy-jp -f