Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Learning DNS in 10 years
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Julia Evans
February 01, 2023
Technology
230
0
Share
Learning DNS in 10 years
From RubyConf Mini 2022
Julia Evans
February 01, 2023
More Decks by Julia Evans
See All by Julia Evans
Blogging myths
jvns
0
3.5k
High Reliability Infrastructure migrations
jvns
10
13k
Building a Ruby profiler
jvns
2
420
Build impossible programs
jvns
23
94k
So you want to be a wizard
jvns
25
25k
Learning systems programming with Rust
jvns
14
8.2k
Systems programming is for everyone
jvns
12
3.2k
How to read your computer's mind
jvns
6
800
Why I ❤ Rust
jvns
50
54k
Other Decks in Technology
See All in Technology
AzureのIaC管理からログ調査まで、随所に役立つSkillsとCustom-Instructions / Boosting IaC and Log Analysis with Skills
aeonpeople
0
230
ぼくがかんがえたさいきょうのあうとぷっと
yama3133
0
190
Do Vibe Coding ao LLM em Produção para Busca Agêntica - TDC 2026 - Summit IA - São Paulo
jpbonson
3
120
ARIA Notifyについて
ryokatsuse
1
120
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
74k
AI時代 に増える データ活用先
takahal
0
230
クラウドネイティブな開発 ~ 認知負荷に立ち向かうためのコンテナ活用
literalice
0
130
AndroidアプリとCopilot Studioの統合
nakasho
0
100
Digitization部 紹介資料
sansan33
PRO
1
7.3k
AIでAIをテストする - 音声AIエージェントの品質保証戦略
morix1500
1
120
Eight Engineering Unit 紹介資料
sansan33
PRO
3
7.3k
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
530
Side Projects
sachag
455
43k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
220
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
Darren the Foodie - Storyboard
khoart
PRO
3
3.3k
Navigating Weather and Climate Data
rabernat
0
170
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.3k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
sira's awesome portfolio website redesign presentation
elsirapls
0
220
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Transcript
None
None
None
None
None
None
None
notice when you're confused read the specification do experiments spy
on it what's DNS? implement your own terrible version
None
None
None
None
None
notice when you're confused read the specification do experiments spy
on it what's DNS? implement your own terrible version
None
None
$ dig example.com example.com. 86400 IN A 93.184.216.34
$ dig example.com example.com. 86400 IN A 93.184.216.34
+noall +answer .digrc
None
None
None
None
None
browser resolver authoritative nameservers DNS query DNS query where's example.com?
where's example.com? 93.184.216.34! 93.184.216.34!
resolver browser what's the IP for example.com? hmm, I'll look
in my cache...
None
None
None
None
None
None
None
browser resolver authoritative nameservers DNS query DNS query where's new.jvns.ca?
where's new.jvns.ca? NXDOMAIN NXDOMAIN
None
None
None
“The TTL of this record is set from the minimum
of the MINIMUM field of the SOA record and the TTL of the SOA itself, and indicates how long a resolver may cache the negative answer.”
None
$ dig +all new.jvns.ca ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN,
id: 23308 [redacted] ;; AUTHORITY SECTION: jvns.ca. 10800 IN SOA ns1.gandi.net. hostmaster.gandi.net. 1662903879 10800 3600 604800 10800
None
None
None
None
None
None
None
None
browser resolver authoritative nameservers DNS query DNS query where's example.com?
where's example.com? 93.184.216.34! 93.184.216.34!
None
None
None
None
require 'socket' sock = UDPSocket.new sock.bind('0.0.0.0', 0) sock.connect('8.8.8.8', 53)
None
hex_string = "b9620100000100..." bytes = [hex_string].pack('H*') sock.send(bytes, 0)
b96201000001000000000000 076578616d706c6503636f6d0000010001
b96201000001000000000000 076578616d706c6503636f6d0000010001
b96201000001000000000000
def make_question_header(query_id) # id, flags, num questions, num answers, ...
[query_id, 0x0100, 0x0001, 0x0000, 0x0000, 0x0000] .pack('nnnnnn') end
b96201000001000000000000 076578616d706c6503636f6d0000010001
076578616d706c6503636f6d0000010001 7 e x a m p l e 3
c o m 0 1 1
def encode_domain_name(domain) domain.split('.') .map { |x| x.length.chr + x }
.join + "\0" end example.com 7example3com0
def make_dns_query(domain, type) query_id = rand(65535) header = make_question_header(query_id) question
= encode_domain_name(domain) + [type, 1].pack('nn') header + question end
None
None
None
notice when you're confused read the specification do experiments spy
on it implement your own terrible version
None