{"record":{"id":"08b1e834845322cf","repo":"XTLS/Xray-core","slug":"invalid-interface-address-address","errorCode":null,"errorMessage":"invalid interface address {address}","messagePattern":"invalid interface address (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"proxy/tun/tun_linux.go","lineNumber":243,"sourceCode":"\t\tFDs:               []int{t.tunFd},\n\t\tMTU:               t.options.MTU,\n\t\tRXChecksumOffload: true,\n\t})\n}\n\nfunc setinterface(network, address string, fd uintptr, iface *net.Interface) error {\n\treturn unix.BindToDevice(int(fd), iface.Name)\n}\n\nfunc (t *LinuxTun) setInterfaceAddresses() error {\n\tif len(t.options.Gateway) == 0 {\n\t\treturn nil\n\t}\n\tfor _, address := range t.options.Gateway {\n\t\taddr, err := netlink.ParseAddr(address)\n\t\tif err != nil {\n\t\t\t_ = t.unsetInterfaceAddresses()\n\t\t\treturn errors.New(\"invalid interface address \", address).Base(err)\n\t\t}\n\t\tif err := netlink.AddrAdd(t.tunLink, addr); err != nil {\n\t\t\t_ = t.unsetInterfaceAddresses()\n\t\t\treturn errors.New(\"failed to add interface address \", address).Base(err)\n\t\t}\n\t\tt.interfaceAddresses = append(t.interfaceAddresses, *addr)\n\t}\n\treturn nil\n}\n\nfunc (t *LinuxTun) unsetInterfaceAddresses() error {\n\tvar errs []error\n\tfor i := len(t.interfaceAddresses) - 1; i >= 0; i-- {\n\t\taddress := t.interfaceAddresses[i]\n\t\tif err := netlink.AddrDel(t.tunLink, &address); err != nil {\n\t\t\terrs = append(errs, errors.New(\"failed to delete interface address \", address.String()).Base(err))\n\t\t}\n\t}","sourceCodeStart":225,"sourceCodeEnd":261,"githubUrl":"https://github.com/XTLS/Xray-core/blob/7d214f8b094f75322fa3990f8aadad1c912f24f5/proxy/tun/tun_linux.go#L225-L261","documentation":"While assigning gateway addresses to the TUN interface, Xray calls netlink.ParseAddr on each entry of the tun inbound's \"gateway\" setting. If the string is not a valid network address (optionally with /prefix), parsing fails, already-applied addresses are rolled back, and this wrapped error is returned.","triggerScenarios":"A gateway entry like \"172.19.0.1\" is valid, but entries such as \"172.19.0.1/33\", \"fe80::1/129\", \"not-an-ip\", an empty string, or trailing whitespace/garbage characters fail ParseAddr.","commonSituations":"Hand-edited JSON with typos; copying a subnet mask notation like \"255.255.255.252\" instead of prefix length; YAML env-substitution leaving an empty value.","solutions":["Correct the gateway entry to a valid address or address/prefix, e.g. \"172.19.0.1/30\"","Use prefix-length notation (/30), never dotted netmask notation","Validate every gateway string with a parse before starting Xray (see validationCode)"],"exampleFix":"// before\n\"gateway\": [\"172.19.0.1 255.255.255.252\"]\n\n// after\n\"gateway\": [\"172.19.0.1/30\"]","handlingStrategy":"validation","validationCode":"for _, gw := range cfg.Gateway {\n\tif _, err := netlink.ParseAddr(gw); err != nil {\n\t\tlog.Fatalf(\"bad gateway %q: %v\", gw, err)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use CIDR notation for gateway entries (\"a.b.c.d/nn\")","Lint config in CI with a JSON schema plus address parsing","Never use dotted netmask strings in gateway"],"tags":["tun","linux","config","address","netlink"],"backgroundTag":null,"analyzedSha":"7d214f8b094f75322fa3990f8aadad1c912f24f5","analyzedAt":"2026-08-15T14:26:24.325Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}