WL proxy не работает¶
Whitelist-серверы (WL / WLS) — прокси на российских IP (VK Cloud), форвардящие трафик через nftables DNAT на зарубежные VPN-серверы. Клиенты подключаются к российскому IP (change_ip в MySQL), трафик идёт на upstream VPN-сервер.
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 правила на прокси¶
Смотреть в секции chain prerouting: должны быть правила tcp dport PORT dnat to UPSTREAM_IP:PORT. Если правила отсутствуют или указывают на старый IP — проблема найдена.
4. Проверить conntrack на прокси¶
Много записей 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¶
- Проверить доступность нового порта с прокси:
nc -zv UPSTREAM_IP NEW_PORT - Обновить inbound 3 на upstream через XUI API
- Обновить
/etc/nftables.confна прокси и применить - Обновить обе MySQL записи (XUI-запись + WHITELIST-запись)
- Синхронизировать 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