From 0bc001b80c9986f05ddb457f1a332e75ab7e33b2 Mon Sep 17 00:00:00 2001 From: Nikita Nemirovsky Date: Thu, 2 Apr 2026 11:41:04 +0800 Subject: [PATCH] feat(sub): add sni override field to externalProxy Allow externalProxy entries to specify a "sni" field that overrides the randomly selected serverName in subscription links. This is needed when an inbound has extra serverNames for fallback routing (e.g., MTProto) that should not appear in client subscription links. --- sub/subService.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/sub/subService.go b/sub/subService.go index f718411a..31c3db1d 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -492,6 +492,14 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { } else { params["security"] = security } + + // Allow externalProxy to override SNI (useful when the + // inbound has extra serverNames for fallback routing that + // should not appear in subscription links). + if sni, ok := ep["sni"].(string); ok && len(sni) > 0 { + params["sni"] = sni + } + url, _ := url.Parse(link) q := url.Query() @@ -687,6 +695,14 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string } else { params["security"] = security } + + // Allow externalProxy to override SNI (useful when the + // inbound has extra serverNames for fallback routing that + // should not appear in subscription links). + if sni, ok := ep["sni"].(string); ok && len(sni) > 0 { + params["sni"] = sni + } + url, _ := url.Parse(link) q := url.Query() @@ -854,6 +870,14 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st } else { params["security"] = security } + + // Allow externalProxy to override SNI (useful when the + // inbound has extra serverNames for fallback routing that + // should not appear in subscription links). + if sni, ok := ep["sni"].(string); ok && len(sni) > 0 { + params["sni"] = sni + } + url, _ := url.Parse(link) q := url.Query()