{"record":{"id":"a4f62cda538e5e9e","repo":"k3s-io/k3s","slug":"requested-vpn-name-is-not-supported-we-current","errorCode":null,"errorMessage":"Requested VPN: <name> is not supported. We currently only support tailscale","messagePattern":"Requested VPN: <name> is not supported\\. We currently only support tailscale","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/vpn/vpn.go","lineNumber":156,"sourceCode":"\t}\n\treturn authInfo, nil\n}\n\n// isVPNConfigOK checks that the config is complete\nfunc isVPNConfigOK(authInfo vpnCliAuthInfo) error {\n\tif authInfo.Name == \"tailscale\" {\n\t\tif authInfo.JoinKey == \"\" {\n\t\t\treturn errors.New(\"VPN Error. Tailscale requires a JoinKey\")\n\t\t}\n\t\tif authInfo.ControlServerURL != \"\" {\n\t\t\tif _, err := url.Parse(authInfo.ControlServerURL); err != nil {\n\t\t\t\treturn fmt.Errorf(\"VPN Error. Invalid control server URL for Tailscale: %w\", err)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\treturn errors.New(\"Requested VPN: \" + authInfo.Name + \" is not supported. We currently only support tailscale\")\n}\n\n// getTailscaleInfo returns the IPs of the interface\nfunc getTailscaleInfo() (*Info, error) {\n\toutput, err := util.ExecCommand(\"tailscale\", []string{\"status\", \"--json\"})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to run tailscale status --json: %v\", err)\n\t}\n\n\tlogrus.Debugf(\"Output from tailscale status --json: %v\", output)\n\n\tvar tailscaleOutput TailscaleOutput\n\terr = json.Unmarshal([]byte(output), &tailscaleOutput)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to unmarshal tailscale output: %v\", err)\n\t}\n\n\t// Errors are ignored because the interface might not have ipv4 or ipv6 addresses (that's the only possible error)","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/k3s-io/k3s/blob/6ba341e396edc16b8dcae978a7c5e3ac7ee5606e/pkg/vpn/vpn.go#L138-L174","documentation":"The VPN integration implements exactly one provider: name=tailscale (case-sensitive). After the tailscale branch returns, any other authInfo.Name falls through to this error echoing the requested name. An empty name — a --vpn-auth string without name= — also lands here, producing 'Requested VPN:  is not supported'.","triggerScenarios":"--vpn-auth=\"name=zerotier\" (or any non-tailscale value), a missing name key, or a case mismatch such as name=Tailscale.","commonSituations":"Attempting ZeroTier, WireGuard or other VPNs that look similar; copy/pasting flags from another tool's docs; typos in the parameter name or value.","solutions":["Use --vpn-auth=\"name=tailscale,...\" exactly, all lowercase","Remove --vpn-auth (and the tailscale flannel backend) if VPN integration is not wanted","Check for typos: unknown parameter keys are rejected separately with 'unknown parameter'"],"exampleFix":"# before\n--vpn-auth=\"name=zero-tier\"\n\n# after\n--vpn-auth=\"name=tailscale,joinKey=tskey-auth-abcdef123456\"","handlingStrategy":"validation","validationCode":"const onlySupported = \"tailscale\"\nif name != onlySupported {\n    return fmt.Errorf(\"unsupported VPN %q (only %s)\", name, onlySupported)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat the provider whitelist as part of your config contract: fail CI on any name except tailscale","Note the check is case-sensitive and requires name= to be present at all"],"tags":["vpn","config","validation"],"backgroundTag":null,"analyzedSha":"6ba341e396edc16b8dcae978a7c5e3ac7ee5606e","analyzedAt":"2026-08-15T16:27:54.286Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}