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.2k
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
AI でアップデートする既存テクノロジーと、クラウドエンジニアの生きる道
soracom
PRO
1
350
手軽に始める? おうちサーバーのすゝめ
nyagasan
0
190
Functional TypeScript
naoya
10
4.3k
エンジニア向け会社紹介資料
caddi_eng
15
250k
忙しい人のためのLangGraph概要まとめ
__ymgc__
0
110
疎通2024
sadnessojisan
5
900
Dify - LINE Bot連携 考え方と実用テクニック
uezo
5
1.2k
サイボウズ 開発本部採用ピッチ / Cybozu Engineer Recruit
cybozuinsideout
PRO
9
41k
すぐに始めるAWSコスト削減。短期でできる改善策と長期的な運用負荷軽減への取り組み方を解説
ncdc
1
530
Evolving DevOps Teams and Flexible Organizational Culture
kakehashi
1
190
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
0
140
LandingZoneAccelerator と学ぶ 「スケーラブルで安全なマルチアカウントAWS環境」と 私たちにもできるベストプラクティス
maimyyym
1
120
Featured
See All Featured
Designing for humans not robots
tammielis
248
25k
Build your cross-platform service in a week with App Engine
jlugia
228
18k
The Invisible Customer
myddelton
119
13k
Being A Developer After 40
akosma
83
580k
Unsuck your backbone
ammeep
667
57k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
34
1.7k
Speed Design
sergeychernyshev
19
410
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
45
4.8k
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
Web Components: a chance to create the future
zenorocha
308
41k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
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