{"record":{"id":"cdd8c3f941770182","repo":"tailscale/tailscale","slug":"tsnet-no-available-port-in-ephemeral-range","errorCode":null,"errorMessage":"tsnet: no available port in ephemeral range","messagePattern":"tsnet: no available port in ephemeral range","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"tsnet/tsnet.go","lineNumber":2143,"sourceCode":"\t}\n\tln, err := s.netstack.ListenTCP(nsNetwork, nsAddr.String())\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"tsnet: %w\", err)\n\t}\n\treturn ln, nil\n}\n\n// registerListener allocates a port (if 0) and registers the listener in\n// s.listeners under s.mu.\nfunc (s *Server) registerListener(network, addr string, host netip.AddrPort, lnOn listenOn, gonetLn net.Listener) (*listener, error) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\n\t// Allocate an ephemeral port for non-TUN listeners requesting port 0.\n\tif host.Port() == 0 && gonetLn == nil {\n\t\tp, ok := s.allocEphemeralLocked(network, host.Addr(), lnOn)\n\t\tif !ok {\n\t\t\treturn nil, errors.New(\"tsnet: no available port in ephemeral range\")\n\t\t}\n\t\thost = netip.AddrPortFrom(host.Addr(), p)\n\t\taddr = listenAddr(host)\n\t}\n\n\tvar keys []listenKey\n\tswitch lnOn {\n\tcase listenOnTailnet:\n\t\tkeys = append(keys, listenKey{network, host.Addr(), host.Port(), false})\n\tcase listenOnFunnel:\n\t\tkeys = append(keys, listenKey{network, host.Addr(), host.Port(), true})\n\tcase listenOnBoth:\n\t\tkeys = append(keys, listenKey{network, host.Addr(), host.Port(), false})\n\t\tkeys = append(keys, listenKey{network, host.Addr(), host.Port(), true})\n\t}\n\n\tfor _, key := range keys {\n\t\tif _, ok := s.listeners[key]; ok {","sourceCodeStart":2125,"sourceCodeEnd":2161,"githubUrl":"https://github.com/tailscale/tailscale/blob/57c3357fdb542d26c6f9e9f0b815ae5077e63d77/tsnet/tsnet.go#L2125-L2161","documentation":"registerListener tried to allocate an ephemeral port for a non-TUN listener that requested port 0, but every port in the 10002 to 19999 range is already registered for that network, address, and funnel combination. The process has exhausted its ephemeral listener range.","triggerScenarios":"Thrown at tsnet/tsnet.go:2106 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Close unused listeners to free ports in the ephemeral range","Request an explicit port instead of 0","Audit for a listener leak if this occurs under normal load"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"57c3357fdb542d26c6f9e9f0b815ae5077e63d77","analyzedAt":"2026-08-18T08:17:25.280Z","contentChangedAt":"2026-08-18T08:17:25.280Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}