Two New Ways to Make DNS over HTTPS Queries in R
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
A fair bit of time ago the {gdns}
package made its way to CRAN to give R users the ability to use Google’s (at that time) nascent support for DNS over HTTPS (DoH). A bit later on Cloudflare also provided a global DoH endpoint and that begat the (not-on-CRAN) {dnsflare}
package.
There are actually two ways to make these DoH queries: one via an HTTPS GET
REST API and the other via HTTPS POST
queries that use DNS wireformat queries and replies. While the POST
side of DoH is pretty standardized/uniform the GET
/REST API side is kind of the Wild West. I wanted a way to have support for both wireformat and REST idioms but also not have to write a gazillion packages to support the eventual plethora of diverse DoH GET
/REST API services.
I “solved” this by first augmenting my (not-on-CRAN) {clandnstine}
package to support the POST
wireformat DoH queries (since the underlying {getdns} library
supports decoding wireformat responses]) and creating a very small {playdoh}
package which provided generic support for (hopefully) any DoH GET
/REST endpoint.
DoH vs DoT
I made the {clandnstine}
package primarily to support making DNS over TLS (DoT) queries but it makes sense to combine both DoH and DoT functionality into that package. The problem is that the legacy platform most of y’all R users are on (i.e. Windows) makes using that package problematic. Therefore, by separating out the DoH GET
functionality into a standalone package I don’t have to write a DNS wireformat pure R response handler.
There are performance and other differences between DoH and DoT. I suspect most DNS providers and also most open source DNS server will eventually support both DoH and DoT so which one you use will be up to your clients and use cases.
A Tale of Two (or More) Queries
We’ll issue a few queries over DoH and DoT to a few servers to ensure we’re getting the same results.
library(clandnstine) # both of these are on sourcehut (~hrbrmstr/pkgname), library(playdoh) # or gitlab/gitugh (hrbrmstr/pkgname) # DoT x <- gdns_context() gdns_query(x, "example.com", rr_type = "a")$just_address_answers$address_data ## [1] "93.184.216.34" # DoH POST (wireformat) doh_post("example.com", "a", server_path = doh_servers$quad9$url)$answer$rdata$ipv4_address ## [1] "93.184.216.34" # DoH GET (rest) doh_get("example.com", "a", service_path = doh_servers$securedns_eu$url)$data[1] ## [1] "93.184.216.34"
To support the, er, diversity of requirements across various GET
/REST endpoints the playdoh::doh_get()
function has an extra_params
parameter which lets you specify any required extra REST query params. Both packages have an exposed global variable doh_servers
which has both the URL and any required extra parameters.
FIN
As usual, kick the tyres, file issues and PRs where you like and if you do end up using either package drop a note in the comments.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.