Inbounds were pinned to the server's registered public address
(ipv4: PublicAddress, ipv6: PublicAddressV6), so addresses not
registered as 'the' public address - intranet NICs used for relay
landings, additional v6 addresses - had nothing listening and
intranet relays were unreachable (field-verified: ss showed the
landing port bound to the public IP only). 3x-ui/xray bind the
wildcard and serve these paths fine.
- listenAddress: explicit bindAddress still wins; ipv4 -> 0.0.0.0,
ipv6 -> ::, dual -> :: (ipv6 wildcard per user decision
2026-10-21: multi-v6 machines must serve all their v6 addresses).
- ResolveBindAddress: no longer resolves the registered address
into a bind pin (that resolution was the production path of the
pinning via resourceForNode/resourceForNodeExit); returns
("", nil) for all stacks, as it already did for dual/absent.
- serverAddress (client connection address / subscription host)
is unchanged.
- Golden fixtures updated for the three listen fields that
intentionally change; new listen_hotfix_test.go covers the
listenAddress cases and the resourceForNode/exit deploy chains.
143 lines
3.1 KiB
JSON
143 lines
3.1 KiB
JSON
{
|
|
"rfEntry": {
|
|
"id": "res_rf",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node",
|
|
"nodeId": "nod_rf",
|
|
"metricsTag": "ng-nodrf-in",
|
|
"protocol": "vless-reality-vision"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "vless",
|
|
"tag": "ng-nodrf-in",
|
|
"listen": "0.0.0.0",
|
|
"listen_port": 23456,
|
|
"users": [
|
|
{
|
|
"name": "ng:cus_1",
|
|
"uuid": "11111111-2222-3333-4444-000000000001",
|
|
"flow": "xtls-rprx-vision"
|
|
},
|
|
{
|
|
"name": "ng:cus_2",
|
|
"uuid": "11111111-2222-3333-4444-000000000002",
|
|
"flow": "xtls-rprx-vision"
|
|
}
|
|
],
|
|
"tls": {
|
|
"enabled": true,
|
|
"server_name": "www.amd.com",
|
|
"reality": {
|
|
"enabled": true,
|
|
"handshake": {
|
|
"server": "www.amd.com",
|
|
"server_port": 443
|
|
},
|
|
"private_key": "${REALITY_PRIVATE:reality-nod_rf}",
|
|
"short_id": [
|
|
"abcd0001ef01",
|
|
"abcd0002ef01"
|
|
]
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-nodrf-exit",
|
|
"server": "exit.example.com",
|
|
"server_port": 23457,
|
|
"method": "2022-blake3-aes-256-gcm",
|
|
"password": "AwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISI="
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-nodrf-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-nodrf-exit"
|
|
}
|
|
]
|
|
},
|
|
"rfExit": {
|
|
"id": "res_rfx",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node-exit",
|
|
"nodeId": "nod_rf",
|
|
"metricsTag": "ng-nodrf-exit-in"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-nodrf-exit-in",
|
|
"listen": "0.0.0.0",
|
|
"listen_port": 23457,
|
|
"method": "2022-blake3-aes-256-gcm",
|
|
"password": "AwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISI="
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "direct",
|
|
"tag": "ng-nodrf-exit-direct"
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-nodrf-exit-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-nodrf-exit-direct"
|
|
}
|
|
]
|
|
},
|
|
"ssEntry": {
|
|
"id": "res_ss",
|
|
"engine": "sing-box",
|
|
"meta": {
|
|
"kind": "node",
|
|
"nodeId": "nod_ss",
|
|
"metricsTag": "ng-nodss-in",
|
|
"protocol": "shadowsocks-2022-aes128"
|
|
},
|
|
"inbounds": [
|
|
{
|
|
"type": "shadowsocks",
|
|
"tag": "ng-nodss-in",
|
|
"listen": "0.0.0.0",
|
|
"listen_port": 23458,
|
|
"method": "2022-blake3-aes-128-gcm",
|
|
"password": "CwwNDg8QERITFBUWFxgZGg==",
|
|
"users": [
|
|
{
|
|
"name": "ng:cus_1",
|
|
"password": "FRYXGBkaGxwdHh8gISIjJA=="
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"outbounds": [
|
|
{
|
|
"type": "direct",
|
|
"tag": "ng-nodss-direct"
|
|
}
|
|
],
|
|
"routingRules": [
|
|
{
|
|
"inbound": [
|
|
"ng-nodss-in"
|
|
],
|
|
"action": "route",
|
|
"outbound": "ng-nodss-direct"
|
|
}
|
|
]
|
|
}
|
|
}
|