feat(core): recursive DNS server after Java, measured with Java FILIUS

The resolver runs on the events now (a query, its dnsQueryTimeout, its
answer at the socket); the blocking resolveDns waits for it, and a
recursive server uses it: its own records, else the zone's name server
from its records, else its own DNS server, else a referral
(DNSServer.answerWithRemoteData).

DnsRun plays five stories on the new dns-recursive network. Measured and
not taken: a server that is its zone's name server asks itself, which asks
itself again, without end (the client times out, then every level floods
its own DNS server); Java guards only the step through its own DNS server.
The core asks itself in neither step. That story is compared up to the
client's query (JAVA_UNTIL).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-30 18:46:32 +00:00
co-authored by Claude Opus 5.5
parent f5c61cdce7
commit 313786e738
13 changed files with 1570 additions and 91 deletions
+11
View File
@@ -12,6 +12,11 @@
// referral 192.168.0.20 asks for www.schule.de (A), referred to .11
// unknown 192.168.0.20 asks for x.unbekannt.org, which no one knows
// noServer 192.168.0.21 asks its DNS server 192.168.0.99, which is not there
//
// On dns-recursive's network .10 resolves recursively, its own DNS server is
// .11, and it holds filius.de's NS record, which names itself. There also:
// unknownInZone 192.168.0.20 asks for nix.schule.de, which .11 does not know
// unknownInOwnZone 192.168.0.20 asks for nix.filius.de, in .10's own zone
import filius.software.dns.Resolver;
@@ -62,6 +67,12 @@ public class DnsRun {
case "unknown":
call("holeIPAdresse x.unbekannt.org", () -> client.holeIPAdresse("x.unbekannt.org"));
break;
case "unknownInZone":
call("holeIPAdresse nix.schule.de", () -> client.holeIPAdresse("nix.schule.de"));
break;
case "unknownInOwnZone":
call("holeIPAdresse nix.filius.de", () -> client.holeIPAdresse("nix.filius.de"));
break;
case "noServer":
Resolver lost = network.system(LOST_CLIENT).holeDNSClient();
call("holeIPAdresse web.filius.de", () -> lost.holeIPAdresse("web.filius.de"));