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

Whitelist серверы — архитектура

Whitelist-серверы (WL) — прокси на российских IP для обхода белых списков РКН. Пользователь подключается к российскому IP, трафик форвардится на зарубежный VPN сервер через kernel-space NAT.

Пользователь (RU) → Российский IP (VK Cloud) → nftables DNAT → VPN сервер

Провайдер: VK Cloud (все 11 серверов). Yandex Cloud деком. 18 Feb 2026.


Серверы

Прокси IP WL-записи Upstream Портов
vk-01 212.233.123.88 WLDE #1 + 5 89.222.124.21 (DE) 6
vk-02 90.156.214.48 WLNL #1 + 4 85.17.9.237 (NL) 5
vk-03 90.156.213.143 WLGB #1 + 7 88.218.0.47 (GB) 8
vk-04 83.166.239.199 WLFR #1 + 7 79.127.138.202 (FR) 8
vk-05 83.166.238.168 WLCH, WLUS#2 + 8 194.5.212.149 (DE) 10
vk-06 83.166.235.99 WLES #1 + 6 45.12.150.113 (ES) 7
vk-07 90.156.218.106 WLIL #1 + 7 94.131.114.48 (IL) 8
vk-08 90.156.219.233 WLKZ #1 + 6 2.56.177.18 (KZ) 7
vk-09 90.156.218.103 WLUS, WLPL 217.148.142.21 (US #8) 4
vk-10 37.139.35.61 WLAT #1 + 5 130.195.222.139 (AT) 6

SSH key: ~/.ssh/id_ed25519_shivavpn

API Proxy (только HTTP, не VPN)

Сервер IP Назначение
proxy-whitelist-russia-01 51.250.29.101 Yandex Cloud → api.shivavpn.com
proxy-whitelist-nl-01 212.111.86.181 VK Cloud (vk-02 ens7) → api-v2.shivavpn.io

vk-02 dual-role

vk-02 имеет два интерфейса: ens3 (90.156.214.48) — VPN DNAT, ens7 (212.111.86.181) — API proxy nginx. DNAT правила обязательно привязывать к iifname "ens3", иначе API proxy будет перехвачен.


Как работает nftables DNAT + flowtable

Все 11 серверов используют kernel-space NAT без userspace:

table ip nat {
    chain prerouting { type nat hook prerouting priority dstnat; policy accept;
        tcp dport 443  dnat to UPSTREAM_IP:PORT
        tcp dport 8443 dnat to UPSTREAM_IP:PORT
        # ...
    }
    chain postrouting { type nat hook postrouting priority srcnat; policy accept;
        oifname "ens3" ct status dnat snat to <internal_ip>
    }
}
table ip filter {
    flowtable ft { hook ingress priority filter; devices = { ens3 }; }
    chain forward { ... flow add @ft counter ... }
}

Путь пакета:

  1. SYN/SYN-ACK → conntrack → DNAT → forward → SNAT
  2. После ESTABLISHED → flowtable entry (кэш NAT)
  3. Data-пакеты → ingress hook → neigh_xmit() минуя все netfilter chains
  4. FIN/RST → evict из flowtable → классический путь

Результат: 363–454 MB RAM (было 1.6 GB с nginx stream).

Kernel tuning (/etc/sysctl.d/99-wl-proxy-tuning.conf)

  • TCP congestion: BBR
  • nf_conntrack_max = 131072
  • nf_conntrack_tcp_timeout_established = 7200s
  • vm.swappiness = 10

MySQL — структура WL записей

-- Поля whitelist сервера
-- ip         = upstream VPN (куда DNAT форвардит)
-- port       = PROXY LISTEN PORT (порт на котором слушает прокси, куда подключается клиент)
-- change_ip  = российский прокси IP (куда подключается клиент)
-- change_ip_enabled = 1
SELECT name, ip, port, change_ip, change_ip_enabled FROM server WHERE name LIKE 'WL%';

Один upstream может иметь несколько MySQL записей — каждый порт на прокси = отдельная запись с тем же change_ip.


WLS — Stealth Inbounds

WLS (Whitelist Stealth) — специальные inbound'ы на upstream серверах, доступные только через RU прокси.

Клиент → Proxy (VK Cloud, port 10443) → nftables DNAT → Upstream VPN (inbound id=3) → Reality → Internet

Маппинг WLS (актуально на 13 Mar 2026)

WLS Proxy IP Proxy Port Upstream IP Upstream Port Inbound ID
AT 90.156.214.48 (vk-02) 10443 5.181.21.90 10443 3
NL 83.166.235.99 (vk-06) 10443 45.67.231.125 9443 3
DE 90.156.219.233 (vk-08) 10443 89.222.124.21 9443 3
CH 212.233.123.88 (vk-01) 10443 86.106.84.36 10443 3
IT 90.156.218.106 (vk-07) 10443 5.253.43.184 10443 3
PL 90.156.213.143 (vk-03) 10443 88.218.2.93 10443 3

Обязательно — две MySQL записи на каждый WLS inbound

Тип panel_type Назначение
XUI запись XUI fill_configs добавляет клиентов на upstream панель
WL запись WHITELIST Backend генерит VLESS конфиг через change_ip

Без XUI записи — fill_configs не знает про inbound, клиенты не добавлены, подключения rejected.

# Пример (NL):
NL #6-3   | XUI       | ip=45.67.231.125 | port=9443 | inbound_id=3 | change_ip=NULL
WLS NL #1 | WHITELIST | ip=45.67.231.125 | port=9443 | inbound_id=3 | change_ip=83.166.235.99

Inbound ID = 3 — конвенция для всех stealth inbound'ов. Не менять.

VK Cloud: блокировка порта 10443

VK Cloud (90.156.x.x, 83.166.x.x) не может подключиться к порту 10443 на серверах MonoVM и DataPacket.

Рабочие порты из VK Cloud: 443, 853, 2087, 9443.

Решение: upstream порт 9443, DNAT на прокси: tcp dport 10443 dnat to UPSTREAM:9443.


Процедуры

Смена upstream IP

# 1. Обновить nftables на прокси
ssh root@<proxy_ip>
# Изменить dnat to NEW_IP:PORT в /etc/nftables.conf
nft flush ruleset && nft -f /etc/nftables.conf

# 2. Обновить MySQL (ОБЯЗАТЕЛЬНО)
UPDATE server SET ip='NEW_IP', port=NEW_PORT WHERE name='WLXX #N';

Без синхронизации MySQL — клиенты получат конфиг с одним IP, трафик пойдёт на другой.

Смена upstream порта (WLS)

  1. Проверить доступность нового порта с прокси: nc -zv UPSTREAM:NEW_PORT
  2. На upstream: изменить порт inbound 3 через XUI API (/panel/api/inbounds/update/3)
  3. На прокси: обновить /etc/nftables.conf, применить: nft flush ruleset && nft -f /etc/nftables.conf
  4. MySQL: UPDATE обеих записей (XUI + WHITELIST) — port и transport_params $.vless.port
  5. VPN Config Service: POST /api/v1/sync/mysql-serversPOST /api/v1/sync/fill-missing-configs?dry_run=false
  6. Проверить: openssl s_client -connect PROXY:10443 -servername eh.vk.com

Диагностика WLS

# TLS через прокси (с backend 10.99.87.249)
timeout 10 openssl s_client -connect PROXY_IP:10443 -servername eh.vk.com </dev/null 2>&1 | grep vk

# Conntrack на прокси (утечка SYN_SENT = проблема)
conntrack -L -p tcp --dport 10443 | grep SYN_SENT | wc -l

# Flush stale conntrack (временный фикс при SYN flood)
conntrack -D -p tcp --dport 10443

# Прямое подключение к upstream (проверка доступности порта)
timeout 3 nc -zv UPSTREAM_IP:PORT

Запрещено

Whitelist серверы — только форвардинг

  • Не устанавливать 3x-ui/x-ui на whitelist серверы
  • Не запускать docker с xray
  • Не менять listen порт без обновления MySQL
  • Не запускать ansible vpn.yml на whitelist серверах
  • vk-02: не трогать nftables без проверки iifname — API proxy на отдельном интерфейсе
  • vk-01: nginx conf.d/3xui-panel.conf (:8444) — не удалять, проксирует панель 194.5.212.223

Мониторинг

node_exporter развёрнут на всех 11 серверах (Docker + nginx SSL + basic auth, порт 9100). Prometheus job: wl-proxies.

# Ansible для установки node_exporter
ansible-playbook setup_node_exporter_whitelist.yml

См. также: Добавление WL-сервера · Whitelist БД · Камуфляж (mir-vokrug.stream) · DevOps скрипты → audit_wl_proxies · WL proxy не работает