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