Skip to content

Commit 650f152

Browse files
committed
Integrate proxyproto for TCP and TLS listeners
If the connection is made from one of the trusted proxies ip addresses, it is allowed that TCP and TLS connections contain a proxyprotocol header to pass source connection information. This in particular allows dns over tls behind a load balancer, while keeping source ip address information. Signed-off-by: Peter Verraedt <peter@verraedt.be>
1 parent e975148 commit 650f152

3 files changed

Lines changed: 28 additions & 4 deletions

File tree

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ require (
4545
github.com/gorilla/websocket v1.5.3 // indirect
4646
github.com/jstemmer/go-junit-report/v2 v2.1.0 // indirect
4747
github.com/kisielk/errcheck v1.9.0 // indirect
48+
github.com/pires/go-proxyproto v0.8.1 // indirect
4849
github.com/pmezard/go-difflib v1.0.0 // indirect
4950
github.com/quic-go/qpack v0.5.1 // indirect
5051
github.com/robfig/cron/v3 v3.0.1 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
8484
github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
8585
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
8686
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
87+
github.com/pires/go-proxyproto v0.8.1 h1:9KEixbdJfhrbtjpz/ZwCdWDD2Xem0NZ38qMYaASJgp0=
88+
github.com/pires/go-proxyproto v0.8.1/go.mod h1:ZKAAyp3cgy5Y5Mo4n9AlScrkCZwUy0g3Jf+slqQVcuU=
8789
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
8890
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
8991
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=

proxy/servertcp.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@ import (
1616
"github.com/AdguardTeam/golibs/netutil"
1717
"github.com/AdguardTeam/golibs/syncutil"
1818
"github.com/miekg/dns"
19+
20+
proxyproto "github.com/pires/go-proxyproto"
1921
)
2022

2123
// initTCPListeners initializes TCP listeners with configured addresses.
2224
func (p *Proxy) initTCPListeners(ctx context.Context) (err error) {
2325
for _, addr := range p.TCPListenAddr {
24-
var ln *net.TCPListener
26+
var ln net.Listener
2527
ln, err = p.listenTCP(ctx, addr)
2628
if err != nil {
2729
return fmt.Errorf("listening on tcp addr %s: %w", addr, err)
@@ -34,7 +36,7 @@ func (p *Proxy) initTCPListeners(ctx context.Context) (err error) {
3436
}
3537

3638
// listenTCP returns a new TCP listener listening on addr.
37-
func (p *Proxy) listenTCP(ctx context.Context, addr *net.TCPAddr) (ln *net.TCPListener, err error) {
39+
func (p *Proxy) listenTCP(ctx context.Context, addr *net.TCPAddr) (ln net.Listener, err error) {
3840
addrStr := addr.String()
3941
p.logger.InfoContext(ctx, "creating tcp server socket", "addr", addrStr)
4042

@@ -60,7 +62,24 @@ func (p *Proxy) listenTCP(ctx context.Context, addr *net.TCPAddr) (ln *net.TCPLi
6062

6163
p.logger.InfoContext(ctx, "listening to tcp", "addr", ln.Addr())
6264

63-
return ln, nil
65+
/*if p.TrustedProxies.Contains(prx.Addr()) {
66+
p.logger.InfoContext(ctx, "proxy server is not trusted", "addr", prx.Addr())
67+
}*/
68+
69+
return p.wrapProxyListener(ln), nil
70+
}
71+
72+
func (p *Proxy) wrapProxyListener(ln net.Listener) net.Listener {
73+
return &proxyproto.Listener{
74+
Listener: ln,
75+
ConnPolicy: func(options proxyproto.ConnPolicyOptions) (proxyproto.Policy, error) {
76+
if p.TrustedProxies.Contains(netutil.NetAddrToAddrPort(options.Upstream).Addr()) {
77+
return proxyproto.USE, nil
78+
}
79+
80+
return proxyproto.REJECT, nil
81+
},
82+
}
6483
}
6584

6685
// initTLSListeners initializes TLS listeners with configured addresses.
@@ -78,7 +97,9 @@ func (p *Proxy) initTLSListeners(ctx context.Context) (err error) {
7897
return fmt.Errorf("listening on tls addr %s: %w", addr, err)
7998
}
8099

81-
l := tls.NewListener(tcpListen, p.TLSConfig)
100+
proxyListen := p.wrapProxyListener(tcpListen)
101+
102+
l := tls.NewListener(proxyListen, p.TLSConfig)
82103
p.tlsListen = append(p.tlsListen, l)
83104

84105
p.logger.InfoContext(ctx, "listening to tls", "addr", l.Addr())

0 commit comments

Comments
 (0)