feat(nord): support multi-server NordLynx outbounds (#6311)

* feat(nord): support multi-server NordLynx outbounds

* fix(nord): address verified PR review findings

Tighten the NordVPN multi-outbound implementation and its regression
coverage based on the verified review feedback.

- remove the redundant Xray validation test that duplicated the base
  branch and did not exercise multiple outbounds
- make NordModal tests wait for server loading and assert the modal close
  callback, duplicate-server state, and endpoint behavior
- add coverage for resolving the NordLynx public key from technology
  metadata instead of a numeric technology ID
- use a real httptest server for Nord integration tests through an
  injectable API base URL
- represent the All Cities sentinel consistently as null and reset it
  when a country changes

The existing NordVPN API contracts and persisted outbound schema remain
unchanged.
This commit is contained in:
Masterain
2026-09-03 02:20:10 +08:00
committed by GitHub
parent f727d04f65
commit f9cfd87cb2
23 changed files with 1186 additions and 215 deletions
@@ -84,7 +84,14 @@ with a routing rule.
3x-ui can fetch NordVPN (NordLynx/WireGuard) credentials from an access token (or
accept a private key directly) and list countries/servers, so you can build a
NordVPN outbound.
NordVPN outbound. Open **Xray → Outbounds → More → NordVPN**, sign in or save a
private key, select a server, and add the outbound. You can add several servers;
each hostname has a unique `nord-<hostname>` tag and cannot be added twice.
**Reset** on an added row keeps its server, tag, peer, and routing references but
refreshes its embedded private key from the currently stored NordVPN credentials.
Logout clears only those stored credentials. Existing outbounds continue to use
their embedded keys; remove unused NordVPN outbounds from the Outbounds list.
## PIA WireGuard
@@ -85,7 +85,14 @@ WARP به سرور شما امکان می‌دهد ترافیک خود را از
3x-ui می‌تواند اعتبارنامه‌های NordVPN (NordLynx/WireGuard) را از یک توکن دسترسی دریافت کند (یا
یک کلید خصوصی را مستقیماً بپذیرد) و کشورها/سرورها را فهرست کند تا بتوانید یک خروجی NordVPN
بسازید.
بسازید. از **Xray → خروجی‌ها → بیشتر → NordVPN** وارد شوید یا کلید خصوصی را ذخیره کنید،
سرور را انتخاب کنید و خروجی را بیفزایید. می‌توان چند سرور افزود؛ هر hostname برچسب یکتای
`nord-<hostname>` دارد و نمی‌توان آن را دو بار افزود.
**Reset** در هر ردیف، سرور، برچسب، peer و ارجاع‌های مسیریابی را نگه می‌دارد و فقط کلید خصوصی
درون خروجی را از اعتبارنامهٔ ذخیره‌شدهٔ فعلی تازه می‌کند. خروج فقط اعتبارنامهٔ ذخیره‌شده را پاک
می‌کند و خروجی‌های موجود همچنان از کلید درون خود استفاده می‌کنند. خروجی‌های بلااستفادهٔ NordVPN
را از فهرست خروجی‌ها حذف کنید.
## خروجی WireGuard PIA
@@ -92,7 +92,15 @@ WARP. Также можно применить бесплатную лиценз
3x-ui может получать учётные данные NordVPN (NordLynx/WireGuard) из токена доступа
(или принимать приватный ключ напрямую) и выводить список стран/серверов, чтобы вы
могли построить outbound-соединение NordVPN.
могли построить outbound-соединение NordVPN. Откройте
**Xray → Исходящие → Ещё → NordVPN**, войдите или сохраните приватный ключ,
выберите сервер и добавьте исходящее. Можно добавить несколько серверов; каждый
hostname получает уникальный тег `nord-<hostname>` и не может быть добавлен дважды.
**Reset** в строке сохраняет сервер, тег, peer и ссылки маршрутизации, но обновляет
встроенный приватный ключ из текущих сохранённых учётных данных NordVPN. Выход
очищает только сохранённые учётные данные. Существующие исходящие продолжают
использовать встроенные ключи; удаляйте ненужные NordVPN-исходящие в общем списке.
## PIA WireGuard
@@ -80,7 +80,13 @@ WARP 账户,并将其接入一个标签为 **`warp`** 的 WireGuard 出站:
3x-ui 可以根据访问令牌获取 NordVPNNordLynx/WireGuard)凭据(或
直接接受一个私钥),并列出国家/服务器,从而让你构建一个
NordVPN 出站。
NordVPN 出站。打开 **Xray → 出站 → 更多 → NordVPN**,登录或保存私钥后选择服务器并
添加出站。可以连续添加多台服务器;每个 hostname 使用唯一的 `nord-<hostname>` 标签,
同一服务器不能重复添加。
对已添加行执行 **Reset** 时,会保留原服务器、标签、peer 和路由引用,只使用当前保存的
NordVPN 凭据刷新该出站内嵌的私钥。登出只清除保存的凭据,已有出站继续使用其内嵌密钥;
不再使用的 NordVPN 出站需要从出站列表中删除。
## PIA WireGuard