From 41bb47de0ec92fe5c7660ad6f1f63b184d69a97f Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Sat, 17 Sep 2022 09:24:26 -0700 Subject: [PATCH] cmd/tailscaled: respect $PORT on all platforms, not just Linux Updates #5114 Change-Id: I6c6e28c493d6a026a03088157d08f9fd182ef373 Signed-off-by: Brad Fitzpatrick --- cmd/tailscaled/tailscaled.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 794eb90ac..504a0b47d 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -26,6 +26,7 @@ import ( "os/signal" "path/filepath" "runtime" + "strconv" "strings" "syscall" "time" @@ -97,6 +98,20 @@ func defaultTunName() string { return "tailscale0" } +// defaultPort returns the default UDP port to listen on for disco+wireguard. +// By default it returns 0, to pick one randomly from the kernel. +// If the environment variable PORT is set, that's used instead. +// The PORT environment variable is chosen to match what the Linux systemd +// unit uses, to make documentation more consistent. +func defaultPort() uint16 { + if s := envknob.String("PORT"); s != "" { + if p, err := strconv.ParseUint(s, 10, 16); err == nil { + return uint16(p) + } + } + return 0 +} + var args struct { // tunname is a /dev/net/tun tunnel name ("tailscale0"), the // string "userspace-networking", "tap:TAPNAME[:BRIDGENAME]" @@ -142,7 +157,7 @@ func main() { flag.StringVar(&args.socksAddr, "socks5-server", "", `optional [ip]:port to run a SOCK5 server (e.g. "localhost:1080")`) flag.StringVar(&args.httpProxyAddr, "outbound-http-proxy-listen", "", `optional [ip]:port to run an outbound HTTP proxy (e.g. "localhost:8080")`) flag.StringVar(&args.tunname, "tun", defaultTunName(), `tunnel interface name; use "userspace-networking" (beta) to not use TUN`) - flag.Var(flagtype.PortValue(&args.port, 0), "port", "UDP port to listen on for WireGuard and peer-to-peer traffic; 0 means automatically select") + flag.Var(flagtype.PortValue(&args.port, defaultPort()), "port", "UDP port to listen on for WireGuard and peer-to-peer traffic; 0 means automatically select") flag.StringVar(&args.statepath, "state", "", "absolute path of state file; use 'kube:' to use Kubernetes secrets or 'arn:aws:ssm:...' to store in AWS SSM; use 'mem:' to not store state and register as an emphemeral node. If empty and --statedir is provided, the default is /tailscaled.state. Default: "+paths.DefaultTailscaledStateFile()) flag.StringVar(&args.statedir, "statedir", "", "path to directory for storage of config state, TLS certs, temporary incoming Taildrop files, etc. If empty, it's derived from --state when possible.") flag.StringVar(&args.socketpath, "socket", paths.DefaultTailscaledSocket(), "path of the service unix socket")