DNS勉強会 入門

## 目的＆ゴール
DNSはインターネットでは欠かせない存在であるが、あまり知らないという人が多い気がします。
そこで、もう少し仕組みを知って、今後の仕事に役に立って欲しいです。
DNSは、片足を突っ込むだけでもとても深い分野でもあるので、表面を撫でる程度に説明しますので、
まずは興味を持ってもらうレベルでも嬉しいです。
では始めていきます。

## 基礎知識
### 基本的にコンピュータはIPアドレスでしか他のサーバを探せません。(単純なので)
- でも、IPアドレスだと数字が並んでるだけなので人間が判断しづらいです。
- だから、IPアドレスとそれにマッチする名前を紐付けることで、識別できるようにしました。
- 今ではWindowsでもLinuxでもhostsファイルに書いておけば後は自動的によろしくやってくれます。
- でも、皆が皆hostsファイルを毎回書き換えたりするの面倒です。
    - 閲覧したい全てのサイトをhostsファイルに書くのは無謀です。。。
- という事で`DNSサーバ`とかいう子が生まれました。

### `www.hogehoge.co.jp`のURLを見ていく
- これはサーバの名前です。
- jp -> co -> hogehogeという具合に、後ろから順番に解決していきます。
- TLD（トップレベルドメイン）だとかルートドメインとかサブドメインとかあります。
- その辺りは割愛します。気になった人は検索してみてください。

## 名前解決への道
### サーバ側に絞って話をします。
- 上でも書きましたが、基本的に/etc/hosts に書いておけばよろしくやってくれます。
- でも、書いてないものについては解決できません。(単純なので)
- 仕方ないのでDNSサーバというものに聞きに行きます。
- DNSサーバは2種類あります。
    - 権威サーバ（ゾーンサーバ）
    - キャッシュサーバ
- 基本的にはキャッシュサーバに聞きに行きます。

### キャッシュサーバってなんでしょうか？
- 色んなマシンの名前を聞かれるカスタマーサポートのような位置づけ。
- でも、キャッシュサーバは常に答えを持ってるわけじゃありません。
- キャッシュサーバは聞かれた名前を権威サーバに問い合わせて、その答えを教えてくれます。
- キャッシュサーバは一度聞かれたサーバの名前に紐づくIPアドレスを一定期間蓄えます。とても効率的です。
- 問い合わせの無いものについては一定期間保持した後破棄します。

### んじゃ、権威サーバって何よ？
- 答えを持ってる人です。
- でも何でもは知りません。知ってる事だけです。
- 知ってる答えをキャッシュサーバから聞かれた時に答えてくれます。（エンドユーザからの問い合わせには答えません）
- 規模によってはマスター/スレーブの構成を取って負荷分散します。

### キャッシュサーバはどこの権威サーバに聞きにいくのさ？
- `www.hoge.co.jp` っていうホスト名だとしよう
    - まず、ルートサーバに聞きにいく
    - ルー(以下略「ああ、それなら”jp”さんとこだよ」
    - Jp さん 「ああ、それは”co”さんとこにおるわ」
    - Co さん「たしか”hoge”さんとこにそんなのおったっけなぁ」
    - と、こんなたらい回し(再帰)をくらったあげく
    - Hogeさん「そいつの連絡先か。`***.***.***.***` だべ」
- と、こんな感じでIPアドレスを教えてもらう事になる
- ちなみにルートサーバは世界に13台しか存在しない。詳細は[wiki参照](https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%88%E3%82%B5%E3%83%BC%E3%83%90)

## 名前解決に関わるファイル
- 皆大好き /etc/hosts
- DNSサーバを指定する /etc/resolv.conf
    - WindowsのプライマリDNSやセカンダリDNS登録するようなファイル
- 優先順位を決める /etc/nsswitch.conf
    - /etc/hosts とDNSサーバへの問い合わせ、どっちを優先するかなどを細かく設定出来るファイル

## 正引きと逆引き
- 正引き・・・Aレコード
    - ドメインからIPアドレスを結ぶもの
    - `www.hoge.co.jp` → `192.168.1.1`
- 逆引き・・・PTRレコード
    - IPアドレスからドメインを結ぶもの
    - `192.168.1.1` → `www.hoge.co.jp`

## DNSラウンドロビン
- DNSラウンドロビンって何？
    - DNSを使った負荷分散制御
- どうやるの？
- 複数のサーバで同じホスト名を騙ればいい  
　例)　`www.hoge.ne.jp` (192.168.1.1)  
 　　　 `www.hoge.ne.jp` (192.168.1.2)  
    - こうする事で同じホストにアクセスする際に、変わりばんこに末尾1と末尾2にアクセスが届きます。

