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
160
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
340
Build impossible programs
jvns
23
93k
So you want to be a wizard
jvns
25
24k
Learning systems programming with Rust
jvns
14
7.4k
Systems programming is for everyone
jvns
13
3k
How to read your computer's mind
jvns
6
760
Why I ❤ Rust
jvns
50
53k
Other Decks in Technology
See All in Technology
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
490
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
生成AIのガバナンスの全体像と現実解
fnifni
1
190
社外コミュニティで学び社内に活かす共に学ぶプロジェクトの実践/backlogworld2024
nishiuma
0
270
Oracle Cloudの生成AIサービスって実際どこまで使えるの? エンジニア目線で試してみた
minorun365
PRO
4
290
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
130
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
0
210
株式会社ログラス − エンジニア向け会社説明資料 / Loglass Comapany Deck for Engineer
loglass2019
3
32k
10分で学ぶKubernetesコンテナセキュリティ/10min-k8s-container-sec
mochizuki875
3
360
サーバーなしでWordPress運用、できますよ。
sogaoh
PRO
0
110
ブラックフライデーで購入したPixel9で、Gemini Nanoを動かしてみた
marchin1989
1
540
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
450
Music & Morning Musume
bryan
46
6.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
0
98
A Philosophy of Restraint
colly
203
16k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
Scaling GitHub
holman
458
140k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
How to train your dragon (web standard)
notwaldorf
88
5.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Automating Front-end Workflow
addyosmani
1366
200k
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