Skip to content

Commit 60a68d1

Browse files
committed
server: add flag to disable TCP listeners on tsnet and tailscaled
Signed-off-by: Oli Strik <[email protected]>
1 parent 4f4dc5e commit 60a68d1

File tree

2 files changed

+56
-42
lines changed

2 files changed

+56
-42
lines changed

flake.nix

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@
147147
description = "Path to unix socket to listen on";
148148
};
149149

150+
disableTCP = mkOption {
151+
type = nullOr bool;
152+
default = null;
153+
description = "Disable the TCP Listeners on tsnet and tailscaled";
154+
};
155+
150156
enableFunnel = mkOption {
151157
type = bool;
152158
default = false;
@@ -237,6 +243,7 @@
237243
local-port = cfg.settings.localPort;
238244
use-local-tailscaled = cfg.settings.useLocalTailscaled;
239245
unix-socket = cfg.settings.unixSocket;
246+
disable-tcp = cfg.settings.disableTCP;
240247
funnel = cfg.settings.enableFunnel;
241248
enable-sts = cfg.settings.enableSts;
242249
log = cfg.settings.logLevel;

tsidp-server.go

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ var (
4040
flagLocalPort = flag.Int("local-port", -1, "allow requests from localhost")
4141
flagUseLocalTailscaled = flag.Bool("use-local-tailscaled", false, "use local tailscaled instead of tsnet")
4242
flagUnixSocket = flag.String("unix-socket", "", "use a unix socket instead of tcp")
43+
flagDisableTCP = flag.Bool("disable-tcp", false, "disable the tcp listener on tsnet/tailscaled")
4344
flagFunnel = flag.Bool("funnel", false, "use Tailscale Funnel to make tsidp available on the public internet")
4445
flagHostname = flag.String("hostname", "idp", "tsnet hostname to use instead of idp")
4546
flagDir = flag.String("dir", "", "tsnet state directory; a default one will be created if not provided")
@@ -92,38 +93,41 @@ func main() {
9293
slog.Error("getting local.Client status", slog.Any("error", err))
9394
os.Exit(1)
9495
}
95-
portStr := fmt.Sprint(*flagPort)
96-
anySuccess := false
97-
for _, ip := range st.TailscaleIPs {
98-
ln, err := net.Listen("tcp", net.JoinHostPort(ip.String(), portStr))
99-
if err != nil {
100-
slog.Warn("net.Listen failed", slog.String("ip", ip.String()), slog.Any("error", err))
101-
continue
96+
97+
if !*flagDisableTCP {
98+
portStr := fmt.Sprint(*flagPort)
99+
anySuccess := false
100+
for _, ip := range st.TailscaleIPs {
101+
ln, err := net.Listen("tcp", net.JoinHostPort(ip.String(), portStr))
102+
if err != nil {
103+
slog.Warn("net.Listen failed", slog.String("ip", ip.String()), slog.Any("error", err))
104+
continue
105+
}
106+
anySuccess = true
107+
ln = tls.NewListener(ln, &tls.Config{
108+
GetCertificate: lc.GetCertificate,
109+
})
110+
lns = append(lns, ln)
111+
}
112+
if !anySuccess {
113+
slog.Error("failed to listen on any ip", slog.Any("ips", st.TailscaleIPs))
114+
os.Exit(1)
102115
}
103-
anySuccess = true
104-
ln = tls.NewListener(ln, &tls.Config{
105-
GetCertificate: lc.GetCertificate,
106-
})
107-
lns = append(lns, ln)
108-
}
109-
if !anySuccess {
110-
slog.Error("failed to listen on any ip", slog.Any("ips", st.TailscaleIPs))
111-
os.Exit(1)
112-
}
113116

114-
// tailscaled needs to be setting an HTTP header for funneled requests
115-
// that older versions don't provide.
116-
// TODO(naman): is this the correct check?
117-
if *flagFunnel && !version.AtLeast(st.Version, "1.71.0") {
118-
slog.Error("Local tailscaled not new enough to support -funnel. Update Tailscale or use tsnet mode.")
119-
os.Exit(1)
120-
}
121-
cleanup, watcherChan, err = server.ServeOnLocalTailscaled(ctx, lc, st, uint16(*flagPort), *flagFunnel)
122-
if err != nil {
123-
slog.Error("could not serve on local tailscaled", slog.Any("error", err))
124-
os.Exit(1)
117+
// tailscaled needs to be setting an HTTP header for funneled requests
118+
// that older versions don't provide.
119+
// TODO(naman): is this the correct check?
120+
if *flagFunnel && !version.AtLeast(st.Version, "1.71.0") {
121+
slog.Error("Local tailscaled not new enough to support -funnel. Update Tailscale or use tsnet mode.")
122+
os.Exit(1)
123+
}
124+
cleanup, watcherChan, err = server.ServeOnLocalTailscaled(ctx, lc, st, uint16(*flagPort), *flagFunnel)
125+
if err != nil {
126+
slog.Error("could not serve on local tailscaled", slog.Any("error", err))
127+
os.Exit(1)
128+
}
129+
defer cleanup()
125130
}
126-
defer cleanup()
127131
} else {
128132
hostinfo.SetApp("tsidp")
129133
ts := &tsnet.Server{
@@ -147,23 +151,26 @@ func main() {
147151
slog.Error("failed to get local client", slog.Any("error", err))
148152
os.Exit(1)
149153
}
150-
var ln net.Listener
151-
if *flagFunnel {
152-
if err := ipn.CheckFunnelAccess(uint16(*flagPort), st.Self); err != nil {
153-
slog.Error("funnel access denied", slog.Any("error", err))
154+
155+
if !*flagDisableTCP {
156+
var ln net.Listener
157+
if *flagFunnel {
158+
if err := ipn.CheckFunnelAccess(uint16(*flagPort), st.Self); err != nil {
159+
slog.Error("funnel access denied", slog.Any("error", err))
160+
os.Exit(1)
161+
}
162+
ln, err = ts.ListenFunnel("tcp", fmt.Sprintf(":%d", *flagPort))
163+
} else {
164+
ln, err = ts.ListenTLS("tcp", fmt.Sprintf(":%d", *flagPort))
165+
}
166+
167+
if err != nil {
168+
slog.Error("failed to listen", slog.Any("error", err))
154169
os.Exit(1)
155170
}
156-
ln, err = ts.ListenFunnel("tcp", fmt.Sprintf(":%d", *flagPort))
157-
} else {
158-
ln, err = ts.ListenTLS("tcp", fmt.Sprintf(":%d", *flagPort))
159-
}
160171

161-
if err != nil {
162-
slog.Error("failed to listen", slog.Any("error", err))
163-
os.Exit(1)
172+
lns = append(lns, ln)
164173
}
165-
166-
lns = append(lns, ln)
167174
}
168175

169176
srv := server.New(

0 commit comments

Comments
 (0)