

{"id":2564,"date":"2013-08-12T22:17:33","date_gmt":"2013-08-13T03:17:33","guid":{"rendered":"http:\/\/rud.is\/b\/?p=2564"},"modified":"2017-04-02T22:51:49","modified_gmt":"2017-04-03T03:51:49","slug":"reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/","title":{"rendered":"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous)"},"content":{"rendered":"<p>R lacks some of the more &#8220;utilitarian&#8221; features found in other scripting languages that were\/are more geared&mdash;at least initially&mdash;towards systems administration. One of the most frustrating missing pieces for security data scientists is the lack of ability to perform basic IP address manipulations, including reverse DNS resolution (even though it <em>has<\/em> <code>nsl()<\/code> which is just glue to <code>gethostbyname()<\/code>!). <\/p>\n<p>If you need to perform reverse resolution, the only two viable options available are to (a) pre-resolve a list of IP addresses or (b) whip up something in R that takes advantage of the ability to perform system calls. Yes, one <em>could<\/em> write a C\/C++ API library that accesses native resolver routines, but that becomes a pain to maintain across platforms. System calls also create some cross-platform issues, but they are usually easier for the typical R user to overcome.<\/p>\n<p>Assuming the <code>dig<\/code> command is available on your linux, BSD or Mac OS system, it&#8217;s pretty trivial to pass in a list of IP addresses to a simple <code>sapply()<\/code> one-liner:<\/p>\n<pre lang=\"rsplus\">resolved = sapply(ips, function(x) system(sprintf(\"dig -x %s +short\",x), intern=TRUE))<\/pre>\n<p>That works for fairly small lists of addresses, but doesn&#8217;t scale well to hundreds or thousands of addresses. (Also, @jayjacobs kinda hates my one-liners #true.)<\/p>\n<p>A better way is to generate a batch query to <code>dig<\/code>, but the results will be synchronous, which could take A Very Long Time depending on the size of the list and types of results.<\/p>\n<p>The best way (IMO) to tackle this problem is to perform an asynchronous batch query and post-process the results, which we can do with a little help from <a href=\"http:\/\/www.chiark.greenend.org.uk\/~ian\/adns\/\"><code>adns<\/code><\/a> (which <a href=\"https:\/\/github.com\/Homebrew\/legacy-homebrew\">homebrew<\/a> users can install with a quick &#8220;<code>brew install adns<\/code>&#8220;).<\/p>\n<p>Once <code>adns<\/code> is installed, it&#8217;s just a matter of writing out a query list, performing the asynchronous batch lookup, parsing the results and re-integrating with the original IP list (which is necessary since errant or unresponsive reverse queries will not be returned by the <code>adns<\/code> system call).<\/p>\n<pre lang=\"rsplus\">#pretend this is A Very Long List of IPs\r\nip.list = c(\"1.1.1.1\", \"2.3.4.99\", \"1.1.1.2\", \"2.3.4.100\", \"70.196.7.32\", \r\n  \"146.160.21.171\", \"146.160.21.172\", \"146.160.21.186\", \"2.3.4.101\", \r\n  \"216.167.176.93\", \"1.1.1.3\", \"2.3.4.5\", \"2.3.4.88\", \"2.3.4.9\", \r\n  \"98.208.205.1\", \"24.34.218.80\", \"159.127.124.209\", \"70.196.198.151\", \r\n  \"70.192.72.48\", \"173.192.34.24\", \"65.214.243.208\", \"173.45.242.179\", \r\n  \"184.106.97.102\", \"198.61.171.18\", \"71.184.118.37\", \"70.215.200.159\", \r\n  \"184.107.87.105\", \"174.121.93.90\", \"172.17.96.139\", \"108.59.250.112\", \r\n  \"24.63.14.4\")\r\n\r\n# \"ips\" is a list of IP addresses\r\nip.to.host <- function(ips) {\r\n  # save out a list of IP addresses in adnshost reverse query format\r\n  # if you're going to be using this in \"production\", you *might*\r\n  # want to consider using tempfile() #justsayin\r\n  writeLines(laply(ips, function(x) sprintf(\"-i%s\",x)),\"\/tmp\/ips.in\")\r\n  # call adnshost with the file\r\n  # requires adnshost :: http:\/\/www.chiark.greenend.org.uk\/~ian\/adns\/\r\n  system.output <- system(\"cat \/tmp\/ips.in | adnshost -f\",intern=TRUE)\r\n  # keep our file system tidy\r\n  unlink(\"\/tmp\/ips.in\")\r\n  # clean up the result\r\n  cleaned.result <- gsub(\"\\\\.in-addr\\\\.arpa\",\"\",system.output)\r\n  # split the reply\r\n  split.result <- strsplit(cleaned.result,\" PTR \")\r\n  # make a data frame of the reply\r\n  result.df <- data.frame(do.call(rbind, lapply(split.result, rbind)))\r\n  colnames(result.df) <- c(\"IP\",\"hostname\")\r\n  # reverse the octets in the IP address list\r\n  result.df$IP <- sapply(as.character(result.df$IP), function(x) {\r\n    y <- unlist(strsplit(x,\"\\\\.\"))\r\n    sprintf(\"%s.%s.%s.%s\",y[4],y[3],y[2],y[1])\r\n  })\r\n  # fill errant lookups with \"NA\"\r\n  final.result <- merge(ips,result.df,by.x=\"x\",by.y=\"IP\",all.x=TRUE)\r\n  colnames(final.result) = c(\"IP\",\"hostname\")\r\n  return(final.result)\r\n}\r\n\r\nresolved.df <- ip.to.host(ip.list)\r\nhead(resolved.df,n=10)\r\n\r\n                IP                                   hostname\r\n1          1.1.1.1                                       <NA>\r\n2          1.1.1.2                                       <NA>\r\n3          1.1.1.3                                       <NA>\r\n4   108.59.250.112      vps-1068142-5314.manage.myhosting.com\r\n5   146.160.21.171                                       <NA>\r\n6   146.160.21.172                                       <NA>\r\n7   146.160.21.186                                       <NA>\r\n8  159.127.124.209                                       <NA>\r\n9    172.17.96.139                                       <NA>\r\n10   173.192.34.24 173.192.34.24-static.reverse.softlayer.com<\/pre>\n<p>If you wish to suppress <code>adns<\/code> error messages and any resultant R warnings, you can add an &#8220;<code>ignore.stderr=TRUE<\/code>&#8221; to the <code>system()<\/code> call and an &#8220;<code>options(warn=-1)<\/code>&#8221; to the function itself (remember to get\/reset the current value). I kinda like leaving them in, though, as it shows progress is being made.<\/p>\n<p>Whether you end up using a one-liner or the asynchronous function, it would be a spiffy idea to setup a local caching server, such as <a href=\"http:\/\/unbound.net\/\">Unbound<\/a>, to speed up subsequent queries (because you will undoubtedly have subsequent queries unless your R scripts are perfect on the first go-round).<\/p>\n<p>If you&#8217;ve solved the &#8220;efficient reverse DNS query problem&#8221; a different way in R, drop a note in the comments! I know quite a few folks who&#8217;d love to buy you tasty beverage!<\/p>\n<p>You can find similar, handy IP address and other security-oriented R code in our (me &#038; @jayjacobs&#8217;) upcoming <a href=\"https:\/\/www.amazon.com\/Security-Using-Analysis-Visualization-Dashboards\/dp\/1118793722\/ref=sr_1_1?ie=UTF8&amp;qid=1374598875&amp;sr=8-1&amp;keywords=bob+rudis\">book<\/a> on security data analysis and visualization. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>R lacks some of the more &#8220;utilitarian&#8221; features found in other scripting languages that were\/are more geared&mdash;at least initially&mdash;towards systems administration. One of the most frustrating missing pieces for security data scientists is the lack of ability to perform basic IP address manipulations, including reverse DNS resolution (even though it has nsl() which is just [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[677,74,641,3,87,7,91,696],"tags":[],"class_list":["post-2564","post","type-post","status-publish","format-standard","hentry","category-data-analysis-2","category-dns","category-homebrew","category-information-security","category-open-source","category-programming","category-r","category-threat-intelligence"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous) - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous) - rud.is\" \/>\n<meta property=\"og:description\" content=\"R lacks some of the more &#8220;utilitarian&#8221; features found in other scripting languages that were\/are more geared&mdash;at least initially&mdash;towards systems administration. One of the most frustrating missing pieces for security data scientists is the lack of ability to perform basic IP address manipulations, including reverse DNS resolution (even though it has nsl() which is just [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2013-08-13T03:17:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-03T03:51:49+00:00\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous)\",\"datePublished\":\"2013-08-13T03:17:33+00:00\",\"dateModified\":\"2017-04-03T03:51:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\"},\"wordCount\":477,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\"},\"articleSection\":[\"Data Analysis\",\"DNS\",\"homebrew\",\"Information Security\",\"Open Source\",\"Programming\",\"R\",\"Threat Intelligence\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\",\"url\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\",\"name\":\"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous) - rud.is\",\"isPartOf\":{\"@id\":\"https:\/\/rud.is\/b\/#website\"},\"datePublished\":\"2013-08-13T03:17:33+00:00\",\"dateModified\":\"2017-04-03T03:51:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/rud.is\/b\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/rud.is\/b\/#website\",\"url\":\"https:\/\/rud.is\/b\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/rud.is\/b\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\/\/rud.is\"],\"url\":\"https:\/\/rud.is\/b\/author\/hrbrmstr\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous) - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/","og_locale":"en_US","og_type":"article","og_title":"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous) - rud.is","og_description":"R lacks some of the more &#8220;utilitarian&#8221; features found in other scripting languages that were\/are more geared&mdash;at least initially&mdash;towards systems administration. One of the most frustrating missing pieces for security data scientists is the lack of ability to perform basic IP address manipulations, including reverse DNS resolution (even though it has nsl() which is just [&hellip;]","og_url":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/","og_site_name":"rud.is","article_published_time":"2013-08-13T03:17:33+00:00","article_modified_time":"2017-04-03T03:51:49+00:00","author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous)","datePublished":"2013-08-13T03:17:33+00:00","dateModified":"2017-04-03T03:51:49+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/"},"wordCount":477,"commentCount":2,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"articleSection":["Data Analysis","DNS","homebrew","Information Security","Open Source","Programming","R","Threat Intelligence"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/","url":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/","name":"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous) - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"datePublished":"2013-08-13T03:17:33+00:00","dateModified":"2017-04-03T03:51:49+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2013\/08\/12\/reverse-ip-address-lookups-with-r-from-simple-to-bulkasynchronous\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Reverse IP Address Lookups With R (From Simple To Bulk\/Asynchronous)"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-Fm","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":3880,"url":"https:\/\/rud.is\/b\/2016\/01\/08\/iptools-0-3-0-violet-packet-now-on-cran-with-windows-support\/","url_meta":{"origin":2564,"position":0},"title":"iptools 0.3.0 (&#8220;Violet Packet&#8221;) Now on CRAN with Windows Support!","author":"hrbrmstr","date":"2016-01-08","format":false,"excerpt":"`iptools` is a set of tools for working with IP addresses. Not just work, but work _fast_. It's backed by `Rcpp` and now uses the [AsioHeaders](http:\/\/dirk.eddelbuettel.com\/blog\/2016\/01\/07\/#asioheaders_1.11.0-1) package by Dirk Eddelbuettel, which means it no longer needs to _link_ against the monolithic Boost libraries and *works on Windows*! What can you\u2026","rel":"","context":"In &quot;Cybersecurity&quot;","block_context":{"text":"Cybersecurity","link":"https:\/\/rud.is\/b\/category\/cybersecurity\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":9386,"url":"https:\/\/rud.is\/b\/2018\/04\/01\/more-options-for-querying-dns-from-r-with-1-1-1-1\/","url_meta":{"origin":2564,"position":1},"title":"More Options For Querying DNS From R with 1.1.1.1","author":"hrbrmstr","date":"2018-04-01","format":false,"excerpt":"You have to have been living under a rock to not know about Cloudflare's new 1.1.1.1 DNS offering. I won't go into \"privacy\", \"security\" or \"speed\" concepts in this post since that's a pretty huge topic to distill for folks given the, now, plethora of confusing (and pretty technical) options\u2026","rel":"","context":"In &quot;DNS&quot;","block_context":{"text":"DNS","link":"https:\/\/rud.is\/b\/category\/dns\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12383,"url":"https:\/\/rud.is\/b\/2019\/06\/28\/quick-hit-dig-ging-into-dns-records-with-processx\/","url_meta":{"origin":2564,"position":2},"title":"Quick hit: &#8216;dig&#8217;-ging Into r-project.org DNS Records with {processx}","author":"hrbrmstr","date":"2019-06-28","format":false,"excerpt":"The r-project.org domain had some temporary technical difficulties this week (2019-29) that made reaching R-related resources problematic for a bunch of folks for a period of time. Incidents like this underscore the need for regional and network diversity when it comes to ensuring the availability of DNS services. That is,\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4547,"url":"https:\/\/rud.is\/b\/2016\/07\/24\/mid-year-r-packages-update-summary\/","url_meta":{"origin":2564,"position":3},"title":"Mid-year R Packages Update Summary","author":"hrbrmstr","date":"2016-07-24","format":false,"excerpt":"I been updating some existing packages and github-releasing new ones (before a CRAN push). Most are \"cyber\"-related, but there are some general purpose ones. Here's a quick overview: docxtractr (CRAN, now, v0.2.0) was initially designed to make it easy to get data tables out of MS Word (docx) documents. The\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4267,"url":"https:\/\/rud.is\/b\/2016\/04\/11\/clandestine-dns-lookups-with-gdns\/","url_meta":{"origin":2564,"position":4},"title":"Clandestine DNS lookups with gdns","author":"hrbrmstr","date":"2016-04-11","format":false,"excerpt":"Google recently [announced](https:\/\/developers.google.com\/speed\/public-dns\/docs\/dns-over-https) their DNS-over-HTTPS API, which _\"enhances privacy and security between a client and a recursive resolver, and complements DNSSEC to provide end-to-end authenticated DNS lookups\"_. The REST API they provided was pretty simple to [wrap into a package](https:\/\/github.com\/hrbrmstr\/gdns) and I tossed in some [SPF](http:\/\/www.openspf.org\/SPF_Record_Syntax) functions that I had\u2026","rel":"","context":"In &quot;APIs&quot;","block_context":{"text":"APIs","link":"https:\/\/rud.is\/b\/category\/apis\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/Fullscreen_4_11_16__1_10_AM.png?fit=1173%2C1013&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/Fullscreen_4_11_16__1_10_AM.png?fit=1173%2C1013&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/Fullscreen_4_11_16__1_10_AM.png?fit=1173%2C1013&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/Fullscreen_4_11_16__1_10_AM.png?fit=1173%2C1013&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/04\/Fullscreen_4_11_16__1_10_AM.png?fit=1173%2C1013&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":129,"url":"https:\/\/rud.is\/b\/2011\/02\/14\/metricon-name-server-log-data\/","url_meta":{"origin":2564,"position":5},"title":"Metricon: Name Server Log Data","author":"hrbrmstr","date":"2011-02-14","format":false,"excerpt":"Speakers: Fruhwirth, Proschinger, Lendl, Savola \"On the use of name server log data as input for security measurements\" \u00a0 CERT.at ERT coordinate sec efforts & inc resp for IT sec prblms on a national level in Austria constituted of IT company security teams and local CERTs \u00a0 Why name server\u2026","rel":"","context":"In &quot;Information Security&quot;","block_context":{"text":"Information Security","link":"https:\/\/rud.is\/b\/category\/information-security\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/2564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=2564"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/2564\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=2564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=2564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=2564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}