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
140
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.1k
High Reliability Infrastructure migrations
jvns
10
13k
Building a Ruby profiler
jvns
2
330
Build impossible programs
jvns
23
93k
So you want to be a wizard
jvns
25
24k
Learning systems programming with Rust
jvns
14
7.3k
Systems programming is for everyone
jvns
13
2.9k
How to read your computer's mind
jvns
6
760
Why I ❤ Rust
jvns
50
53k
Other Decks in Technology
See All in Technology
サーバー管理しないサーバーサービスManaged DevOps Pool
kkamegawa
0
130
『GRANBLUE FANTASY Relink』キャラクターの魅力を支えるリグ・シミュレーション制作事例
cygames
0
120
開発者の定量・定性データを組み合わせて開発者体験を把握するための取り組み
ham0215
1
130
『GRANBLUE FANTASY Relink』ソフトウェアラスタライザによる実践的なオクルージョンカリング
cygames
0
170
ロリポップ! for Gamersを支えるインフラ/lolipop for gamers infrastructure
takumakume
0
130
Tricentisにおけるテスト自動化へのAI活用ご紹介/20240910Shunsuke Katakura
shift_evolve
0
200
20240911_New_Relicダッシュボード活用例
speakerdeckfk
0
110
開発生産性を始める前に開発チームができること / optim-improve-development-productivity.pdf
optim
0
110
「認証認可」という体験をデザインする ~Nekko Cloud認証認可基盤計画
logica0419
2
440
サプライチェーン攻撃に備える
ryunen344
0
290
GC24 Recap: Interface Internals
task4233
0
140
プログラム検証入門
riru
6
870
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
PRO
27
7.4k
Building a Scalable Design System with Sketch
lauravandoore
459
32k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.4k
Fireside Chat
paigeccino
31
2.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
354
29k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
227
52k
Done Done
chrislema
180
16k
Building Better People: How to give real-time feedback that sticks.
wjessup
359
19k
The Cost Of JavaScript in 2023
addyosmani
42
5.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
230
17k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
157
15k
Producing Creativity
orderedlist
PRO
340
39k
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