Перейти к содержанию

WL proxy не работает

Whitelist-серверы (WL / WLS) — прокси на российских IP (VK Cloud), форвардящие трафик через nftables DNAT на зарубежные VPN-серверы. Клиенты подключаются к российскому IP (change_ip в MySQL), трафик идёт на upstream VPN-сервер.

Клиент (RU) → Proxy IP (VK Cloud) → nftables DNAT → Upstream VPN → Reality → Internet

11 прокси-серверов: vk-01..vk-10 (см. docs/infrastructure/whitelist-architecture.md).


Симптомы

  • Клиент не подключается именно через WL-страну (например AT, NL, DE), при этом другие серверы работают
  • openssl s_client -connect PROXY_IP:PORT зависает или возвращает ошибку TLS
  • Conntrack показывает много записей SYN_SENT без перехода в ESTABLISHED
  • После смены upstream-сервера клиенты по-прежнему ходят на старый IP

Диагностика

1. Определить proxy и upstream для WL-сервера

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn \
   -e 'SELECT name, ip, port, change_ip, change_ip_enabled \
       FROM server WHERE name LIKE \"WL%\" ORDER BY name;'"
  • change_ip = IP российского прокси (куда подключается клиент)
  • ip = upstream VPN (куда DNAT форвардит)
  • port = порт на прокси, который слушает DNAT

2. Проверить TLS через прокси

# С backend 10.99.87.249 (имитируем путь клиента из RU):
./scripts/ssh-internal.sh 10.99.87.249 \
  "timeout 10 openssl s_client -connect PROXY_IP:PORT -servername REALITY_SNI </dev/null 2>&1 | tail -5"

SNI для Reality-соединений — публичный домен (например eh.vk.com для VK Cloud серверов). Уточнить в transport_params в MySQL.

3. Проверить nftables правила на прокси

./scripts/ssh-internal.sh PROXY_IP "nft list ruleset"

Смотреть в секции chain prerouting: должны быть правила tcp dport PORT dnat to UPSTREAM_IP:PORT. Если правила отсутствуют или указывают на старый IP — проблема найдена.

4. Проверить conntrack на прокси

./scripts/ssh-internal.sh PROXY_IP \
  "conntrack -L -p tcp --dport PORT 2>/dev/null | head -20"

Много записей SYN_SENT → upstream недоступен (соединение зависает на SYN). Записи ESTABLISHED → путь работает, проблема может быть в клиенте или конфиге.

5. Прямая проверка upstream с прокси

./scripts/ssh-internal.sh PROXY_IP \
  "timeout 5 nc -zv UPSTREAM_IP UPSTREAM_PORT && echo OK || echo FAIL"

Если FAIL — upstream недоступен из VK Cloud на этом порту.

VK Cloud и порт 10443

VK Cloud (90.156.x.x, 83.166.x.x) не может открыть порт 10443 на серверах MonoVM/DataPacket. Рабочие порты из VK Cloud на upstream: 443, 853, 2087, 9443.

6. Проверить transport_params в MySQL

./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn \
   -e 'SELECT name, transport_params FROM server WHERE name LIKE \"WL%\" AND name LIKE \"%AT%\";'"

transport_params содержит JSON с Reality-параметрами. Если параметры устарели — клиент не сможет установить TLS.


Причины и решения

Симптом Причина Решение
nft list ruleset пустой nftables не загружен после reboot nft -f /etc/nftables.conf
DNAT на старый upstream IP MySQL и nftables расходятся Обновить nftables + MySQL синхронно
upstream недоступен с VK Cloud Порт заблокирован провайдером Сменить upstream порт на 9443/443
SYN_SENT в conntrack без ESTABLISHED upstream сервер offline Проверить upstream xray (vpn-server-down.md)
TLS handshake fail Reality SNI / private key изменился Обновить transport_params в MySQL
vk-02: API proxy перехвачен DNAT без привязки к iifname Добавить iifname "ens3" в DNAT правила

Исправление

Перезагрузить nftables правила

./scripts/ssh-internal.sh PROXY_IP \
  "nft flush ruleset && nft -f /etc/nftables.conf && nft list ruleset | grep dnat"

Сменить upstream IP (нужно обновить и nftables, и MySQL)

# 1. Обновить nftables (на прокси):
./scripts/ssh-internal.sh PROXY_IP \
  "sed -i 's/OLD_UPSTREAM_IP/NEW_UPSTREAM_IP/g' /etc/nftables.conf && \
   nft flush ruleset && nft -f /etc/nftables.conf"

# 2. Обновить MySQL:
./scripts/ssh-internal.sh 10.99.87.62 \
  "docker exec vpn-db mysql -uvpn -p'$(см. Vaultwarden  Databases)' vpn \
   -e 'UPDATE server SET ip=\"NEW_UPSTREAM_IP\" WHERE name=\"WLXX #N\";'"

# 3. Синхронизировать VCS:
./scripts/ssh-internal.sh 10.99.87.249 \
  "curl -sX POST http://localhost:8000/api/v1/sync/mysql-servers \
   -H 'X-API-Key: VazVBGPEBLTG7qNVOQQu4xR21DWTBi4_fodUjuEojnE'"

Очистить stale conntrack записи

./scripts/ssh-internal.sh PROXY_IP \
  "conntrack -D -p tcp --dport PORT 2>/dev/null; echo 'conntrack flushed'"

Для WLS (Stealth Inbound) — смена порта upstream

  1. Проверить доступность нового порта с прокси: nc -zv UPSTREAM_IP NEW_PORT
  2. Обновить inbound 3 на upstream через XUI API
  3. Обновить /etc/nftables.conf на прокси и применить
  4. Обновить обе MySQL записи (XUI-запись + WHITELIST-запись)
  5. Синхронизировать VCS: POST /api/v1/sync/mysql-servers

Проверить результат

./scripts/ssh-internal.sh 10.99.87.249 \
  "timeout 10 openssl s_client -connect PROXY_IP:PORT -servername REALITY_SNI </dev/null 2>&1 | grep -E 'Verify|Certificate|CONNECTED'"

Запрещено на WL-серверах

  • Не устанавливать 3x-ui/xray Docker контейнеры
  • Не запускать ansible vpn.yml (только setup_node_exporter_whitelist.yml)
  • Не менять listen порты без синхронного обновления MySQL
  • vk-02: не трогать nftables без проверки iifname — там два сетевых интерфейса: ens3 (VPN DNAT) и ens7 (API proxy)

Эскалация

  • Если upstream VPN-сервер сломан → troubleshooting/vpn-server-down.md
  • Если VK Cloud заблокировал порты на новых серверах — проверить с nc со всех прокси
  • При изменении архитектуры → обновить docs/infrastructure/whitelist-architecture.md

См. также: Whitelist архитектура · Добавление WL-сервера · DevOps скрипты → audit_wl_proxies · VPN Config Service