XX-net/XX-Net · error

bind DNS %s:%d fail

Error message

bind DNS %s:%d fail

What it means

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.

Source

Thrown at code/default/smart_router/local/dns_server.py:73

                    listen_all_v6 and ':' in ip):
                continue
            self.bing_udp_relay(ip)
            self.bing_listen(ip)

    def bing_listen(self, bind_ip):
        if ":" in bind_ip:
            sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
        else:
            sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        try:
            sock.bind((bind_ip, self.port))
            xlog.info("start DNS server at %s:%d", bind_ip, self.port)
            self.running = True
            self.sockets.append(sock)
            return
        except:
            xlog.warn("bind DNS %s:%d fail", bind_ip, self.port)
            pass

        try:
            sock.bind((bind_ip, self.backup_port))
            xlog.info("start DNS server at %s:%d", bind_ip, self.backup_port)
            self.running = True
            self.listen_port = self.backup_port
            self.sockets.append(sock)
            return
        except Exception as e:
            xlog.warn("bind DNS %s:%d fail", bind_ip, self.backup_port)

            if sys.platform.startswith("linux"):
                xlog.warn("You can try: install libcap2-bin")
                xlog.warn("Then: sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python2.7")
                xlog.warn("Or run as root")

    def bing_udp_relay(self, bind_ip):

View on GitHub (pinned to cfa5bc17b6)

Solutions

  1. Check what holds the port: ss -lunp | grep :53 and stop systemd-resolved/dnsmasq or use a different port
  2. Grant capability: sudo setcap 'cap_net_bind_service=+ep' $(readlink -f $(which python3))
  3. Run the process as root or in a container with cap_net_bind_service
  4. Configure a non-privileged port and port-forward 53 to it
Defensive patterns

Strategy: validation

Validate before calling

import socket

def can_bind(ip, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        s.bind((ip, port)); return True
    except OSError:
        return False
    finally:
        s.close()

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27). Data as JSON: /api/errors/82846b0567f009d2. Report an issue: GitHub.