XX-net/XX-Net · critical · Exception

Servers could not be resolved, %r.

Error message

Servers could not be resolved, %r.

What it means

Generic Exception raised in Pteredor.__init__ when DNS/system resolution of the teredo server list yields fewer than 1 usable server IP. The message lists the input server_list. A secondary warning path prints when fewer than 2 resolve, but zero servers is fatal because the tunnel has nothing to relay through.

Source

Thrown at code/default/gae_proxy/local/ipv6_tunnel/pteredor.py:263

            self.teredo_port = remote_port
        self.prober_dict = collections.defaultdict(default_prober_dict)
        self.ip2server = collections.defaultdict(list)
        server_ip_list = []
        if isinstance(server_list, str):
            server_list = [server_list]
        for server in server_list:
            if is_ipv4(server):
                server_ip_list.append(server)
            else:
                ip_list = resolve(server)
                for ip in ip_list:
                    self.ip2server[ip].append(server)
                server_ip_list += ip_list
        self.server_ip_list = remove_same_server(server_ip_list)
        if len(self.server_ip_list) < 1:
            msg = 'Servers could not be resolved, %r.' % server_list
            print(msg)
            raise Exception(msg)
        elif len(self.server_ip_list) < 2:
            print(('Need input more teredo servers, now is %d.'
                   % len(self.server_ip_list)))
        threading.Thread(target=self.receive_loop, name="teredo_recieve_loop").start()
        if probe_nat:
            self.nat_type = self.nat_type_probe()

    def unpack_indication(self, data):
        return struct.unpack('!2s4s', data[2:8])

    def handle_ra_packet(self, ipv6_pkt):
        server_ip = socket.inet_ntoa(ipv6_pkt[76:80])
        cone_flag = bytearray(ipv6_pkt)[32] >> 7 & 1
        logger.debug('ipv6_pkt ; RA_cone = %s\nsrc:%s\ndst:%s' % (
            cone_flag,
            str2hex(ipv6_pkt[8:24]),
            str2hex(ipv6_pkt[24:40])))
        return server_ip, cone_flag

View on GitHub (pinned to cfa5bc17b6)

Solutions

  1. Check DNS works: nslookup the teredo server hostnames; fix /etc/resolv.conf or the DNS server if not
  2. Update the teredo server list to currently alive servers
  3. Pre-resolve and pass literal IPs if DNS for these names is unreliable in your environment
  4. Ensure network is up before constructing the tunnel
Defensive patterns

Strategy: validation

Validate before calling

import socket
servers = ['teredo.remlab.net', 'teredo.iks-jena.de']
alive = [s for s in servers if socket.gethostbyname(s)]
if not alive:
    raise RuntimeError('No teredo server resolves; fix DNS before starting tunnel')

Try / catch

try:
    tunnel = Pteredor(server_list=servers)
except Exception as e:
    if 'could not be resolved' in str(e):
        fix_dns_or_pass_ips()
        tunnel = Pteredor(server_list=resolved_ips)
    else:
        raise

Prevention

When it happens

Trigger: Instantiating the ipv6_tunnel Pteredor with server hostnames that all fail DNS resolution, or an empty/whitespace server list after dedup (remove_same_server returns []).

Common situations: DNS server blocking/failing the teredo server names, offline machine at startup, hostnames decommissioned over time, typo'd server names in config.

Related errors


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