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
220
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.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.1k
Systems programming is for everyone
jvns
13
3.2k
How to read your computer's mind
jvns
6
790
Why I ❤ Rust
jvns
50
54k
Other Decks in Technology
See All in Technology
組織全体で実現する標準監視設計
yuobayashi
3
490
オレ達はAWS管理をやりたいんじゃない!開発の生産性を爆アゲしたいんだ!!
wkm2
4
540
内製AIチャットボットで学んだDatadog LLM Observability活用術
mkdev10
0
120
Everything Claude Code を眺める
oikon48
9
6.1k
楽しく学ぼう!ネットワーク入門
shotashiratori
4
3.4k
クラウド × シリコンの Mashup - AWS チップ開発で広がる AI 基盤の選択肢
htokoyo
2
260
JAWS FESTA 2025でリリースしたほぼリアルタイム文字起こし/翻訳機能の構成について
naoki8408
1
620
[E2]CCoEはAI指揮官へ。Bedrock×MCPで構築するコスト・セキュリティ自律運用基盤
taku1418
0
180
Yahoo!ショッピングのレコメンデーション・システムにおけるML実践の一例
lycorptech_jp
PRO
1
210
AI時代のSaaSとETL
shoe116
1
170
楽しく学ぼう!ネットワーク入門
shotashiratori
1
430
NewSQL_ ストレージ分離と分散合意を用いたスケーラブルアーキテクチャ
hacomono
PRO
4
370
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
220
The SEO identity crisis: Don't let AI make you average
varn
0
420
Visualization
eitanlees
150
17k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
230
How GitHub (no longer) Works
holman
316
140k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
The agentic SEO stack - context over prompts
schlessera
0
700
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
230
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
390
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
130
Skip the Path - Find Your Career Trail
mkilby
1
80
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