DNS(Domain Name System)の | Network
DNS はドメイン名から IP アドレスを割り出します。
ドメインから IP アドレスを割り出すことを名前解決と呼びます。
DNS はアプリケーション層のプロトコルです。
DNS は階層構造をしており親から子に管理が委譲されていきます。
委譲された管理範囲をゾーンと呼びます。
DNSサーバの種類
ドメインに対応する IPアドレス を返します。
| DNSサーバーの種類 | 役割 |
|---|---|
| 権威サーバ(コンテンツサーバ、オーソリティサーバ、ゾーンサーバ) | ドメイン名・ゾーンを管理する |
| フルサービスリゾルバ(キャッシュサーバ) | 外部の問い合わせに対応 一度解決したアドレスをキャッシュする |
| スタブリゾルバ | OS の中にあり host ファイルで名前解決したり、フルサービスリゾルバに問い合わをする |
※ フルサービスリゾルバから権威サーバへの問い合わせは反復問い合わせです。
スタブリゾルバからフルサービスリゾルバへの問い合わせは再帰問い合わせです。
- ドメインはルートドメインから順に問い合わせされる
- コンテンツサーバを権威サーバ・オーソリティ( Authority )サーバと呼ぶことがある
- 1台の DNS でコンテンツ機能とキャッシュ機能を提供する場合もある
ref. https://www.nic.ad.jp/ja/newsletter/No40/0800.html
以下の分類も参照。
ネームサーバ
ネームサーバは文脈により色々な意味で使用されますが、以下の説明が分かりやすいです。
ネームサーバー(DNSサーバー) 「ネームサーバー」は、文脈により二つの意味で使われます。 一つはNSリソースレコードにより指定されるサーバーで、権威サーバー(権威DNSサーバー)を指します(下図1)。もう一つはDNSのサービスを提供するサーバーで、権威サーバーに加え、フルサービスリゾルバー(キャッシュDNSサーバー)も含みます(下図2)。
また、後者の意味では「DNSサーバー」という呼称もあります。
https://jprs.jp/glossary/index.php?ID=0157
サンプル問題)
DNS はスタブリゾルバ、フルサービスリゾルバ、権威サーバで構成されています。
EC2 で dig コマンドを使って example.org の IP アドレスを調べました.
(インスタンスのプライベート IP アドレスは 10.0.0.50/16 と仮定します。)
$ dig +short example.org
93.184.216.34
このとき以下の通信が発生していました。
$ sudo tcpdump -tnl -i eth0 udp port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.0.0.50.44632 > 10.0.0.2.53: 51545+ [1au] A? example.org. (40)
IP 10.0.0.2.53 > 10.0.0.50.44632: 51545 1/0/1 A 93.184.216.34 (56)
フルサービスリゾルバの IP アドレスを選択してください。
- 10.0.0.50
- 10.0.0.2
正解 2
Amazon VPC のフルサービスリゾルバ はネットワークアドレス部に 2 を追加したアドレスが振られる。
ドメインとサーバ
ドメインを A 社で管理して、サイトを B 社サーバーで運用する場合を考えます。
- A 社 NS を使用: NS がゾーンを管理しているので、A 社 NS のリソースレコードにゾーン情報(リソースレコード)を設定
- B 社 NS を使用: NS がゾーンを管理しているので、B 社 NS のリソースレコードにゾーン情報(リソースレコード)を設定
リソースレコード
代表的なリソースレコードに、A, AAAA, MX, NS, TXT, CNAMEなどがあります。
| タイプ | 内容 |
|---|---|
| A | ドメインの IPv4 のアドレス |
| AAAA | ドメインの IPv6 のアドレス |
| MX | ドメイン名宛のメールの配送先 |
| NS | ゾーンを管理する NS サーバ名 |
| TXT | テキスト情報 |
| CNAME | 「別名に対する正式名を指定するためのリソースレコードです。」 (出典: https://jprs.jp/glossary/index.php?ID=0212 ) |
| SOA | 「ゾーンの起点を示し、ゾーンの管理情報を指定するためのリソースレコードです。SOAリソースレコードは、一つのゾーンに一つだけ記述されます。」 ref. https://jprs.jp/glossary/index.php?ID=0194 |
※ TXT リソースレコードは、 SPF ( Sender Policy Framework )から Google サイト認証まで幅広く使用されています。
MXレコード
ref. https://baremail.jp/blog/2022/05/31/2502/
優先度
- 数値が小さいほと優先的が高い
- 優先度が高いサーバが配信
- ↑が障害などで配信できない場合に優先度の低いサーバが配信
CNAMEレコード(Canonical Name record:正式名レコード)
指し示す先は自らの管理下にない他ドメインのホスト名でも構わないため、「remote.example.jp. IN CNAME gateway.example.com.」のように自ドメイン内のあるホスト名を別のドメインへの転送アドレスのように設定することもできる。
https://e-words.jp/w/CNAME%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89.html
TXTレコード
TXT レコードは同一レコード名に対して複数指定できます。
dig +noedns example.org txt
; <<>> DiG 9.10.6 <<>> +noedns example.org txt
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30626
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 4
;; QUESTION SECTION:
;example.org. IN TXT
;; ANSWER SECTION:
example.org. 86400 IN TXT "v=spf1 -all" <=== 複数設定
example.org. 86400 IN TXT "6r4wtj10lt2hw0zhyhk7cgzzffhjp7fl" <=== 複数設定
;; AUTHORITY SECTION:
example.org. 2879 IN NS b.iana-servers.net.
example.org. 2879 IN NS a.iana-servers.net.
;; ADDITIONAL SECTION:
a.iana-servers.net. 615 IN A 199.43.135.53
b.iana-servers.net. 702 IN A 199.43.133.53
a.iana-servers.net. 615 IN AAAA 2001:500:8f::53
b.iana-servers.net. 327 IN AAAA 2001:500:8d::53
;; Query time: 130 msec
;; SERVER: 192.168.11.1#53(192.168.11.1)
;; WHEN: Tue Feb 07 17:18:48 JST 2023
;; MSG SIZE rcvd: 234
ただ Route 53 のように改行して 1 レコードで設定する必要があるサービスもあります。 ref. Route 53のTXTレコードに複数値を登録できますか?への対処法
SPF(Sender Policy Framework)
【重要】 SPFについてはmail.mdも参照。
エンベロープ From もヘッダ From も簡単に偽装できます。SPF はエンベロープ From の偽装に対応する技術です。具体的には送信元ドメイン(エンベロープ From のドメインと HELO ドメイン)の DNS から SPF レコードを取得して、送信元 IP が含まれているかをチェックします(送信元 IP の偽造は難しいことを前提にしています)。
ref. https://www.nic.ad.jp/ja/basics/terms/spf.html
foo.example.com TXT v=spf1 +ip4:xxx.xxx.xxx.xxx/24 +a:foo.example.com +mx ~all
上記は ip アドレスが xxx.xxx.xxx または A レコードの IP アドレスまたは MX サーバの IP アドレスと等しい場合は許可、それ以外は拒否されます。 SPFはSMTPセッション中、エンベロープFromを用いてメール本文(ペイロード)が送信される前の段階でチェックされるため、スパム判定を早期に行うことができます(送信元IPの偽装がTCPの仕組み上困難であることを前提としています)。
+、-、~、?の意味。
・「+」⇒正常なメールとして処理
・「⁻」⇒不正メールとして処理され、配信拒否の可能性あり
・「~」⇒不正メールとして処理されるが、配信される
・「?」⇒SPF指定なしとして処理される
省略した場合は+として処理されます。
省略した場合は全て「+」(正常なメール)として処理されます。
ref. https://baremail.jp/blog/2020/02/28/579/
ref.
- https://sendgrid.kke.co.jp/blog/?p=3509&utm_source=google&utm_medium=cpc&utm_content=text&utm_campaign=dsa&gclid=Cj0KCQiAxoiQBhCRARIsAPsvo-y6P1r8PAGf-h18Q_Rq2yHUSeaI7SJiiqeZY6YsnlotbRBgCS7heroaAoMYEALw_wcB
- https://help.salesforce.com/s/articleView?id=000313465&type=1
ゾーンの委任
DNSはゾーンを委任できます。
example.com ゾーンの委任は NS レコードに委任先の NS を指定します。
ゾーンの委任は、ゾーン管理を委任するので、各種リソースレコードは委任先で管理します。
例)
ドメインを example.com をお名前.comでを取得して other-server で管理します。
example.com のゾーンを委任するので、 example.com の NS レコードに委任先ネームサーバー other-dns1.com、other-dns2.com を指定します。
example.com NS other-dns1.com
example.com NS other-dns2.com
example.com の MX レコードや SPF などのリソースレコードは other-dns1.com、other-dns2.com に設定します。
example.com A xxx.xxx.xxx.xxx
example.com MX 10 mg.mailgun.org
example.com TXT v=spf1 +ip4:xxx.xxx.xxx.xxx/24 +a:example.com +mx ~all
※ user@example.com宛のメールを配送するには、MXレコードはexample.com自体に設定する必要があります(サブドメインmail.example.comに設定してもexample.com宛メールの配送には使われません)。
上記は ip アドレスが xxx.xxx.xxx.xxx または A レコードの IP アドレスと等しい場合は許可、それ以外は不正メールとして配信されます。
SPFはSMTPセッションの早い段階(エンベロープFromの受信時点)でチェックされるため、実際のペイロードが送信される前に判定できます。
具体例
お名前.comのNSを使用
お名前.comでドメインを取得して、さくらのレンタルサーバーでサイトを運用する場合を考える。
お名前.comのNSを使用する場合は、お名前.comのNSにリソースレコードを設定する。
設定すべき代表的なリソースレコードとしてA, MX, (SPFを使用する場合)TXTレコードがある。
※ SPFはさくらのドメイン設定で使用の有無を設定できる。
- IP:さくらのレンタルサーバー情報で確認
- MX:さくらのレンタルサーバーの初期ドメイン 優先度10
- SPF:v=spf1 a:www.sakura.ne.jp mx ~all (www.sakura.ne.jpはさくらのレンタルサーバーホスト名)
SPFの設定は以下を参照。
- https://help.sakura.ad.jp/206206521/ (さくら)
- https://www.xserver.ne.jp/manual/man_domain_dns_setting.php (Xserver)
DNSレコード設定(お名前、AWS)
お名前.comでドメインを取得してRoute 53に委譲する。
- レジストラ:お名前.com
- 運用:AWS Route 53
お名前.comのNSレコードにRoute 53のNSを設定する。

localhost
localhostはループバックアドレス127.0.0.1のドメイン名。
dig
基本的にdigコマンドが便利。
ref.
https://dev.classmethod.jp/articles/dig-route53-begginer/?utm_source=pocket_mylist
$ dig example.com
// レコードタイプを省略した場合はAレコード
Aレコードを知りたい
$ dig example.com -t A
NSを知りたい
$ dig example.com -t NS