{"record":{"id":"82846b0567f009d2","repo":"XX-net/XX-Net","slug":"bind-dns-s-d-fail","errorCode":null,"errorMessage":"bind DNS %s:%d fail","messagePattern":"bind DNS (.+?):(.+?) fail","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"code/default/smart_router/local/dns_server.py","lineNumber":73,"sourceCode":"                    listen_all_v6 and ':' in ip):\n                continue\n            self.bing_udp_relay(ip)\n            self.bing_listen(ip)\n\n    def bing_listen(self, bind_ip):\n        if \":\" in bind_ip:\n            sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)\n        else:\n            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n\n        try:\n            sock.bind((bind_ip, self.port))\n            xlog.info(\"start DNS server at %s:%d\", bind_ip, self.port)\n            self.running = True\n            self.sockets.append(sock)\n            return\n        except:\n            xlog.warn(\"bind DNS %s:%d fail\", bind_ip, self.port)\n            pass\n\n        try:\n            sock.bind((bind_ip, self.backup_port))\n            xlog.info(\"start DNS server at %s:%d\", bind_ip, self.backup_port)\n            self.running = True\n            self.listen_port = self.backup_port\n            self.sockets.append(sock)\n            return\n        except Exception as e:\n            xlog.warn(\"bind DNS %s:%d fail\", bind_ip, self.backup_port)\n\n            if sys.platform.startswith(\"linux\"):\n                xlog.warn(\"You can try: install libcap2-bin\")\n                xlog.warn(\"Then: sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python2.7\")\n                xlog.warn(\"Or run as root\")\n\n    def bing_udp_relay(self, bind_ip):","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/smart_router/local/dns_server.py#L55-L91","documentation":"The DNS server failed to bind its primary UDP port (default 53) on the given interface; the code logs the failure and falls through to try the backup port. Almost always a permission-denied on privileged ports or the port already being in use.","triggerScenarios":"Calling bing_listen()/init_socket() when sock.bind((bind_ip, self.port)) raises — port < 1024 without privileges, another DNS server (systemd-resolved, dnsmasq) already bound :53, or the IP not present on the host.","commonSituations":"Running on Linux as a non-root user binding :53; systemd-resolved occupying 53; docker container without NET_ADMIN/cap_net_bind_service; wrong bind IP in config.","solutions":["Check what holds the port: ss -lunp | grep :53 and stop systemd-resolved/dnsmasq or use a different port","Grant capability: sudo setcap 'cap_net_bind_service=+ep' $(readlink -f $(which python3))","Run the process as root or in a container with cap_net_bind_service","Configure a non-privileged port and port-forward 53 to it"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import socket\n\ndef can_bind(ip, port):\n    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n    try:\n        s.bind((ip, port)); return True\n    except OSError:\n        return False\n    finally:\n        s.close()","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pre-flight check port availability before starting the server","Grant cap_net_bind_service to the interpreter or run as root for :53","Disable systemd-resolved (or change its stub port) on Linux hosts"],"tags":["dns","socket","bind","permissions"],"backgroundTag":"address-in-use","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}