Last active
November 27, 2025 04:05
-
-
Save a7md0/82e04e6b26bfd92d4a5bd4901e0822f7 to your computer and use it in GitHub Desktop.
Generate dns-rr line that can be used in dnsmasq for SVCB and possibly HTTPS records for DNS over HTTPS (DoH), DNS over QUIC (DoQ) and possibly DNS over TLS (DoT)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| import json | |
| import binascii | |
| # pip3 install dnspython | |
| import dns.name | |
| import dns.rdataclass | |
| import dns.rdatatype | |
| import dns.rdata | |
| def encode_rr_line(owner: str, rdata_text: str, rdatatype: dns.rdatatype): | |
| rdata = dns.rdata.from_text(dns.rdataclass.IN, rdatatype, rdata_text) | |
| rdata_wire = rdata.to_wire(origin=None, compress=False) | |
| rdata_type_number = int(rdatatype) | |
| hex_encoded = binascii.hexlify(rdata_wire).decode().upper() | |
| # dnsmasq output | |
| dns_rr_line = f'dns-rr={owner},{rdata_type_number},{hex_encoded}' | |
| return { | |
| "rdata_text": rdata_text, | |
| 'dns_rr_line': dns_rr_line, | |
| 'rdatatype': rdatatype.name | |
| } | |
| owner = '_dns.resolver.arpa.' | |
| host = 'unbound.local.' | |
| svcb_doh_rdata = f'1 {host} alpn="h2" port=443 ipv4hint=192.168.2.254 ipv6hint=fd2c:7841:b288:: key7="/dns-query{{?dns}}"' | |
| svcb_doh = encode_rr_line(owner, svcb_doh_rdata, dns.rdatatype.SVCB) | |
| print(json.dumps(svcb_doh, indent=4)) | |
| svcb_dot_rdata = f'2 {host} alpn="dot" port=853 ipv4hint=192.168.2.254 ipv6hint=fd2c:7841:b288::' | |
| svcb_dot = encode_rr_line(owner, svcb_dot_rdata, dns.rdatatype.SVCB) | |
| print(json.dumps(svcb_dot, indent=4)) | |
| # Warning: Didn't work parsing error on response | |
| # https_doh_rdata = f'1 {host} alpn="h2" port=443 ipv4hint=192.168.2.254 ipv6hint=fd2c:7841:b288:: dohpath="/dns-query"' | |
| # https_doh = encode_rr_line(owner, https_doh_rdata, dns.rdatatype.HTTPS) | |
| # print(json.dumps(https_doh, indent=4)) |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
dnsmasq return zero TTL when using
dns-rrentries, which can be changed by declaringlocal-ttl=60