Linuxマシンの名前解決の仕組み

##記事を書く目的
Virtualbox上にあるOracle DBにリスナーを登録するとき、なかなかうまくいかなかった。
うまくいかない原因を突き止めるには、Linuxでどのように名前解決を行っているかを理解する必要があったため、備忘録として記録しておく。


##名前解決とは

ホスト名とIPアドレスを対応付けること。

>名前解決とは、ソフトウェアなどが扱う対象の識別名と、その名前が指し示している実体を対応付ける処理や操作のこと。TCP/IPネットワークでドメイン名やホスト名と対応するIPアドレスを対応付けるDNS名前解決が特に有名。
 - [IT用語辞典](http://e-words.jp/w/%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA.html)より引用

例えば、Amazonを使って買い物をしようとするとき、
・[https://www.amazon.co.jp/](https://www.amazon.co.jp/)
・[https://54.239.25.208](https://54.239.25.208)
という2つのアドレスがあるとする。
私たち人間（ユーザ）にとってわかりやすいのは、間違いなく前者であろう。
しかし、コンピュータにとっては、後者の方がわかりやすい（というか前者はコンピュータにはわからない）。
よって、名前とIPアドレスを対応付ける必要がある。

##Linuxで名前解決を行う仕組み
以下では、Linuxでどのように名前解決が行われているのかを明らかにするために、名前解決に関連するファイルをまとめた。

大まかな名前解決の流れは、以下の通り。

``リゾルバ(resolver)がnsswitch.confで名前解決の順序を確認``
　　　　　　　　　　　　　↓
``指定された順番通りにファイル/サーバの内容をチェックする``

###/etc/nsswitch.conf
nssとは、``Name Service Switch``の略。resolver（名前解決をするソフトウェア）が使用する設定ファイルで、**名前解決に使用する順序**が記されている。

```
[oracle@host01 ~]$ cat /etc/nsswitch.conf 

・・・（中略）・・・

#hosts:     db files nisplus nis dns
hosts:      files dns

・・・（中略）・・・
```
注目するのは、`hosts`の部分。
この場合、優先順位が``files``→``dns``となっているので、
**「まず``/etc/hosts``を見て、解決しなかったらDNSサーバに問い合わせてね」**という順序を表している。

###/etc/hosts
上記でも出てきたが、``hosts``は、IPアドレスとホスト名の対応付けをするファイル。

>hosts（ホスツ）とは、TCP/IPを利用するコンピュータにおけるホスト名のデータベースで、IPアドレスとホスト名の対応を記述したテキストファイルである。
 - [wikipedia](https://ja.wikipedia.org/wiki/Hosts)より引用

```
[oracle@host01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.101 host01 host01.example.com
```

問題の切り分けを行う際、以下の事項を確認した。
1. ``tnsnames.ora``、``listener.ora``を確認
HOST名・ポート番号ともに一致していた。
2. ``ping host01.example.com``を実施


届かない。どうやら、ホストの名前解決がうまくいっていないようだと判断。

###hostsの編集
今回は仮想環境上でDBを動かしているので、ホストをlocalhostとする。
host01.example.comを以下のように修正した。

```
[oracle@host01 ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 host01.example.com
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
#192.168.56.101 host01 host01.example.com
```
##リスナーの起動

```
[oracle@host01 ~]$ lsnrctl start


LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 11-8月 -2019 14:35:18

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

/u01/app/oracle/product/12.1.0/dbhome_1/bin/tnslsnrを起動しています。お待ちください...

TNSLSNR for Linux: Version 12.1.0.1.0 - Production
システム・パラメータ・ファイルは/u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host01.example.com)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名                      LISTENER
バージョン                TNSLSNR for Linux: Version 12.1.0.1.0 - Production
開始日                    11-8月 -2019 14:35:18
稼働時間                  0 日 0 時間 0 分 0 秒
トレース・レベル          off
セキュリティ              ON: Local OS Authentication
SNMP                      OFF
パラメータ・ファイル      /u01/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
ログ・ファイル            /u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
サービスのサマリー...
サービス"orcl.us.oracle.com"には、1件のインスタンスがあります。
  インスタンス"orcl"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。
```

リスナーの登録がうまくいった！
やはり原因は、ホスト名の名前解決がうまくいっていなかったからだった。

##192.168.56.***とは？
それでは、今回悪さをしていた``192.168.56.***``とは一体何か？
その正体は、**Virtualboxのホストオンリーアダプターのネットワーク帯域（デフォルト）**だった。
今回のエラーの根本的な原因は、Virtualbox上でいろいろといじっている間に、ホスト名のIPアドレスを変に設定してしまったことだと考える。