## DNSキャッシュポイズニング
- なに？
    - キャッシュサーバが本来の情報とは違う情報を所持し、問い合わせに対して嘘の情報を流す事
    - 例えば？
        - `www.hoge.ne.jp` (192.168.1.1) にアクセスしようとして、DNSを問い合わせるも、  
 キャッシュサーバに`www.hoge.ne.jp` (192.168.10.10) という情報を登録しておくと、  
 強制的に`www.hoge.ne.jp `(192.168.10.10)へのアクセスになります。
        - もちろん違うキャッシュサーバに問い合わせた際は正しい答え`www.hoge.ne.jp `(192.168.1.1) が帰ってくる
    - 悪意を持っているとフィッシング詐欺サイトに誘導されてしまいます。
    - もしかすると、ある企業は、アクセスして欲しくない特定サイトに対して設定し、  
    アクセスすると「真っ赤な画面」で「業務中見ないでください。アクセスは記録しました！」というサイトを表示されるかもしれない。。。。

## よく聞く話
- DNSの更新に時間がかかる？
    - キャッシュサーバは権威サーバから受け取った情報を一定期間保持しているので、  
    その期間中は問い合わせしても権威サーバに確認しません。これが一般的に時間がかかると言われている所以です。
    - キャッシュサーバ上に情報が無ければ、普通に確認に行くので、権威サーバに反映した後すぐに新しいIPアドレスになる事もあります。

## DDNS(ダイナミックDNS)
- 基本的にDNSはドメイン名に固定のIPが振られているので静的です。
- DDNSはドメイン名自体は不変であるが、IPアドレスが変動するものをさします。
    - 個人ユーザとか、固定IP持ってない人でもドメイン取ってアクセスが可能なサービス、それがDDNSです。

## おまけ(失敗談)
- お客さんのDNSを変更する事になりました。
- 設定変更後、実は間違っていた事が判明。
- すぐに正しい設定を入れなおし、自分とこのキャッシュサーバからは正しく反映されてる事を確認。
- しかし、他のキャッシュサーバから正しく反映されているか不明。
- 仕方ないので、googleさんとかの公開DNSサーバから正しく引けるか確認を実施。
- 思い当たるところ数件で正しく引けてる事を確認したものの、お客さんがどこのDNSサーバを使用しているかわからないため、冷や汗もの😇

## おまけ(失敗談)	_解説
- 権威サーバで設定変更を行った直後にキャッシュサーバから問い合わせがあったら、キャッシュサーバに問い合わせのキャッシュが残ります。
- その場合、キャッシュサーバが誤った設定の答えを返すため、問い合わせがあった場合、キャッシュが消えるまで誤った答えを返し続ける事になります。
- IPなどで直接アクセスする分には問題ないが、キャッシュに乗ってしまった場合、ドメイン名でのアクセスが出来なくなってしまいます。

**※要は、DNSって根本的なシステムだから、設定変更とかは慎重にやらないとダメだよってお話でした。**

## まとめ
いかがだったでしょうか。
少しでも興味があれば、幸いです。
気になったら、その先もどんどん調べてみてください。
（自宅でDNSサーバを立てるとより、理解できると思います！）