{"record":{"id":"a9ac767bb603b1c0","repo":"XTLS/Xray-core","slug":"no-available-name-server-could-be-created-from","errorCode":null,"errorMessage":"No available name server could be created from ","messagePattern":"No available name server could be created from ","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/dns/nameserver.go","lineNumber":87,"sourceCode":"\t\t\treturn NewTCPLocalNameServer(u, disableCache, serveStale, serveExpiredTTL, clientIP)\n\t\tcase strings.EqualFold(u.String(), \"fakedns\"):\n\t\t\tvar fd dns.FakeDNSEngine\n\t\t\terr = core.RequireFeatures(ctx, func(fdns dns.FakeDNSEngine) {\n\t\t\t\tfd = fdns\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\treturn NewFakeDNSServer(fd), nil\n\t\t}\n\t}\n\tif dest.Network == net.Network_Unknown {\n\t\tdest.Network = net.Network_UDP\n\t}\n\tif dest.Network == net.Network_UDP { // UDP classic DNS mode\n\t\treturn NewClassicNameServer(dest, dispatcher, disableCache, serveStale, serveExpiredTTL, clientIP), nil\n\t}\n\treturn nil, errors.New(\"No available name server could be created from \", dest).AtWarning()\n}\n\n// NewClient creates a DNS client managing a name server with client IP, domain rules and expected IPs.\nfunc NewClient(\n\tctx context.Context,\n\tns *NameServer,\n\tclientIP net.IP,\n\tdisableCache bool, serveStale bool, serveExpiredTTL uint32,\n\ttag string,\n\tipOption dns.IPOption,\n\tupdateRules func(bool),\n) (*Client, error) {\n\tclient := &Client{}\n\terr := core.RequireFeatures(ctx, func(dispatcher routing.Dispatcher) error {\n\t\t// Create a new server for each client for now\n\t\tserver, err := NewServer(ctx, ns.Address.AsDestination(), dispatcher, disableCache, serveStale, serveExpiredTTL, clientIP)\n\t\tif err != nil {\n\t\t\treturn errors.New(\"failed to create nameserver\").Base(err).AtWarning()","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/app/dns/nameserver.go#L69-L105","documentation":"The peer's padding record length (decoded varint) is rejected by readPaddingTurn when it is smaller than its own header length or exceeds maxPaddingTurnLength (8 MiB). This guards against absurd allocations and detects peers speaking a different or corrupted protocol: a legit record is always at least headerLength bytes and at most 8 MiB.","triggerScenarios":"Connecting to a service that is not an XMC padding peer (its first bytes decode to a huge varint); stream corruption mid-handshake; a forked peer with a different max turn length.","commonSituations":"Wrong inbound port behind a reverse proxy pointing at a plain HTTP/TLS backend; version skew where one side allows > 8 MiB turns; bit-level corruption on flaky links.","solutions":["Confirm the remote address actually serves the XMC transport with padding enabled","Align client/server versions so maxPaddingTurnLength matches on both ends","Treat as fatal for the connection; reconnect and re-run the schedule"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"invalid padding record length\") {\n    // almost certainly not an XMC padding peer or a corrupted stream; abort and alert\n}","preventionTips":["Point the transport only at endpoints running matching XMC versions","Keep maxPaddingTurnLength identical across versions during rollouts"],"tags":["padding","protocol","validation","network","xmc"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}