Skip to content

Commit 2969a18

Browse files
authored
Sockopt config: Add trustedXForwardedFor (for XHTTP, WS, HU inbounds) (#5331)
Fixes #5101 (comment)
1 parent d418401 commit 2969a18

File tree

8 files changed

+119
-67
lines changed

8 files changed

+119
-67
lines changed

app/dns/config.pb.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/router/config.pb.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

infra/conf/transport_internet.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,7 @@ type SocketConfig struct {
810810
CustomSockopt []*CustomSockoptConfig `json:"customSockopt"`
811811
AddressPortStrategy string `json:"addressPortStrategy"`
812812
HappyEyeballsSettings *HappyEyeballsConfig `json:"happyEyeballs"`
813+
TrustedXForwardedFor []string `json:"trustedXForwardedFor"`
813814
}
814815

815816
// Build implements Buildable.
@@ -929,6 +930,7 @@ func (c *SocketConfig) Build() (*internet.SocketConfig, error) {
929930
CustomSockopt: customSockopts,
930931
AddressPortStrategy: addressPortStrategy,
931932
HappyEyeballs: happyEyeballs,
933+
TrustedXForwardedFor: c.TrustedXForwardedFor,
932934
}, nil
933935
}
934936

transport/internet/config.pb.go

Lines changed: 55 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

transport/internet/config.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ message SocketConfig {
132132
AddressPortStrategy address_port_strategy = 21;
133133

134134
HappyEyeballsConfig happy_eyeballs = 22;
135+
136+
repeated string trusted_x_forwarded_for = 23;
135137
}
136138

137139
message HappyEyeballsConfig {

transport/internet/httpupgrade/hub.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type server struct {
2020
config *Config
2121
addConn internet.ConnHandler
2222
innnerListener net.Listener
23+
socketSettings *internet.SocketConfig
2324
}
2425

2526
func (s *server) Close() error {
@@ -70,7 +71,17 @@ func (s *server) Handle(conn net.Conn) (stat.Connection, error) {
7071
return nil, err
7172
}
7273

73-
forwardedAddrs := http_proto.ParseXForwardedFor(req.Header)
74+
var forwardedAddrs []net.Address
75+
if s.socketSettings != nil && len(s.socketSettings.TrustedXForwardedFor) > 0 {
76+
for _, key := range s.socketSettings.TrustedXForwardedFor {
77+
if len(req.Header.Values(key)) > 0 {
78+
forwardedAddrs = http_proto.ParseXForwardedFor(req.Header)
79+
break
80+
}
81+
}
82+
} else {
83+
forwardedAddrs = http_proto.ParseXForwardedFor(req.Header)
84+
}
7485
remoteAddr := conn.RemoteAddr()
7586
if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() {
7687
remoteAddr = &net.TCPAddr{
@@ -141,6 +152,7 @@ func ListenHTTPUpgrade(ctx context.Context, address net.Address, port net.Port,
141152
config: transportConfiguration,
142153
addConn: addConn,
143154
innnerListener: listener,
155+
socketSettings: streamSettings.SocketSettings,
144156
}
145157
go serverInstance.keepAccepting()
146158
return serverInstance, nil

transport/internet/splithttp/hub.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ import (
2727
)
2828

2929
type requestHandler struct {
30-
config *Config
31-
host string
32-
path string
33-
ln *Listener
34-
sessionMu *sync.Mutex
35-
sessions sync.Map
36-
localAddr net.Addr
30+
config *Config
31+
host string
32+
path string
33+
ln *Listener
34+
sessionMu *sync.Mutex
35+
sessions sync.Map
36+
localAddr net.Addr
37+
socketSettings *internet.SocketConfig
3738
}
3839

3940
type httpSession struct {
@@ -139,7 +140,17 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
139140
return
140141
}
141142

142-
forwardedAddrs := http_proto.ParseXForwardedFor(request.Header)
143+
var forwardedAddrs []net.Address
144+
if h.socketSettings != nil && len(h.socketSettings.TrustedXForwardedFor) > 0 {
145+
for _, key := range h.socketSettings.TrustedXForwardedFor {
146+
if len(request.Header.Values(key)) > 0 {
147+
forwardedAddrs = http_proto.ParseXForwardedFor(request.Header)
148+
break
149+
}
150+
}
151+
} else {
152+
forwardedAddrs = http_proto.ParseXForwardedFor(request.Header)
153+
}
143154
var remoteAddr net.Addr
144155
var err error
145156
remoteAddr, err = net.ResolveTCPAddr("tcp", request.RemoteAddr)
@@ -356,12 +367,13 @@ func ListenXH(ctx context.Context, address net.Address, port net.Port, streamSet
356367
}
357368
}
358369
handler := &requestHandler{
359-
config: l.config,
360-
host: l.config.Host,
361-
path: l.config.GetNormalizedPath(),
362-
ln: l,
363-
sessionMu: &sync.Mutex{},
364-
sessions: sync.Map{},
370+
config: l.config,
371+
host: l.config.Host,
372+
path: l.config.GetNormalizedPath(),
373+
ln: l,
374+
sessionMu: &sync.Mutex{},
375+
sessions: sync.Map{},
376+
socketSettings: streamSettings.SocketSettings,
365377
}
366378
tlsConfig := getTLSConfig(streamSettings)
367379
l.isH3 = len(tlsConfig.NextProtos) == 1 && tlsConfig.NextProtos[0] == "h3"

transport/internet/websocket/hub.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ import (
2121
)
2222

2323
type requestHandler struct {
24-
host string
25-
path string
26-
ln *Listener
24+
host string
25+
path string
26+
ln *Listener
27+
socketSettings *internet.SocketConfig
2728
}
2829

2930
var replacer = strings.NewReplacer("+", "-", "/", "_", "=", "")
@@ -64,7 +65,17 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
6465
return
6566
}
6667

67-
forwardedAddrs := http_proto.ParseXForwardedFor(request.Header)
68+
var forwardedAddrs []net.Address
69+
if h.socketSettings != nil && len(h.socketSettings.TrustedXForwardedFor) > 0 {
70+
for _, key := range h.socketSettings.TrustedXForwardedFor {
71+
if len(request.Header.Values(key)) > 0 {
72+
forwardedAddrs = http_proto.ParseXForwardedFor(request.Header)
73+
break
74+
}
75+
}
76+
} else {
77+
forwardedAddrs = http_proto.ParseXForwardedFor(request.Header)
78+
}
6879
remoteAddr := conn.RemoteAddr()
6980
if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() {
7081
remoteAddr = &net.TCPAddr{
@@ -132,9 +143,10 @@ func ListenWS(ctx context.Context, address net.Address, port net.Port, streamSet
132143

133144
l.server = http.Server{
134145
Handler: &requestHandler{
135-
host: wsSettings.Host,
136-
path: wsSettings.GetNormalizedPath(),
137-
ln: l,
146+
host: wsSettings.Host,
147+
path: wsSettings.GetNormalizedPath(),
148+
ln: l,
149+
socketSettings: streamSettings.SocketSettings,
138150
},
139151
ReadHeaderTimeout: time.Second * 4,
140152
MaxHeaderBytes: 8192,

0 commit comments

Comments
 (0)