masque: add address/port option to override endpoint

This commit is contained in:
Shtorm
2026-09-04 01:40:28 +03:00
parent 25618424e6
commit 3540c09b93
3 changed files with 27 additions and 4 deletions
+3
View File
@@ -36,6 +36,9 @@
"auth_token": "", "auth_token": "",
"license_key": "" "license_key": ""
}, },
// Optional: override the endpoint instead of using the one returned by Cloudflare
"address": "",
"port": 0,
"udp_timeout": "5m0s", "udp_timeout": "5m0s",
"udp_keepalive_period": "30s", "udp_keepalive_period": "30s",
"udp_initial_packet_size": 0, "udp_initial_packet_size": 0,
+2
View File
@@ -14,6 +14,8 @@ type MASQUEOutboundOptions struct {
UseHTTP2 bool `json:"use_http2,omitempty"` UseHTTP2 bool `json:"use_http2,omitempty"`
UseIPv6 bool `json:"use_ipv6,omitempty"` UseIPv6 bool `json:"use_ipv6,omitempty"`
Profile CloudflareProfile `json:"profile,omitempty"` Profile CloudflareProfile `json:"profile,omitempty"`
Address string `json:"address,omitempty"`
Port uint16 `json:"port,omitempty"`
UDPTimeout badoption.Duration `json:"udp_timeout,omitempty"` UDPTimeout badoption.Duration `json:"udp_timeout,omitempty"`
UDPKeepalivePeriod badoption.Duration `json:"udp_keepalive_period,omitempty"` UDPKeepalivePeriod badoption.Duration `json:"udp_keepalive_period,omitempty"`
UDPInitialPacketSize uint16 `json:"udp_initial_packet_size,omitempty"` UDPInitialPacketSize uint16 `json:"udp_initial_packet_size,omitempty"`
+22 -4
View File
@@ -111,10 +111,28 @@ func NewOutbound(ctx context.Context, router adapter.Router, logger log.ContextL
logger.ErrorContext(ctx, E.New("failed to prepare TLS config: ", err)) logger.ErrorContext(ctx, E.New("failed to prepare TLS config: ", err))
return return
} }
endpoint, err := appConfig.SelectEndpointFromConfig(options.UseHTTP2, options.UseIPv6, 443) var endpoint net.Addr
if err != nil { if options.Address != "" {
logger.ErrorContext(ctx, E.New("failed to select endpoint: ", err)) endpointPort := options.Port
return if endpointPort == 0 {
endpointPort = 443
}
endpointIP := net.ParseIP(options.Address)
if endpointIP == nil {
logger.ErrorContext(ctx, E.New("invalid endpoint address: ", options.Address))
return
}
if options.UseHTTP2 {
endpoint = &net.TCPAddr{IP: endpointIP, Port: int(endpointPort)}
} else {
endpoint = &net.UDPAddr{IP: endpointIP, Port: int(endpointPort)}
}
} else {
endpoint, err = appConfig.SelectEndpointFromConfig(options.UseHTTP2, options.UseIPv6, 443)
if err != nil {
logger.ErrorContext(ctx, E.New("failed to select endpoint: ", err))
return
}
} }
var udpTimeout time.Duration var udpTimeout time.Duration
if options.UDPTimeout != 0 { if options.UDPTimeout != 0 {