Skip to content

Commit 2ff670e

Browse files
authored
Sockopt config: Add discardXForwardedFor (for XHTTP, WS, HU) (#5325)
Fixes #5101 (comment)
1 parent d418401 commit 2ff670e

File tree

8 files changed

+95
-64
lines changed

8 files changed

+95
-64
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+
DiscardXForwardedFor bool `json:"discardXForwardedFor"`
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+
DiscardXForwardedFor: c.DiscardXForwardedFor,
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+
bool discard_x_forwarded_for = 23;
135137
}
136138

137139
message HappyEyeballsConfig {

transport/internet/httpupgrade/hub.go

Lines changed: 5 additions & 0 deletions
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 {
@@ -72,6 +73,9 @@ func (s *server) Handle(conn net.Conn) (stat.Connection, error) {
7273

7374
forwardedAddrs := http_proto.ParseXForwardedFor(req.Header)
7475
remoteAddr := conn.RemoteAddr()
76+
if s.socketSettings != nil && s.socketSettings.DiscardXForwardedFor {
77+
forwardedAddrs = nil
78+
}
7579
if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() {
7680
remoteAddr = &net.TCPAddr{
7781
IP: forwardedAddrs[0].IP(),
@@ -141,6 +145,7 @@ func ListenHTTPUpgrade(ctx context.Context, address net.Address, port net.Port,
141145
config: transportConfiguration,
142146
addConn: addConn,
143147
innnerListener: listener,
148+
socketSettings: streamSettings.SocketSettings,
144149
}
145150
go serverInstance.keepAccepting()
146151
return serverInstance, nil

transport/internet/splithttp/hub.go

Lines changed: 18 additions & 13 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 {
@@ -155,6 +156,9 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
155156
Port: remoteAddr.(*net.TCPAddr).Port,
156157
}
157158
}
159+
if h.socketSettings != nil && h.socketSettings.DiscardXForwardedFor {
160+
forwardedAddrs = nil
161+
}
158162
if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() {
159163
remoteAddr = &net.TCPAddr{
160164
IP: forwardedAddrs[0].IP(),
@@ -356,12 +360,13 @@ func ListenXH(ctx context.Context, address net.Address, port net.Port, streamSet
356360
}
357361
}
358362
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{},
363+
config: l.config,
364+
host: l.config.Host,
365+
path: l.config.GetNormalizedPath(),
366+
ln: l,
367+
sessionMu: &sync.Mutex{},
368+
sessions: sync.Map{},
369+
socketSettings: streamSettings.SocketSettings,
365370
}
366371
tlsConfig := getTLSConfig(streamSettings)
367372
l.isH3 = len(tlsConfig.NextProtos) == 1 && tlsConfig.NextProtos[0] == "h3"

transport/internet/websocket/hub.go

Lines changed: 11 additions & 6 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("+", "-", "/", "_", "=", "")
@@ -66,6 +67,9 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
6667

6768
forwardedAddrs := http_proto.ParseXForwardedFor(request.Header)
6869
remoteAddr := conn.RemoteAddr()
70+
if h.socketSettings != nil && h.socketSettings.DiscardXForwardedFor {
71+
forwardedAddrs = nil
72+
}
6973
if len(forwardedAddrs) > 0 && forwardedAddrs[0].Family().IsIP() {
7074
remoteAddr = &net.TCPAddr{
7175
IP: forwardedAddrs[0].IP(),
@@ -132,9 +136,10 @@ func ListenWS(ctx context.Context, address net.Address, port net.Port, streamSet
132136

133137
l.server = http.Server{
134138
Handler: &requestHandler{
135-
host: wsSettings.Host,
136-
path: wsSettings.GetNormalizedPath(),
137-
ln: l,
139+
host: wsSettings.Host,
140+
path: wsSettings.GetNormalizedPath(),
141+
ln: l,
142+
socketSettings: streamSettings.SocketSettings,
138143
},
139144
ReadHeaderTimeout: time.Second * 4,
140145
MaxHeaderBytes: 8192,

0 commit comments

Comments
 (0)