Xray-core: More robust browser header masquerading (chrome, firefox, edge) (#5802)

Fixes https://github.com/XTLS/Xray-core/issues/5800
This commit is contained in:
Lumière Élevé
2026-03-21 12:24:08 +00:00
committed by GitHub
parent bb05684407
commit 9e09399087
12 changed files with 212 additions and 21 deletions
+10 -2
View File
@@ -10,8 +10,8 @@ import (
c "github.com/xtls/xray-core/common/ctx"
"github.com/xtls/xray-core/common/errors"
"github.com/xtls/xray-core/common/net"
"github.com/xtls/xray-core/common/session"
"github.com/xtls/xray-core/common/utils"
"github.com/xtls/xray-core/common/session"
"github.com/xtls/xray-core/transport/internet"
"github.com/xtls/xray-core/transport/internet/grpc/encoding"
"github.com/xtls/xray-core/transport/internet/reality"
@@ -191,8 +191,16 @@ func getGrpcClient(ctx context.Context, dest net.Destination, streamSettings *in
)
if err == nil {
userAgent := grpcSettings.UserAgent
if userAgent == "" {
// It's NOT recommended to set the UA of gRPC connections to that of real browsers, as they are fundamentally incapable of initiating real gRPC connections.
switch userAgent {
case "chrome", "":
userAgent = utils.ChromeUA
case "firefox":
userAgent = utils.FirefoxUA
case "edge":
userAgent = utils.MSEdgeUA
case "golang":
userAgent = ""
}
setUserAgent(conn, userAgent)
conn.Connect()
+1 -3
View File
@@ -96,9 +96,7 @@ func dialhttpUpgrade(ctx context.Context, dest net.Destination, streamSettings *
for key, value := range transportConfiguration.Header {
AddHeader(req.Header, key, value)
}
if req.Header.Get("User-Agent") == "" {
req.Header.Set("User-Agent", utils.ChromeUA)
}
utils.TryDefaultHeadersWith(req.Header, "ws")
req.Header.Set("Connection", "Upgrade")
req.Header.Set("Upgrade", "websocket")
+1 -1
View File
@@ -223,7 +223,7 @@ func UClient(c net.Conn, config *Config, ctx context.Context, dest net.Destinati
if req == nil {
return
}
req.Header.Set("User-Agent", utils.ChromeUA)
utils.TryDefaultHeadersWith(req.Header, "nav")
if first && config.Show {
fmt.Printf("REALITY localAddr: %v\treq.UserAgent(): %v\n", localAddr, req.UserAgent())
}
+1 -3
View File
@@ -51,9 +51,7 @@ func (c *Config) GetRequestHeader() http.Header {
for k, v := range c.Headers {
header.Add(k, v)
}
if header.Get("User-Agent") == "" {
header.Set("User-Agent", utils.ChromeUA)
}
utils.TryDefaultHeadersWith(header, "fetch")
return header
}
+1 -1
View File
@@ -253,7 +253,7 @@ func dnsQuery(server string, domain string, sockopt *internet.SocketConfig) ([]b
}
req.Header.Set("Accept", "application/dns-message")
req.Header.Set("Content-Type", "application/dns-message")
req.Header.Set("User-Agent", utils.ChromeUA)
utils.TryDefaultHeadersWith(req.Header, "fetch")
req.Header.Set("X-Padding", utils.H2Base62Pad(crypto.RandBetween(100, 1000)))
resp, err := client.Do(req)
+1 -3
View File
@@ -24,9 +24,7 @@ func (c *Config) GetRequestHeader() http.Header {
for k, v := range c.Header {
header.Add(k, v)
}
if header.Get("User-Agent") == "" {
header.Set("User-Agent", utils.ChromeUA)
}
utils.TryDefaultHeadersWith(header, "ws")
return header
}