From 13c87c3243b429419925e384ae13fcf7c39dbd7d Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Mon, 27 Jan 2025 16:42:52 -0500 Subject: [PATCH 1/4] feat(dns): add wiimmfi fallback resolver --- dns/src/server.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/dns/src/server.ts b/dns/src/server.ts index 63e54c6..22ae900 100644 --- a/dns/src/server.ts +++ b/dns/src/server.ts @@ -1,4 +1,4 @@ -import { createServer, Packet } from 'dns2'; +import DNS, { createServer, DnsResponse, Packet } from 'dns2'; import { table } from 'table'; import colors from '@colors/colors'; import dotenv from 'dotenv'; @@ -10,6 +10,11 @@ process.on('SIGTERM', () => { dotenv.config(); const addressMap: Record = {}; +const wiimmfiResolver = new DNS({ + nameServers: [ + '95.217.77.181' // * https://wiimmfi.de/patcher/dnspatch + ] +}); for (const variable in process.env) { if (variable.startsWith('SSSL_DNS_MAP')) { @@ -80,12 +85,14 @@ if (tcpPort === 0) { const server = createServer({ udp: true, tcp: true, - handle: (request, send) => { + handle: async (request, send) => { const [ question ] = request.questions; const { name } = question; + let response: DnsResponse | null = null; if (addressMap[name]) { - const response = Packet.createResponseFromRequest(request); + // * If requesting one of our known domains, use our servers + response = Packet.createResponseFromRequest(request); response.answers.push({ name, @@ -94,7 +101,13 @@ const server = createServer({ ttl: 300, address: addressMap[name] }); + } else if (name.endsWith('nintendowifi.net')) { + // * Assume Wiimmfi. WiiLink NAS will not work with our DNS + // * NOTE - This still points conntest.nintendowifi.net to OUR servers, since the Wii U also uses it + response = await wiimmfiResolver.resolve('nas.nintendowifi.net'); + } + if (response) { send(response); } } From e8eb131ee948bd9b9f7279a10e8588d21efb4427 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Mon, 27 Jan 2025 16:57:30 -0500 Subject: [PATCH 2/4] feat(dns): eat errors when resolving addresses --- dns/src/server.ts | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/dns/src/server.ts b/dns/src/server.ts index 22ae900..ddb8d9d 100644 --- a/dns/src/server.ts +++ b/dns/src/server.ts @@ -1,7 +1,8 @@ -import DNS, { createServer, DnsResponse, Packet } from 'dns2'; +import DNS, { createServer, Packet } from 'dns2'; import { table } from 'table'; import colors from '@colors/colors'; import dotenv from 'dotenv'; +import type { DnsResponse } from 'dns2'; process.on('SIGTERM', () => { process.exit(); @@ -90,21 +91,26 @@ const server = createServer({ const { name } = question; let response: DnsResponse | null = null; - if (addressMap[name]) { - // * If requesting one of our known domains, use our servers - response = Packet.createResponseFromRequest(request); + try { + if (addressMap[name]) { + // * If requesting one of our known domains, use our servers + response = Packet.createResponseFromRequest(request); - response.answers.push({ - name, - type: Packet.TYPE.A, - class: Packet.CLASS.IN, - ttl: 300, - address: addressMap[name] - }); - } else if (name.endsWith('nintendowifi.net')) { - // * Assume Wiimmfi. WiiLink NAS will not work with our DNS - // * NOTE - This still points conntest.nintendowifi.net to OUR servers, since the Wii U also uses it - response = await wiimmfiResolver.resolve('nas.nintendowifi.net'); + response.answers.push({ + name, + type: Packet.TYPE.A, + class: Packet.CLASS.IN, + ttl: 300, + address: addressMap[name] + }); + } else if (name.endsWith('nintendowifi.net')) { + // * Assume Wiimmfi. WiiLink NAS will not work with our DNS + // * NOTE - This still points conntest.nintendowifi.net to OUR servers, since the Wii U also uses it + response = await wiimmfiResolver.resolve('nas.nintendowifi.net'); + } + } catch { + // * Eat errors for now + // TODO - Send a SERVFAIL response } if (response) { From 608bf16e932904eaab78b233d05ca6acf58bb5cb Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Mon, 27 Jan 2025 17:04:40 -0500 Subject: [PATCH 3/4] feat(dns): add general fallback dns resolver --- dns/src/server.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dns/src/server.ts b/dns/src/server.ts index ddb8d9d..1b9c38b 100644 --- a/dns/src/server.ts +++ b/dns/src/server.ts @@ -16,6 +16,14 @@ const wiimmfiResolver = new DNS({ '95.217.77.181' // * https://wiimmfi.de/patcher/dnspatch ] }); +const fallbackResolver = new DNS({ + // * dns2 will run queries to all of these servers at once, and use the first response it gets + nameServers: [ + '9.9.9.9', // * https://quad9.net + '1.1.1.1', // * https://www.cloudflare.com/learning/dns/what-is-1.1.1.1 + '8.8.8.8' // * https://developers.google.com/speed/public-dns + ] +}); for (const variable in process.env) { if (variable.startsWith('SSSL_DNS_MAP')) { @@ -107,6 +115,9 @@ const server = createServer({ // * Assume Wiimmfi. WiiLink NAS will not work with our DNS // * NOTE - This still points conntest.nintendowifi.net to OUR servers, since the Wii U also uses it response = await wiimmfiResolver.resolve('nas.nintendowifi.net'); + } else { + // * Fallback to public DNS servers for everything else + response = await fallbackResolver.resolve(name); } } catch { // * Eat errors for now From 5f4cdbc7dde8fb39456e1454321bf29c28d62109 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Mon, 27 Jan 2025 17:05:14 -0500 Subject: [PATCH 4/4] fix(dns): pass the name to wiimmfi resolver --- dns/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dns/src/server.ts b/dns/src/server.ts index 1b9c38b..987d5df 100644 --- a/dns/src/server.ts +++ b/dns/src/server.ts @@ -114,7 +114,7 @@ const server = createServer({ } else if (name.endsWith('nintendowifi.net')) { // * Assume Wiimmfi. WiiLink NAS will not work with our DNS // * NOTE - This still points conntest.nintendowifi.net to OUR servers, since the Wii U also uses it - response = await wiimmfiResolver.resolve('nas.nintendowifi.net'); + response = await wiimmfiResolver.resolve(name); } else { // * Fallback to public DNS servers for everything else response = await fallbackResolver.resolve(name);