Envaderを利用して、Linuxコマンド　nslookup dig について学ぶ

30代後半、未経験からIT業界のエンジニア転職へ挑戦している、kobakichiです。

今回もいつもお世話になっている、`Envader`を利用してLinuxコマンドを実践しながら学びました。

今回は検索する時に必ず使う`ドメイン名`と`IPアドレス`の`名前解決`をするためのコマンド`nslookup`について、実践しながら学びました。

`Envader`とは？という方のためにリンクを貼っておきますので、ご参考までに。

[Envader](https://envader.plus/)

[コース一覧](https://envader.plus/course)

[今回使用したシナリオ](https://envader.plus/course/5/scenario/1023)

## 参考にさせていただいた記事一覧
[digコマンドとnslookupコマンドの違いとは](https://atmarkit.itmedia.co.jp/fnetwork/dnstips/011.html#:~:text=dig%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%82nslookup%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89,%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E7%82%B9%E3%81%A7%E3%81%99%E3%80%82)

[Google Public DNS](https://ja.wikipedia.org/wiki/Google_Public_DNS)

[dig コマンド](https://www.linuxmaster.jp/linux_skill/2019/04/dig.html)

[DNSとは？役割や仕組み、DNSレコードの意味を解説](https://baremail.jp/blog/2019/10/25/347/)

[レコードの種類9つ紹介！DNSの概要や特徴についても解説
](https://www.fenet.jp/infla/column/server/%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E7%A8%AE%E9%A1%9E9%E3%81%A4%E7%B4%B9%E4%BB%8B%EF%BC%81dns%E3%81%AE%E6%A6%82%E8%A6%81%E3%82%84%E7%89%B9%E5%BE%B4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)

## はじめに

今回は`DNS`(ドメインネームシステム)についてのシナリオを実践しましたが、こちらの解説が非常に細かくされていて、非常に勉強になりました。

私自身の振り返り(アウトプット)にこの記事を書いていますが、より正確で細かい情報を知りたい時には[こちら](https://envader.plus/course/5/scenario/1023)のシナリオを読むとかなり勉強になると思います。

私も分からなくなった時には、このシナリオの記事を読ませて頂こうと思いました。

## nslookupコマンド
`nslookup`コマンドは、DNS(Domain Name System)サーバに、コマンドで入力したドメイン名の名前解決を問い合わせるコマンド。

コマンドの実行方法には、`非対話モード`と`対話モード`があります。

また、名前解決には`正引き`と`逆引き`の両方ができるようです。

専門的な言葉がいくつか出てきたので、自分の学習のため言語化してみよう。

### 名前解決とは
ドメイン名をIPアドレスに変換する仕組みのこと。(正引き)
IPアドレスをドメイン名に変換する仕組みもある。(逆引き)


私たちは普段、どこかのWebサイトを見に行く時に、ブラウザでURLを入力しています。
例えで説明すると、Envaderのドメイン(`https://envader.plus/`)とブラウザに入力すると、ブラウザがDNSサーバへ(`envader.plus`)に紐付いているIPアドレスを教えて〜。と問い合わせをします。

問い合わせを受けたDNSサーバは複数のDNSサーバへ問い合わせをして、(`envader.plus`)に紐付いているIPアドレスは(`215.23.45.33`)です。とIPアドレスをブラウザに教えてあげます。

IPアドレスを教えてもらったブラウザは、教わったIPアドレス宛にリクエストを送り、レスポンスが返ってきて(`envader.plus`)の画面が見れるようになります。

コンピューターは(`envader.plus`)だけでは理解ができないため、(`envader.plus`)を`(215.23.45.33)`のようなIPアドレスへ変換する必要があるんですね。

### 正引き　逆引き
名前解決の方法のこと。

それぞれ、名前解決をする順番が逆になる。

`正引き`...ドメイン名(`envader.plus`)からIPアドレス(`215.23.45.33`)に変換を行うこと。

`逆引き`...IPアドレス(`215.23.45.33`)からドメイン名(`envader.plus`)に変換を行うこと。

ごちゃごちゃになりそうですが、この順番が違うことは頭に入れておこうと思います。

### 非対話モード

`nslookup`コマンドの使い方の一つ。

基本の書き方

```bash
nslookup ドメイン名/IPアドレス DNSサーバのIPアドレス

# DNDサーバのアドレスは省略しても良い
```

試してみる。

```bash
# 8.8.8.8のDNSサーバへ問い合わせている
envader@172-19-1-2:~$ nslookup envader.plus
Server:         8.8.8.8
Address:        8.8.8.8#53

# 名前解決の結果
Non-authoritative answer:
Name:   envader.plus
Address: 216.239.34.21
Name:   envader.plus
Address: 216.239.38.21
Name:   envader.plus
Address: 216.239.32.21
Name:   envader.plus
Address: 216.239.36.21
```

`8.8.8.8`のDNSサーバへ`envader.plus`のドメインの名前解決の問い合わせをして、下のIPアドレス`216.239.34.21`などが返ってきています。

このような使い方が非対話モードの使い方です。

### 対話モード

先ほどの非対話モードとは逆で、`nslookup`コマンドと対話的にコマンドを実行します。

基本の書き方
```bash
nslookup

# または
nslookup - DNSサーバのIPアドレス
```

このようにすると、対話モードになります。

実際にやってみる。

```bash
# 対話モードでコマンドを実行
envader@172-19-1-2:~$ nslookup
> envader.plus
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   envader.plus
Address: 216.239.32.21
Name:   envader.plus
Address: 216.239.38.21
Name:   envader.plus
Address: 216.239.36.21
Name:   envader.plus
Address: 216.239.34.21
```

非対話モードと同じように見えますが、`nslookup`と叩いた後に>が出現して、そこから名前解決したいドメイン名やIPアドレスを入力します。

## DNSサーバー 8.8.8.8
このサーバーのアドレスですが、`Google Public DNS`と言って、Googleが世界中のインターネットの利用者に提供している無料のDNSサービスなのです。

自分のPCなどのDNSサーバーの設定を`8.8.8.8`に設定することで、高速に名前解決を行うことができるとかできないとか。

気になる方は一度試してみるのも良いかもしれませんね。

## digコマンド
`dig`コマンドも、`nslookup`と同じように名前解決ができるコマンド。
何が違うのか？ですが、`nslookup`ではDNSサーバーのレスポンスを見やすく加工しているそうなのですが、`dig`コマンドでは加工せず、ほとんどそのままの形式で表示してくれます。

```bash
envader@172-19-1-2:~$ dig raretech.site

; <<>> DiG 9.10.3-P4-Debian <<>> raretech.site
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56387
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;raretech.site.                 IN      A

;; ANSWER SECTION:
raretech.site.          60      IN      A       13.226.78.77
raretech.site.          60      IN      A       13.226.78.95
raretech.site.          60      IN      A       13.226.78.42
raretech.site.          60      IN      A       13.226.78.102

;; Query time: 10 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Apr 04 19:09:56 UTC 2022
;; MSG SIZE  rcvd: 106
```

ヘッダー情報やらレコード情報やらたくさん表示されています。
これらの情報は、ネームサーバーの挙動を知る、と言った時に非常に重要な情報となるようです。
~~実際に良く分かっていない~~

LinuxディストリビューションのCentOSでは、CentOS7からはこの`dig`コマンドが推奨されているそうです。

## DNSレコード

`dig`コマンドで出てきた`A`の所の意味が、Aレコードと呼ばれるDNSレコードの一つになります。

以下DNSレコードの種類

| レコード名 | 役割 |
|:-:|:-:|
| A  | ドメイン名に対応するIPアドレス(IPv4)を指定する行  |
|  AAAA | ドメイン名に対応するIPアドレス(IPv6)を指定する行  |
|  PTR | IPアドレスに対応するドメイン名を指定する行  |
|  CNAME | ドメイン名の別名を指定する行  |
| SOA  | ゾーンに関する様々な情報を記述する行  |
|  NS | ゾーン管理の委託先のサーバーを指定する行  |
|MX|ドメイン宛のメールのメールサーバーを指定する行|
|TXT|テキスト情報を指定する行|

などなど。
色々な種類のレコードがあって、覚えるのが大変ですね。

これらをゾーンファイルと呼ばれる設定ファイルに記述して、DNSレコードの設定をするようなのですが、これを間違って設定してしまうと、名前解決が正しく行われずにWebサイトを閲覧できない！と言った状況になってしまうそうなので、設定する際には注意が必要です。

## まとめ

`nslookup` `dig`コマンドを使った名前解決の方法を学びました。

今回`Envader`を利用して学習しましたが、シナリオの解説が本当に詳細に書かれていて分かりやすかったので、学習したい方は一度見てみることをお勧めします。

[今回使用したシナリオ](https://envader.plus/course/5/scenario/1023)

最後まで読んでいただきありがとうございました。