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
120
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
2.8k
High Reliability Infrastructure migrations
jvns
10
12k
Building a Ruby profiler
jvns
2
290
Build impossible programs
jvns
23
92k
So you want to be a wizard
jvns
25
23k
Learning systems programming with Rust
jvns
14
6.9k
Systems programming is for everyone
jvns
13
2.9k
How to read your computer's mind
jvns
6
750
Why I ❤ Rust
jvns
50
52k
Other Decks in Technology
See All in Technology
NgRx Signal Store
rainerhahnekamp
0
150
Postman v10リリース後を振り返る / Looking back at Postman v10 after release
yokawasa
1
150
AOAI をきっかけに 社内の Azure 管理を見直した話
recruitengineers
PRO
1
260
コードを書く隙間を見つけて生きていく技術/Findy 思考の現在地
fujiwara3
27
5.8k
よく聞くけど使ったことないソフトウェアNo.1 KafkaとSnowflake
foursue
4
340
プロデザ! BY リクルート vol.18_リクルートのリサーチ実践組織「リサーチブーストコミュニティ」
recruitengineers
PRO
3
270
EMとして2023年度に頑張ったこと / What we did well in FY2023 as a EM
pauli
1
160
プラットフォームってつくることより計測することが重要なんじゃないかという話 / Platform Engineering Meetup #8
taishin
1
340
JAWS-UG Bedrock Claude Night
yamahiro
3
540
Vertex AI を中心に 生成AIのアップデートを共有します
kaz1437
0
290
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
2k
アクセシビリティを考慮したUI/CSSフレームワーク・ライブラリ選定
yajihum
2
1k
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
514
39k
RailsConf 2023
tenderlove
4
540
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
60
14k
Build your cross-platform service in a week with App Engine
jlugia
225
17k
YesSQL, Process and Tooling at Scale
rocio
164
13k
5 minutes of I Can Smell Your CMS
philhawksworth
199
19k
Adopting Sorbet at Scale
ufuk
68
8.6k
GraphQLとの向き合い方2022年版
quramy
32
12k
The Mythical Team-Month
searls
216
42k
Teambox: Starting and Learning
jrom
128
8.4k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.6k
The Cost Of JavaScript in 2023
addyosmani
16
3.8k
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