Optional proxyproto header

This commit is contained in:
zakuwaki 2022-09-07 23:01:57 +08:00 committed by 世界
parent 87bc292296
commit 46a8f24400
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
3 changed files with 18 additions and 13 deletions

View file

@ -13,6 +13,7 @@ import (
type Listener struct { type Listener struct {
net.Listener net.Listener
AcceptNoHeader bool
} }
func (l *Listener) Accept() (net.Conn, error) { func (l *Listener) Accept() (net.Conn, error) {
@ -22,7 +23,7 @@ func (l *Listener) Accept() (net.Conn, error) {
} }
bufReader := std_bufio.NewReader(conn) bufReader := std_bufio.NewReader(conn)
header, err := proxyproto.Read(bufReader) header, err := proxyproto.Read(bufReader)
if err != nil { if err != nil && !(l.AcceptNoHeader && err == proxyproto.ErrNoProxyProtocol) {
return nil, err return nil, err
} }
if bufReader.Buffered() > 0 { if bufReader.Buffered() > 0 {
@ -33,8 +34,11 @@ func (l *Listener) Accept() (net.Conn, error) {
} }
conn = bufio.NewCachedConn(conn, cache) conn = bufio.NewCachedConn(conn, cache)
} }
return &bufio.AddrConn{Conn: conn, Metadata: M.Metadata{ if header != nil {
Source: M.SocksaddrFromNet(header.SourceAddr), return &bufio.AddrConn{Conn: conn, Metadata: M.Metadata{
Destination: M.SocksaddrFromNet(header.DestinationAddr), Source: M.SocksaddrFromNet(header.SourceAddr),
}}, nil Destination: M.SocksaddrFromNet(header.DestinationAddr),
}}, nil
}
return conn, nil
} }

View file

@ -29,7 +29,7 @@ func (a *myInboundAdapter) ListenTCP() (net.Listener, error) {
} }
if a.listenOptions.ProxyProtocol { if a.listenOptions.ProxyProtocol {
a.logger.Debug("proxy protocol enabled") a.logger.Debug("proxy protocol enabled")
tcpListener = &proxyproto.Listener{Listener: tcpListener} tcpListener = &proxyproto.Listener{Listener: tcpListener, AcceptNoHeader: a.listenOptions.ProxyProtocolAcceptNoHeader}
} }
a.tcpListener = tcpListener a.tcpListener = tcpListener
return tcpListener, err return tcpListener, err

View file

@ -111,12 +111,13 @@ type InboundOptions struct {
} }
type ListenOptions struct { type ListenOptions struct {
Listen ListenAddress `json:"listen"` Listen ListenAddress `json:"listen"`
ListenPort uint16 `json:"listen_port,omitempty"` ListenPort uint16 `json:"listen_port,omitempty"`
TCPFastOpen bool `json:"tcp_fast_open,omitempty"` TCPFastOpen bool `json:"tcp_fast_open,omitempty"`
UDPFragment bool `json:"udp_fragment,omitempty"` UDPFragment bool `json:"udp_fragment,omitempty"`
UDPTimeout int64 `json:"udp_timeout,omitempty"` UDPTimeout int64 `json:"udp_timeout,omitempty"`
ProxyProtocol bool `json:"proxy_protocol,omitempty"` ProxyProtocol bool `json:"proxy_protocol,omitempty"`
Detour string `json:"detour,omitempty"` ProxyProtocolAcceptNoHeader bool `json:"proxy_protocol_accept_no_header,omitempty"`
Detour string `json:"detour,omitempty"`
InboundOptions InboundOptions
} }