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
Julia Evans
February 01, 2023
Technology
0
170
Learning DNS in 10 years
From RubyConf Mini 2022
Julia Evans
February 01, 2023
Tweet
Share
More Decks by Julia Evans
See All by Julia Evans
Blogging myths
jvns
0
3.2k
High Reliability Infrastructure migrations
jvns
10
13k
Building a Ruby profiler
jvns
2
360
Build impossible programs
jvns
23
93k
So you want to be a wizard
jvns
25
25k
Learning systems programming with Rust
jvns
14
7.6k
Systems programming is for everyone
jvns
13
3k
How to read your computer's mind
jvns
6
770
Why I ❤ Rust
jvns
50
53k
Other Decks in Technology
See All in Technology
30代エンジニアが考える、エンジニア生存戦略~~セキュリティを添えて~~
masakiokuda
4
2k
ウェブアクセシビリティとは
lycorptech_jp
PRO
0
300
スケールアップ企業のQA組織のバリューを最大限に引き出すための取り組み
tarappo
4
960
データベースで見る『家族アルバム みてね』の変遷 / The Evolution of Family Album Through the Lens of Databases
kohbis
2
590
AWS のポリシー言語 Cedar を活用した高速かつスケーラブルな認可技術の探求 #phperkaigi / PHPerKaigi 2025
ytaka23
8
1.5k
一人QA時代が終わり、 QAチームが立ち上がった話
ma_cho29
0
290
大規模プロジェクトにおける 品質管理の要点と実践 / 20250327 Suguru Ishii
shift_evolve
0
290
ソフトウェアプロジェクトの成功率が上がらない原因-「社会価値を考える」ということ-
ytanaka5569
0
130
Engineering Managementのグローバルトレンド #emoasis / Engineering Management Global Trend
kyonmm
PRO
6
990
OPENLOGI Company Profile for engineer
hr01
1
22k
Cloud Native PG 使ってみて気づいたことと最新機能の紹介 - 第52回PostgreSQLアンカンファレンス
seinoyu
2
230
20250328_OpenAI製DeepResearchは既に一種のAGIだと思う話
doradora09
PRO
0
150
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Music & Morning Musume
bryan
46
6.4k
Designing Experiences People Love
moore
141
23k
Code Reviewing Like a Champion
maltzj
522
39k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
8
700
YesSQL, Process and Tooling at Scale
rocio
172
14k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.1k
Why Our Code Smells
bkeepers
PRO
336
57k
Testing 201, or: Great Expectations
jmmastey
42
7.4k
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