Добавление Whitelist-сервера¶
Whitelist (WL) — серверы для обхода блокировок. Пользователь подключается к российскому proxy IP, тот через nftables DNAT форвардит трафик на реальный upstream VPN-сервер за рубежом.
Полный источник: docs/guides/WL-CREATE-NEW-ENTRIES-GUIDE.md (monorepo).
Архитектура записей¶
Страна (country)
└─ Город (city) — "moscow_wl<код>"
└─ Сервер (server, panel_type='WHITELIST')
├─ ip = upstream VPN (реальный сервер)
├─ port = порт прослушивания на proxy (2096, 443, 8443...)
└─ change_ip = IP российского proxy (куда подключается клиент)
Каждый WL-сервер — одна строка в server с panel_type='WHITELIST'.
Если нужны несколько портов — отдельная строка на каждый порт.
Шаг 1. Создать страну¶
INSERT INTO country (id, code, name_key, picture) VALUES (
UUID(),
'WDN', -- уникальный 3-х символьный код
'whitelist_denmark', -- уникальный name_key
NULL
);
Код должен быть уникальным. Список занятых кодов: SELECT code FROM country WHERE code LIKE 'W%';
Шаг 2. Создать город¶
INSERT INTO city (id, name_key, country_id) VALUES (
UUID(),
'moscow_wldn', -- конвенция: moscow_wl<код_lower>
(SELECT id FROM country WHERE code='WDN')
);
Шаг 3. Создать записи сервера¶
Одна запись = один порт на одном proxy IP.
INSERT INTO server (id, name, ip, port, city_id, is_active, change_ip,
change_ip_enabled, panel_type, health_status, latitude, longitude) VALUES (
UUID(),
'vk-03-wldn-2096', -- уникальное имя: <proxy>-<код>-<port>
'10.99.87.X', -- upstream VPN IP
2096, -- порт на proxy (не upstream!)
(SELECT id FROM city WHERE name_key='moscow_wldn'),
1,
'90.156.218.106', -- proxy IP (куда идёт клиент)
1,
'WHITELIST', -- обязательно!
'HEALTHY',
0.0, 0.0
);
Критичные поля
panel_typeобязан быть'WHITELIST'. Дефолт —'XUI', что сломает логику.ip= upstream VPN.change_ip= proxy RU. Не перепутать!(change_ip, port)должна быть уникальной комбинацией — иначе конфликт на proxy.
Stealth-серверы (WLS, inbound 3)¶
Stealth маскируется под конкурентские VPN. Требует двух записей в MySQL на каждый upstream:
panel_type |
inbound_id |
Зачем |
|---|---|---|
XUI |
3 | fill_configs добавляет клиентов на XUI-панель |
WHITELIST |
3 | проксированный маршрут через RU proxy |
Без XUI-записи fill_configs не знает про inbound → клиенты не добавляются → подключение отвергается.
Stealth порт: 10443 (NL/DE — 9443 после 13 Mar 2026, AT/CH/IT/PL — 10443).
Добавление в Whitelist-таб приложения¶
WL-страны, которые показываются в таблице "Whitelist" в приложении, задаются хардкодом в CountryServiceImpl.java. Добавить код туда — иначе страна будет доступна только через "Все" и не появится во вкладке Whitelist.
Добавить DNAT на proxy¶
После добавления записей добавить правило на соответствующем VK Cloud сервере:
# /etc/nftables.conf
iifname "ens3" tcp dport <port> counter dnat to <upstream_ip>:853 # WL (inbound 2)
iifname "ens3" tcp dport 10443 counter dnat to <upstream_ip>:10443 # WLS (inbound 3)
Применить без перезагрузки:
Flush обязателен
Без flush старые правила остаются в рантайме и матчат первыми.
Заполнить transport_params до активации¶
Для panel_type='WHITELIST' backend строит VLESS URL из server.transport_params (Reality params).
Поле заполняется автоматически VCS transport_params_sync (~30 мин) после того как VCS подхватит XUI inbound.
Можно ускорить через ручные API-вызовы (все команды на backend 10.99.87.249):
# 1. VCS подхватывает сервер из MySQL
curl -X POST http://localhost:8000/api/v1/sync/mysql-servers -H "X-API-Key: KEY"
# 2. VCS читает inbounds с XUI панели по SSH
curl -X POST "http://localhost:8000/api/v1/sync/fast?force=true" -H "X-API-Key: KEY"
# 3. Ждать ~5 мин: transport_params_sync отработает автоматически после full_sync
# Проверить что transport_params заполнен:
docker exec vpn-db mysql -uvpn -p'PASSWORD' vpn \
-e "SELECT name, ip, port, LENGTH(transport_params) as tp_len FROM server WHERE ip='<UPSTREAM_IP>'"
# tp_len должен быть NOT NULL
# 4. Если tp_len всё ещё NULL — дождаться следующего цикла (30 мин) или перезапустить:
curl -X POST "http://localhost:8000/api/v1/sync/fast?force=true" -H "X-API-Key: KEY"
API key: Vaultwarden → Infrastructure → VPN Config Service. Подробнее: VPN Config Service → Операции.
Формат transport_params (берутся с TCP inbound, port 853):
Активация¶
Backend автоматически создаёт конфиги для всех пользователей (~5 мин с заполненным transport_params).
Чеклист¶
- country, city, server записи созданы
- Уникальность: code, name_key, server.name, (change_ip, port)
-
panel_type='WHITELIST'проставлен - Код добавлен в
CountryServiceImpl.java(Whitelist-таб) - DNAT правила на proxy добавлены и применены (
nft flush ruleset && nft -f ...) -
transport_paramsзаполнен (автоматически VCS или вручную) - Протестировать DIRECT и WL-ссылки
-
is_active=1
Proxy IPs (актуальные)¶
| Proxy IP | Сервер |
|---|---|
| 212.233.123.88 | vk-01 |
| 90.156.214.48 | vk-02 |
| 90.156.213.143 | vk-03 |
| 83.166.239.199 | vk-04 |
| 83.166.238.168 | vk-05 |
| 83.166.235.99 | vk-06 |
| 90.156.218.106 | vk-07 |
| 90.156.219.233 | vk-08 |
| 90.156.218.103 | vk-09 |
| 37.139.35.61 | vk-10 |
Доступные порты на proxy: 443, 2096, 2083, 8443, 51443, 52443, 57443, 59443.
Проверить занятые порты: SELECT port FROM server WHERE change_ip='90.156.218.106' ORDER BY port;
Связанные страницы¶
- Добавление страны в БД — стандартные (не WL) страны
- Развертывание VPN-сервера — XUI-серверы