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_flagView on GitHub (pinned to cfa5bc17b6)
Solutions
- Check DNS works: nslookup the teredo server hostnames; fix /etc/resolv.conf or the DNS server if not
- Update the teredo server list to currently alive servers
- Pre-resolve and pass literal IPs if DNS for these names is unreliable in your environment
- 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
- Resolve server hostnames (or hardcode IPs) before constructing the tunnel
- Run a DNS health check at startup on tunnel components
- Keep the teredo server list current; servers disappear over time
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
- remove %s fail:%r
- load /etc/resolv.conf fail:%r
- DoH request no name
- remove %s fail:%r
- loading config e:%r
AI-assisted analysis of XX-net/XX-Net@cfa5bc17b6 (2026-08-27).
Data as JSON: /api/errors/4aa68ea0429bc962.
Report an issue: GitHub.