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
- 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
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
- 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
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
- Servers could not be resolved, %r.
- DoH request no name
- Enable auto start, create path:%s fail:%r
- update overwrite fail:%r
- deleting fail: %s
AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27).
Data as JSON: /api/errors/82846b0567f009d2.
Report an issue: GitHub.