【linux】名前解決の仕組み

Linux上でネットワーク設定に使う主な設定ファイルは以下の5つ（必ず覚えること）

①「/etc/hostname」：ホスト名の定義
②「/etc/hosts」：ホスト名とIPアドレスを対応させるためのファイル
②「/etc/resolv.conf」：名前解決の設定を行うファイル
④「/etc/nsswitch.conf」：名前解決を行う優先順位を指定するファイル
⑤「/etc/sysconfig/network-scripts/ifcfg-enp0s3」：NIC(インターフェイス)ごとの設定を行うファイル

※名前解決：ホスト名をIPアドレスに変換すること


## 本記事を読んで理解できること

■Linuxマシーンで名前解決を行う仕組みと順番
■ネットワークの設定
→NICを有効にするか否か、IPアドレスを静的に割り当てるかDHCPで割り当てるか、
 静的に割り当てる場合のIPアドレスやネットマスクなど.（CiscoルータでIPアドレス設定やルーティングテーブル設定したのと同じことをlinux上でもしているだけ）

※Red Hat系のみ解説


## Linux上で名前解決の順序

Linuxでは次のような流れで名前解決が行われている。

## 1:`/etc/nsswitch.conf`で名前解決の順番を確認

同ファイルは、名前解決を行う優先順位を指定するファイル。
名前解決では①/etc/hostsファイルを使う②dnsサーバに問い合わせると言った手段がある。
それらをどういった順序で利用するか設定するファイル。
設定例を確認します。

```:/etc/nsswitch.conf
hosts:      files dns myhostname
```
注目するのは、hostsの部分。
優先順位が、`files` → `dns` →`myhostname`となっているので、
何らかの名前解決を行う際、まずfilesの指定によりローカルにある`/etc/hosts`ファイルが参照され、
これに失敗するとdnsの指定により`/etc/resolv.conf`の中で定義したDNSサーバに問い合わせが行われる、という順になる。
※file：ローカルにあるファイル/etc/hostsという意味



## 2:  ローカルにあるファイル/etc/hostsの名前解決

/etc/hostsは、ホスト名とIPアドレスを対応させるためのファイル。

```:/etc/hosts
 1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdoma        in4
 2 ::1         localhost localhost.localdomain localhost6 localhost6.localdoma        in6
```
デフォルトでは、ローカルループバックアドレスのIPv4&6の記載しかありません。

例えばyahoo.co.jpにアクセスしたい場、現状だとwww.yahoo.co.jp（ホスト名）に対応したIPアドレスが
/etc/hostsに記載がないので、このままだとDNSサーバに名前解決を頼むことになります（`/etc/nsswitch.conf`）

試しに、/etc/hostsにyahooのIPを記述し、名前解決できるようにします。
```:/etc/hosts
1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
3 #↓追記
4 183.79.219.252 yahoo
```
ホスト名でpingを送れているので、名前解決に`/etc/hosts`の内容が使われていることがわかります。
```
[root@localhost ~]# ping yahoo
PING yahoo (183.79.219.252) 56(84) bytes of data.
64 bytes from yahoo (183.79.219.252): icmp_seq=1 ttl=50 time=75.9 ms
64 bytes from yahoo (183.79.219.252): icmp_seq=2 ttl=50 time=43.2 ms
```
ただしhostsファイルは小規模NW向きの名前解決フィル。
大規模NWには向かない。


## 3：DNS SVの定義`/etc/resolv.conf`

前述した`/etc/hosts`で名前解決できない場合、DNSによる名前解決が必要であり
どこのDNSサーバを参照するか設定する必要があります。
参照先のDNSサーバは`/etc/resolv.conf`ファイルに設定する。

```:/etc/resolv.conf 
[root@localhost ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.11.1
```
nameserverの行に参照先DNSサーバのIPアドレスを記述する

## 4：`/etc/sysconfig`ディレクトリについて

/etc/sysconfig」ディレクトリには、Red Hat系列のLinuxディストリビューションでは
ネットワーク関係のディレクトリが置かれています。
そのため、CUIベースでネットワーク関係の設定を行う際には、ここのディレクトリに
置かれたファイルを編集するのは必須となります。

以上の３つのファイルで名前解決のために使用される。



## IF(NIC)の定義 `/etc/sysconfig/network-scripts` ディレクトリ

```:/etc/sysconfig/network-scripts/
[root@localhost ~]# ls -l /etc/sysconfig/network-scripts/
合計 8
-rw-r--r--. 1 root root 249  9月 26 08:34 ifcfg-enp0s3
-rw-r--r--. 1 root root 322 10月 20 15:19 ifcfg-enp0s8
```
仮想サーバ上に2つのNICを設定したので、それぞれのファイルが存在している

```:/etc/sysconfig/network-scripts/ifcfg-enp0s8
[root@localhost ~]# nl /etc/sysconfig/network-scripts/ifcfg-enp0s8
     1	TYPE=Ethernet
     2	HWADDR=18:a0:27:06:0B:53
     3	PROXY_METHOD=none
     4	BROWSER_ONLY=no
     5	BOOTPROTO=none   
     6	IPADDR=192.169.11.2
     7	PREFIX=24
     8	DEFROUTE=yes
     9	IPV4_FAILURE_FATAL=yes
    10	IPV6INIT=yes
    11	IPV6_AUTOCONF=yes
    12	IPV6_DEFROUTE=yes
    13	IPV6_FAILURE_FATAL=no
    14	IPV6_ADDR_GEN_MODE=stable-privacy
    15	NAME=enp0s8
    16	UUID=b7c0s8a7-1016-41c5-bfc8-4d69qa9eba41
    17	ONBOOT=yes
```

`/etc/sysconfig`ディレクトリには、Red Hat系列のLinuxディストリビューションでは
ネットワーク関係のディレクトリが置かれています。
そのため、CUIベースでネットワーク関係の設定を行う際には、ここのディレクトリに
置かれたファイルを編集するのは必須となります。

IFに対するIPアドレスの設定がviコマンドで直接編集ではなく、
・`nmtui`コマンドで設定
・`systemcyl restart NetworkManager`で反映させる。