Skip to content

Commit ad5ef9d

Browse files
committed
add -dynamic-destination flag
path-network/go-mmproxy path-network#15
1 parent 006247c commit ad5ef9d

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ Usage of ./go-mmproxy:
5757
Path to a file that contains allowed subnets of the proxy servers
5858
-close-after int
5959
Number of seconds after which UDP socket will be cleaned up (default 60)
60+
-dynamic-destination
61+
Traffic wil be forwarded to the destination specified in the PROXY protocol header
6062
-l string
6163
Address the proxy listens on (default "0.0.0.0:8443")
6264
-listeners int

main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type options struct {
3131
Logger *slog.Logger
3232
udpCloseAfter int
3333
UDPCloseAfter time.Duration
34+
DynamicDestination bool
3435
}
3536

3637
var Opts options
@@ -49,6 +50,7 @@ func init() {
4950
flag.IntVar(&Opts.Listeners, "listeners", 1,
5051
"Number of listener sockets that will be opened for the listen address (Linux 3.9+)")
5152
flag.IntVar(&Opts.udpCloseAfter, "close-after", 60, "Number of seconds after which UDP socket will be cleaned up")
53+
flag.BoolVar(&Opts.DynamicDestination, "dynamic-destination", false, "Traffic will be forwarded to the destination specified in the PROXY protocol header")
5254
}
5355

5456
func listen(listenerNum int, errors chan<- error) {

tcp.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,23 @@ func tcpHandleConnection(conn net.Conn, logger *slog.Logger) {
4444
return
4545
}
4646

47-
saddr, _, restBytes, err := PROXYReadRemoteAddr(buffer[:n], TCP)
47+
saddr, daddr, restBytes, err := PROXYReadRemoteAddr(buffer[:n], TCP)
4848
if err != nil {
4949
logger.Debug("failed to parse PROXY header", "error", err, slog.Bool("dropConnection", true))
5050
return
5151
}
5252

5353
targetAddr := Opts.TargetAddr6
54-
if saddr == nil {
55-
if netip.MustParseAddrPort(conn.RemoteAddr().String()).Addr().Is4() {
54+
if !Opts.DynamicDestination {
55+
if saddr == nil {
56+
if netip.MustParseAddrPort(conn.RemoteAddr().String()).Addr().Is4() {
57+
targetAddr = Opts.TargetAddr4
58+
}
59+
} else if netip.MustParseAddrPort(saddr.String()).Addr().Is4() {
5660
targetAddr = Opts.TargetAddr4
5761
}
58-
} else if netip.MustParseAddrPort(saddr.String()).Addr().Is4() {
59-
targetAddr = Opts.TargetAddr4
62+
} else {
63+
targetAddr = netip.MustParseAddrPort(daddr.String())
6064
}
6165

6266
clientAddr := "UNKNOWN"

udp.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func udpCopyFromUpstream(downstream net.PacketConn, conn *udpConnection) {
8282
}
8383
}
8484

85-
func udpGetSocketFromMap(downstream net.PacketConn, downstreamAddr, saddr net.Addr, logger *slog.Logger,
85+
func udpGetSocketFromMap(downstream net.PacketConn, downstreamAddr, saddr net.Addr, daddr net.Addr, logger *slog.Logger,
8686
connMap map[string]*udpConnection, socketClosures chan<- string) (*udpConnection, error) {
8787
connKey := ""
8888
if saddr != nil {
@@ -94,8 +94,12 @@ func udpGetSocketFromMap(downstream net.PacketConn, downstreamAddr, saddr net.Ad
9494
}
9595

9696
targetAddr := Opts.TargetAddr6
97-
if netip.MustParseAddr(downstreamAddr.String()).Is4() {
98-
targetAddr = Opts.TargetAddr4
97+
if !Opts.DynamicDestination {
98+
if netip.MustParseAddr(downstreamAddr.String()).Is4() {
99+
targetAddr = Opts.TargetAddr4
100+
}
101+
} else {
102+
targetAddr = netip.MustParseAddrPort(daddr.String())
99103
}
100104

101105
logger = logger.With(slog.String("downstreamAddr", downstreamAddr.String()), slog.String("targetAddr", targetAddr.String()))
@@ -159,7 +163,7 @@ func UDPListen(listenConfig *net.ListenConfig, logger *slog.Logger, errors chan<
159163
continue
160164
}
161165

162-
saddr, _, restBytes, err := PROXYReadRemoteAddr(buffer[:n], UDP)
166+
saddr, daddr, restBytes, err := PROXYReadRemoteAddr(buffer[:n], UDP)
163167
if err != nil {
164168
logger.Debug("failed to parse PROXY header", "error", err, slog.String("remoteAddr", remoteAddr.String()))
165169
continue
@@ -178,7 +182,7 @@ func UDPListen(listenConfig *net.ListenConfig, logger *slog.Logger, errors chan<
178182
}
179183
}
180184

181-
conn, err := udpGetSocketFromMap(ln, remoteAddr, saddr, logger, connectionMap, socketClosures)
185+
conn, err := udpGetSocketFromMap(ln, remoteAddr, saddr, daddr, logger, connectionMap, socketClosures)
182186
if err != nil {
183187
continue
184188
}

0 commit comments

Comments
 (0)