GENREPORT(1)
π GENREPORT π
okay bestie, gather round, because this is genreport from section 1 of the manual, and it is literally the girlboss of DNS compliance checking. no cap. π
β¨ NAME β¨
genreport β generate a report about DNS server compliance. π©Ίβ¨
πΈ SYNOPSIS πΈ
genreport [-46abBcdDeEfjLnopPRstT] [-i test] [-I test] [-m
maxoutstanding] [-r server]
π¦ DESCRIPTION π¦
so what does she do, you ask? genreport tests DNS servers' responses to a whole variety of different queries, and then remotes if the response is compliant with the relevant RFCs. she's basically the vibe check for your DNS server, and she does not let things slide. π
genreport takes a list of zone names, with optional server names and/or IP address, one per line. and here's the tea on how she picks what to test, because it's lowkey order dependent:
- if you only give her the zone name, she looks up the list of name servers for the zone, and then the addresses of all the servers for those name servers. full detective mode. π
- if you give her the zone and the name server name, then only the addresses of that one name server get used for testing. narrowed down, iconic.
- if you give her zone, server and address, then only that address gets used for testing. periodt.
oh and heads up β the server is a placeholder field. it's just there to look cute in the report, she's not doing anything with it. π
there are four groupings of tests: EDNS (which is the default), FULL (which includes EDNS), COMMON, and TYPE.
β οΈ Options are order dependent. like, actually order dependent. this is not a drill. the order you type them in changes what happens. π
π OPTIONS π
one bullet per flag, no skips, we're doing all of them because we're thorough like that:
-4β only query IPv4 servers.-6β only query IPv6 servers.-aβ only emit'all ok'rather than a result for each sub test. so she just says "yeah it's fine" and moves on. chill of her honestly.-Aβ only emit'all (ok|refused|servfail|timeout)'rather than a result for each sub test, taking into account EDNS version processing. so like-abut she's also clocking the EDNS version drama.-bβ only emit bad servers. if she's gonna talk, it's gonna be to call someone out. π-Bβ only emit bad tests.-cβ add common queries to the set of tests to be made.-dβ enable debugging.-Dβ list tests and matchingdigcommand.-eβ edns test.-Eβ EDNS only. only emit a report if there has been a valid EDNS response. no valid EDNS, no report, she's not entertaining it. π-fβ add full mode tests (includes edns).-gβ look for glue (nameserver, address pairs) then qualify matching zone, ns pairs.-Gβ only use glue to qualify zone, ns pairs.-itest β add a individual test.-Itest β remove a individual test.-hβ emit json. π¦-Lβ list tests and their grouping.-mmaxoutstanding β set the maximum number of outstanding DNS queries in progress. keep the chaos contained bestie.-nβ report the NSID value if found.-oβ restore the output order rather than printing each server as the tests for that server complete. so the output stays in the order you fed it. neat freak behavior, we love it. π-pβ run tests in parallel. go fast, go furious.-Pport β specify a alternate port to query (default53).-rserver β use specified recursive server to look up name servers for a zone and addresses.-Rβ run recursive tests.-sβ serialize tests. one at a time, single file, no cutting. πΆββοΈ-tβ type tests (serial) β test the server's handling of different query types. This disables any previous-c,-e(default), and-fswitch. To get TYPE test with EDNS, FULL or COMM tests you need to specify them after the-tswitch.-Tβ print type list for type test (-t).-uβ only test a IP address once.-Uβ delay between UDP requests to a server in milliseconds (default:113, range:[0..1000]).
π«Ά okay that was a lot but you ate that, i'm proud of you.
π EXAMPLES π
these are the receipts, bestie. copy them exactly, i'm not joking, character for character. π
Test all servers for a zone
% echo isc.org | genreport -po
This runs all the tests in parallel against a server (-p) and the output order (-o) is preserved. parallel and tidy. main character energy honestly. β¨
Test a specific server for a zone by name
% echo isc.org ams.sns-pb.isc.org | genreport
Test a specific server for a zone by address
% echo isc.org ams.sns-pb.isc.org 199.6.1.30 | genreport
The server name is ignored other than to be placed in the report. told you she was just there for the aesthetic. π
Test all servers in the root zone
% dig axfr . | awk '$4 == "NS" { print $1, $5 }' > list
% genreport -so < list
This generates a seperate list as the AXFR will timeout when the pipeline stalls. The tests are run in serial (-s) against a server and the output is reordered to preserve the input order (-o).
β οΈ like, do the two-step thing. don't pipe it straight in, the AXFR will time out on you mid-pipeline and that's a whole mess. π
Test all servers in the root zone against the in-zone address records
% dig axfr . |
> tr '[a-z]' '[A-Z]' |
> awk '$4 == "NS" {
> ns[$1 " " $5] = $5
> }
> $4 == "A" {
> if (a[$1]) {
> a[$1] = a[$1] " " $5
> } else {
> a[$1] = $5
> }
> }
> $4 == "AAAA" {
> if (aaaa[$1]) {
> aaaa[$1] = aaaa[$1] " " $5
> } else {
> aaaa[$1] = $5
> }
> }
> END {
> for (n in ns) {
> split(n, k, " ")
> if (a[k[2]]) {
> split(a[k[2]], l, " ")
> for (m in l) print(n, l[m])
> }
> if (aaaa[k[2]]) {
> split(aaaa[k[2]], l, " ")
> for (m in l) print(n, l[m])
> }
> }
> }' |
> sort > list
% genreport -so < list
look at that awk. that's not me, that's you being a genius. we love a pipeline moment. π§
Test all the root servers handling of different query types.
echo . | genreport -ta
As the type list is long we also collapse the output to "all ok" (-a) if all subtests to a particular server succeed.
Test all the glue servers in a zone.
% dig axfr zone > file
% ( awk '$4 == "A" || $4 == "AAAA" { print $1, $5 }' file;
> awk '$4 == "NS" { print $1, $5 }' file ) | genreport -gG
Test a recursive server
For this you should give it the name of a zone with DNSSEC records if possible. like, do yourself a favor. π₯
echo isc.org localhost | genreport -R
or
echo isc.org . <address of server> | genreport -R
okay so that's part one and there is more coming, don't you dare close the tab β to be continued, bestie π
β¨ TESTS β¨
okay bestie, here's the whole menu of test types genreport can yeet at a server π Each one is a little mood, and each bullet tells you the test name, the category it lives in, and exactly what it sends. No skipping, we're doing all of them πΈ
dns(EDNS) β send a plain DNS query with type codeSOA.aa(FULL) β send a plain DNS query with type codeSOAandAAset to1.ad(FULL) β send a plain DNS query with type codeSOAandADset to1.cd(FULL) β send a plain DNS query with type codeSOAandCDset to1.ra(FULL) β send a plain DNS query with type codeSOAandRAset to1.rd(FULL) β send a plain DNS query with type codeSOAandRDset to1.tc(FULL) β send a plain DNS query with type codeSOAandTCset to1.zflag(FULL) β send a plain DNS query with type codeSOAand the remaining reserved DNS header flag set to1.opcode(FULL) β send a request with an unknown opcode (15).opcodeflg(FULL) β send a request with an unknown opcode (15) and these flag bits all set to1:tc,rd,ra,cd,ad,aa, andz.type666(FULL) β send a plain DNS query with type code666. This one exists to test unknown type code handling πtcp(FULL) β send a plain DNS query with type codeSOAover TCP.edns(EDNS) β send a EDNS version0query with type codeSOA.edns1(EDNS) β send a EDNS query with an unknown version (1) and type codeSOA.edns@512(EDNS) β send a EDNS version0query with type codeDNSKEY,DOset to1, and the EDNS buffer size set to512. This query is attempting to elicit a truncated EDNS response π«’ednsopt(EDNS) β send a EDNS version0query with type codeSOAand an undefined EDNS option code (100).edns1opt(EDNS) β send a EDNS query with an unknown version (1), type codeSOA, and an undefined EDNS option code (100).do(EDNS) β send a EDNS version0query with type codeSOAandDOset to1.docd(FULL) β send a FULL version0query with type codeSOA,DOset to1, andCDset to1.edns1do(FULL) β send a EDNS query with an unknown version (1), type codeSOA, andDOset to1.ednsflags(EDNS) β send a EDNS version0query with type codeSOAand an undefined EDNS flag bit set to1.optlist(EDNS) β send a EDNS version0query with type codeSOAand the EDNS optionsNSID,ECS,EXPIRE, andCOOKIE.ednsnsid(FULL) β send a EDNS version0query with type codeSOAand EDNS optionNSID.ednscookie(FULL) β send a EDNS version0query with type codeSOAand EDNS optionCOOKIE.ednsexpire(FULL) β send a EDNS version0query with type codeSOAand EDNS optionEXPIRE.ednssubnet(FULL) β send a EDNS version0query with type codeSOAand EDNS optionECS.edns1nsid(FULL) β send a EDNS query with an unknown version (1), type codeSOA, and EDNS optionNSID.edns1cookie(FULL) β send a EDNS query with an unknown version (1), type codeSOA, and EDNS optionCOOKIE.edns1expire(FULL) β send a EDNS query with an unknown version (1), type codeSOA, and EDNS optionEXPIRE.edns1subnet(FULL) β send a EDNS query with an unknown version (1), type codeSOA, and EDNS optionECS.ednstcp(EDNS) β send a EDNS version0query with type codeSOAover TCP.bind11(COMM) β send a query that is typical of whatnamedfrom BIND 9.11 sends.dig11(COMM) β send a query that is typical of whatdigfrom BIND 9.11 sends.dnswkkβ send a plain DNS request with TSIG signature. The key name is".", the algorithm is"hmac-sha256", and the secret is 0-32 zero bytes.icmpβ send a icmp / icmp6 echo request.
π the TYPE girlies (one for every type code, we love range)
A(TYPE) β send a plain DNS query with type codeA.NS(TYPE) β send a plain DNS query with type codeNS.MD(TYPE) β send a plain DNS query with type codeMD.MF(TYPE) β send a plain DNS query with type codeMF.CNAME(TYPE) β send a plain DNS query with type codeCNAME.SOA(TYPE) β send a plain DNS query with type codeSOA.MB(TYPE) β send a plain DNS query with type codeMB.MG(TYPE) β send a plain DNS query with type codeMG.MR(TYPE) β send a plain DNS query with type codeMR.NULL(TYPE) β send a plain DNS query with type codeNULL.WKS(TYPE) β send a plain DNS query with type codeWKS.PTR(TYPE) β send a plain DNS query with type codePTR.HINFO(TYPE) β send a plain DNS query with type codeHINFO.MINFO(TYPE) β send a plain DNS query with type codeMINFO.MX(TYPE) β send a plain DNS query with type codeMX.TXT(TYPE) β send a plain DNS query with type codeTXT.RP(TYPE) β send a plain DNS query with type codeRP.AFSDB(TYPE) β send a plain DNS query with type codeAFSDB.X25(TYPE) β send a plain DNS query with type codeX25.ISDN(TYPE) β send a plain DNS query with type codeISDN.RT(TYPE) β send a plain DNS query with type codeRT.NSAP(TYPE) β send a plain DNS query with type codeNSAP.NSAP-PTR(TYPE) β send a plain DNS query with type codeNSAP-PTR.SIG(TYPE) β send a plain DNS query with type codeSIG.KEY(TYPE) β send a plain DNS query with type codeKEY.PX(TYPE) β send a plain DNS query with type codePX.GPOS(TYPE) β send a plain DNS query with type codeGPOS.AAAA(TYPE) β send a plain DNS query with type codeAAAA.LOC(TYPE) β send a plain DNS query with type codeLOC.NXT(TYPE) β send a plain DNS query with type codeNXT.SRV(TYPE) β send a plain DNS query with type codeSRV.NAPTR(TYPE) β send a plain DNS query with type codeNAPTR.KX(TYPE) β send a plain DNS query with type codeKX.CERT(TYPE) β send a plain DNS query with type codeCERT.A6(TYPE) β send a plain DNS query with type codeA6.DNAME(TYPE) β send a plain DNS query with type codeDNAME.APL(TYPE) β send a plain DNS query with type codeAPL.DS(TYPE) β send a plain DNS query with type codeDS.SSHFP(TYPE) β send a plain DNS query with type codeSSHFP.IPSECKEY(TYPE) β send a plain DNS query with type codeIPSECKEY.RRSIG(TYPE) β send a plain DNS query with type codeRRSIG.NSEC(TYPE) β send a plain DNS query with type codeNSEC.DNSKEY(TYPE) β send a plain DNS query with type codeDNSKEY.DHCID(TYPE) β send a plain DNS query with type codeDHCID.NSEC3(TYPE) β send a plain DNS query with type codeNSEC3.NSEC3PARAM(TYPE) β send a plain DNS query with type codeNSEC3PARAM.TLSA(TYPE) β send a plain DNS query with type codeTLSA.SMIMEA(TYPE) β send a plain DNS query with type codeSMIME.HIP(TYPE) β send a plain DNS query with type codeHIP.CDS(TYPE) β send a plain DNS query with type codeCDS.CDNSKEY(TYPE) β send a plain DNS query with type codeCDNSKEY.OPENPGPKEY(TYPE) β send a plain DNS query with type codeOPENPGPKEY.SPF(TYPE) β send a plain DNS query with type codeSPF.NID(TYPE) β send a plain DNS query with type codeNID.L32(TYPE) β send a plain DNS query with type codeL32.L64(TYPE) β send a plain DNS query with type codeL64.LP(TYPE) β send a plain DNS query with type codeLP.EUI48(TYPE) β send a plain DNS query with type codeEUI48.EUI64(TYPE) β send a plain DNS query with type codeEUI64.URI(TYPE) β send a plain DNS query with type codeURI.CAA(TYPE) β send a plain DNS query with type codeCAA.AVC(TYPE) β send a plain DNS query with type codeAVC.DOA(TYPE) β send a plain DNS query with type codeDOA.DLV(TYPE) β send a plain DNS query with type codeDLV.TYPE1000(TYPE) β send a plain DNS query with type code1000. This one is here to test unknown type code handling π
π¦ SEE ALSO π¦
okay that's the whole page, you ate it all up bestie π if you wanna go poke at the neighbors, dig(1) and named(8) are right there.
mwah π this beauty came to you from the <b>Internet Systems Consortium</b>, dated <b>July 2025</b>, and the page itself is <code>GENREPORT()</code> β go forth and send weird packets responsibly πβ¨
π¦ where this page comes from
- fedora 43: DNS-Compliance-Testing 0^20230708git4aea40b-8.fc43 Β· MPL-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms