From e4e4d336d915c1ca0c40c68f3e8e9ad340700b75 Mon Sep 17 00:00:00 2001 From: Chuangbo Li Date: Fri, 3 Sep 2021 01:42:27 +0800 Subject: [PATCH] cmd/derper: listen on host of flag server addr for port 80 and 3478 (#2768) cmd/derper: listen on host of flag server addr for port 80 and 3478 When using custom derp on the server with multiple IP addresses, we would like to bind derp 80, 443 and stun 3478 to a certain IP. derp command provides flag `-a` to customize which address to bind for port 443. But port :80 and :3478 were hard-coded. Fixes #2767 Signed-off-by: Li Chuangbo --- cmd/derper/derper.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/cmd/derper/derper.go b/cmd/derper/derper.go index fc39d52be..8a3a9d6cb 100644 --- a/cmd/derper/derper.go +++ b/cmd/derper/derper.go @@ -117,6 +117,11 @@ func main() { tsweb.DevMode = true } + listenHost, _, err := net.SplitHostPort(*addr) + if err != nil { + log.Fatalf("invalid server address: %v", err) + } + var logPol *logpolicy.Policy if *logCollection != "" { logPol = logpolicy.New(*logCollection) @@ -181,7 +186,7 @@ func main() { debug.Handle("traffic", "Traffic check", http.HandlerFunc(s.ServeDebugTraffic)) if *runSTUN { - go serveSTUN() + go serveSTUN(listenHost) } httpsrv := &http.Server{ @@ -199,7 +204,6 @@ func main() { WriteTimeout: 30 * time.Second, } - var err error if letsEncrypt { if *certDir == "" { log.Fatalf("missing required --certdir flag") @@ -226,7 +230,7 @@ func main() { } go func() { port80srv := &http.Server{ - Addr: ":80", // the default, but to be explicit + Addr: net.JoinHostPort(listenHost, "80"), Handler: certManager.HTTPHandler(tsweb.Port80Handler{Main: mux}), ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, @@ -248,8 +252,9 @@ func main() { } } -func serveSTUN() { - pc, err := net.ListenPacket("udp", ":3478") +func serveSTUN(host string) { + + pc, err := net.ListenPacket("udp", net.JoinHostPort(host, "3478")) if err != nil { log.Fatalf("failed to open STUN listener: %v", err) }