778aa4f83d
* Remove fullSize return from compressionLenSearch This wasn't used anywhere but TestCompressionLenSearch, and was very wrong. * Add generated compressedLen functions and use them This replaces the confusing and complicated compressionLenSlice function. * Use compressedLenWithCompressionMap even for uncompressed This leaves the len() functions unused and they'll soon be removed. This also fixes the off-by-one error of compressedLen when a (Q)NAME is ".". * Use Len helper instead of RR.len private method * Merge len and compressedLen functions * Merge compressedLen helper into Msg.Len * Remove compress bool from compressedLenWithCompressionMap * Merge map insertion into compressionLenSearch This eliminates the need to loop over the domain name twice when we're compressing the name. * Use compressedNameLen for NSEC.NextDomain This was a mistake. * Remove compress from RR.len * Add test case for multiple questions length * Add test case for MINFO and SOA compression These are the only RRs with multiple compressible names within the same RR, and they were previously broken. * Rename compressedNameLen to domainNameLen It also handles the length of uncompressed domain names. * Use off directly instead of len(s[:off]) * Move initial maxCompressionOffset check out of compressionLenMapInsert This should allow us to avoid the call overhead of compressionLenMapInsert in certain limited cases and may result in a slight performance increase. compressionLenMapInsert still has a maxCompressionOffset check inside the for loop. * Rename compressedLenWithCompressionMap to msgLenWithCompressionMap This better reflects that it also calculates the uncompressed length. * Merge TestMsgCompressMINFO with TestMsgCompressSOA They're both testing the same thing. * Remove compressionLenMapInsert compressionLenSearch does everything compressionLenMapInsert did anyway. * Only call compressionLenSearch in one place in domainNameLen * Split if statement in domainNameLen The last two commits worsened the performance of domainNameLen noticably, this change restores it's original performance. name old time/op new time/op delta MsgLength-12 550ns ±13% 510ns ±21% ~ (p=0.050 n=10+10) MsgLengthNoCompression-12 26.9ns ± 2% 27.0ns ± 1% ~ (p=0.198 n=9+10) MsgLengthPack-12 2.30µs ±12% 2.26µs ±16% ~ (p=0.739 n=10+10) MsgLengthMassive-12 32.9µs ± 7% 32.0µs ±10% ~ (p=0.243 n=9+10) MsgLengthOnlyQuestion-12 9.60ns ± 1% 9.20ns ± 1% -4.16% (p=0.000 n=9+9) * Remove stray newline from TestMsgCompressionMultipleQuestions * Remove stray newline in length_test.go This was introduced when resolving merge conflicts. |
||
---|---|---|
dnsutil | ||
vendor/golang.org/x | ||
.codecov.yml | ||
.gitignore | ||
.travis.yml | ||
AUTHORS | ||
CONTRIBUTORS | ||
COPYRIGHT | ||
Gopkg.lock | ||
Gopkg.toml | ||
LICENSE | ||
Makefile.fuzz | ||
Makefile.release | ||
README.md | ||
acceptfunc.go | ||
client.go | ||
client_test.go | ||
clientconfig.go | ||
clientconfig_test.go | ||
dane.go | ||
defaults.go | ||
dns.go | ||
dns_bench_test.go | ||
dns_test.go | ||
dnssec.go | ||
dnssec_keygen.go | ||
dnssec_keyscan.go | ||
dnssec_privkey.go | ||
dnssec_test.go | ||
doc.go | ||
duplicate.go | ||
duplicate_generate.go | ||
duplicate_test.go | ||
dyn_test.go | ||
edns.go | ||
edns_test.go | ||
example_test.go | ||
format.go | ||
fuzz.go | ||
generate.go | ||
generate_test.go | ||
issue_test.go | ||
labels.go | ||
labels_test.go | ||
leak_test.go | ||
length_test.go | ||
listen_go111.go | ||
listen_go_not111.go | ||
msg.go | ||
msg_generate.go | ||
msg_helpers.go | ||
msg_helpers_test.go | ||
msg_test.go | ||
nsecx.go | ||
nsecx_test.go | ||
parse_test.go | ||
privaterr.go | ||
privaterr_test.go | ||
rawmsg.go | ||
remote_test.go | ||
reverse.go | ||
rr_test.go | ||
sanitize.go | ||
sanitize_test.go | ||
scan.go | ||
scan_rr.go | ||
scan_test.go | ||
serve_mux.go | ||
serve_mux_test.go | ||
server.go | ||
server_test.go | ||
sig0.go | ||
sig0_test.go | ||
singleinflight.go | ||
smimea.go | ||
tlsa.go | ||
tsig.go | ||
tsig_test.go | ||
types.go | ||
types_generate.go | ||
types_test.go | ||
udp.go | ||
udp_test.go | ||
udp_windows.go | ||
update.go | ||
update_test.go | ||
version.go | ||
version_test.go | ||
xfr.go | ||
zduplicate.go | ||
zmsg.go | ||
ztypes.go |
README.md
Alternative (more granular) approach to a DNS library
Less is more.
Complete and usable DNS library. All Resource Records are supported, including the DNSSEC types. It follows a lean and mean philosophy. If there is stuff you should know as a DNS programmer there isn't a convenience function for it. Server side and client side programming is supported, i.e. you can build servers and resolvers with it.
We try to keep the "master" branch as sane as possible and at the bleeding edge of standards, avoiding breaking changes wherever reasonable. We support the last two versions of Go.
Goals
- KISS;
- Fast;
- Small API. If it's easy to code in Go, don't make a function for it.
Users
A not-so-up-to-date-list-that-may-be-actually-current:
- https://github.com/coredns/coredns
- https://cloudflare.com
- https://github.com/abh/geodns
- http://www.statdns.com/
- http://www.dnsinspect.com/
- https://github.com/chuangbo/jianbing-dictionary-dns
- http://www.dns-lg.com/
- https://github.com/fcambus/rrda
- https://github.com/kenshinx/godns
- https://github.com/skynetservices/skydns
- https://github.com/hashicorp/consul
- https://github.com/DevelopersPL/godnsagent
- https://github.com/duedil-ltd/discodns
- https://github.com/StalkR/dns-reverse-proxy
- https://github.com/tianon/rawdns
- https://mesosphere.github.io/mesos-dns/
- https://pulse.turbobytes.com/
- https://github.com/fcambus/statzone
- https://github.com/benschw/dns-clb-go
- https://github.com/corny/dnscheck for http://public-dns.info/
- https://namesmith.io
- https://github.com/miekg/unbound
- https://github.com/miekg/exdns
- https://dnslookup.org
- https://github.com/looterz/grimd
- https://github.com/phamhongviet/serf-dns
- https://github.com/mehrdadrad/mylg
- https://github.com/bamarni/dockness
- https://github.com/fffaraz/microdns
- http://kelda.io
- https://github.com/ipdcode/hades https://jd.com
- https://github.com/StackExchange/dnscontrol/
- https://www.dnsperf.com/
- https://dnssectest.net/
- https://dns.apebits.com
- https://github.com/oif/apex
- https://github.com/jedisct1/dnscrypt-proxy
- https://github.com/jedisct1/rpdns
- https://github.com/xor-gate/sshfp
- https://github.com/rs/dnstrace
- https://blitiri.com.ar/p/dnss (github mirror)
- https://github.com/semihalev/sdns
Send pull request if you want to be listed here.
Features
- UDP/TCP queries, IPv4 and IPv6
- RFC 1035 zone file parsing ($INCLUDE, $ORIGIN, $TTL and $GENERATE (for all record types) are supported
- Fast
- Server side programming (mimicking the net/http package)
- Client side programming
- DNSSEC: signing, validating and key generation for DSA, RSA, ECDSA and Ed25519
- EDNS0, NSID, Cookies
- AXFR/IXFR
- TSIG, SIG(0)
- DNS over TLS (DoT): encrypted connection between client and server over TCP
- DNS name compression
Have fun!
Miek Gieben - 2010-2012 - miek@miek.nl DNS Authors 2012-
Building
Building is done with the go
tool. If you have setup your GOPATH correctly, the following should
work:
go get github.com/miekg/dns
go build github.com/miekg/dns
Examples
A short "how to use the API" is at the beginning of doc.go (this also will show
when you call godoc github.com/miekg/dns
).
Example programs can be found in the github.com/miekg/exdns
repository.
Supported RFCs
all of them
- 103{4,5} - DNS standard
- 1348 - NSAP record (removed the record)
- 1982 - Serial Arithmetic
- 1876 - LOC record
- 1995 - IXFR
- 1996 - DNS notify
- 2136 - DNS Update (dynamic updates)
- 2181 - RRset definition - there is no RRset type though, just []RR
- 2537 - RSAMD5 DNS keys
- 2065 - DNSSEC (updated in later RFCs)
- 2671 - EDNS record
- 2782 - SRV record
- 2845 - TSIG record
- 2915 - NAPTR record
- 2929 - DNS IANA Considerations
- 3110 - RSASHA1 DNS keys
- 3225 - DO bit (DNSSEC OK)
- 340{1,2,3} - NAPTR record
- 3445 - Limiting the scope of (DNS)KEY
- 3597 - Unknown RRs
- 403{3,4,5} - DNSSEC + validation functions
- 4255 - SSHFP record
- 4343 - Case insensitivity
- 4408 - SPF record
- 4509 - SHA256 Hash in DS
- 4592 - Wildcards in the DNS
- 4635 - HMAC SHA TSIG
- 4701 - DHCID
- 4892 - id.server
- 5001 - NSID
- 5155 - NSEC3 record
- 5205 - HIP record
- 5702 - SHA2 in the DNS
- 5936 - AXFR
- 5966 - TCP implementation recommendations
- 6605 - ECDSA
- 6725 - IANA Registry Update
- 6742 - ILNP DNS
- 6840 - Clarifications and Implementation Notes for DNS Security
- 6844 - CAA record
- 6891 - EDNS0 update
- 6895 - DNS IANA considerations
- 6975 - Algorithm Understanding in DNSSEC
- 7043 - EUI48/EUI64 records
- 7314 - DNS (EDNS) EXPIRE Option
- 7477 - CSYNC RR
- 7828 - edns-tcp-keepalive EDNS0 Option
- 7553 - URI record
- 7858 - DNS over TLS: Initiation and Performance Considerations
- 7871 - EDNS0 Client Subnet
- 7873 - Domain Name System (DNS) Cookies (draft-ietf-dnsop-cookies)
- 8080 - EdDSA for DNSSEC
Loosely Based Upon
- ldns - https://nlnetlabs.nl/projects/ldns/about/
- NSD - https://nlnetlabs.nl/projects/nsd/about/
- Net::DNS - http://www.net-dns.org/
- GRONG - https://github.com/bortzmeyer/grong