技術検証：Windows PCにおけるhostsファイルを利用した名前解決と、DNSとの関係性について

## はじめに
これまで、自宅のDNSサーバーやRoute53を活用した名前解決の技術検証を行ってきましたが、```hosts```ファイルを使用した名前解決については深く検証していませんでした。

:::note warn
***そこで今回は、```hosts```ファイルを利用した名前解決がどのように機能するのかを検証します。***
:::

検証対象はYahooのサイトとし、```hosts```ファイルにエントリを追記することで名前解決が可能かどうかを確認します。

## ```hosts```ファイルとは？
```hosts```ファイルは、OSがネットワーク上のホスト名をIPアドレスに変換する際、最初に参照するローカルの設定ファイルです。

***詳細については、以下の記事を読んでみてください！***

https://wa3.i-3-i.info/word16969.html

Windowsでは通常、以下のパスに配置されています。

```css
C:\Windows\System32\drivers\etc\hosts
```

:::note
***このファイルにホスト名とIPアドレスのペアを記述することで、DNSサーバーを経由せずに名前解決を行うことが可能です。***
:::

## 名前解決とは？
名前解決とは、インターネットやネットワーク上でホスト名（例: ```www.yahoo.co.jp```）を対応するIPアドレスに変換するプロセスです。

```hosts```ファイルを使用した名前解決は、DNSサーバーの代わりに```hosts```ファイルを利用して変換を行う仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/366569bf-b30c-a95b-74f6-d849ecbd4a64.png)
引用画像：https://www.engilaboo.com/hosts-file/

このプロセスが正常に動作することで、Webサイトの閲覧やネットワークサービスの利用が可能となります。

***DNSを利用した名前解決については、以下の記事を参考にしてみてください！***

https://qiita.com/free-honda/items/807b36c839f49d7bdb47

:::note warn
***つまり、hostsファイルはローカル環境で静的な名前解決を提供します。一方、DNSサーバーはネットワーク全体で動的かつ分散型の名前解決を担います。***
:::

### 優先順位はどちらが高いのか？
***一般的なOSでは、名前解決の際、```hosts```ファイルがDNSよりも優先されます。***

そのため、```hosts```ファイルにエントリを追加することで、意図的に名前解決の結果を制御することが可能です。

## 事前確認：YahooサイトのIPアドレス確認

以下の```nslookup```コマンドを実行して、YahooサイトのIPアドレスを確認します。

```bash
nslookup yahoo.co.jp
```

YahooのWebサーバーは非常に多くのIPアドレスを持っています。今回は、最初に表示された「```182.22.31.124```」を採用し、後述の```hosts```ファイルに登録します。


```コマンド実行結果.txt
C:\Users\user>nslookup yahoo.co.jp
サーバー:  UnKnown
Address:  192.168.1.1

権限のない回答:
名前:    yahoo.co.jp
Addresses:  182.22.31.124
          182.22.31.252
          183.79.249.124
          124.83.184.252
          182.22.24.124
          182.22.25.252
          182.22.16.123
          124.83.185.124
          183.79.219.124
          182.22.16.251
          183.79.250.251
          124.83.185.252
          182.22.28.252
          182.22.24.252
          183.79.249.252
          124.83.184.124
          183.79.219.252
          182.22.25.124
```


## 実際に```hosts```ファイルを編集してみた

以下の手順で```hosts```ファイルを編集し、Yahooサイトのホスト名を指定したIPアドレスに解決させます。

Windowsでは、```hosts```ファイルは以下のパスに配置されています。

```css
C:\Windows\System32\drivers\etc
```

```hosts```ファイルを編集するには、管理者権限が必要です。

:::note warn
***直接編集が難しい場合は、一度デスクトップにファイルを移動して編集し、完了後に元の場所へ戻す方法を使うことができます。***
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d33cbda8-be70-0633-e6f4-de622fd0c7d2.png)

ファイルの編集に慣れていない場合は、事前にバックアップを取得してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/777c6a15-30fe-8928-67fd-58e7441c02fd.png)


以下の内容を```hosts```ファイルに追記し、Yahooサイトを特定のIPアドレス（例：```182.22.31.124```）にマッピングします

```css
182.22.31.124 www.yahoo.co.jp
```

## ブラウザからアクセスして確認してみた

編集後、ブラウザでの動作確認を行います。確認の前に、以下の手順でDNSの設定を一時的に無効化します。

```ファイル名を指定して実行```ダイアログで「```ncpa.cpl```」と入力すると、ネットワーク接続の設定画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b47a573b-c624-341e-5230-6608d7c16198.png)

適当な存在しないDNSサーバーのIPアドレスを入力し、意図的に名前解決を失敗させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/84a994d4-8caa-c85f-9178-65376c2b5ca6.png)

:::note alert
***DNS設定を誤るとインターネット接続ができなくなる場合があります。設定を変更する際は十分に理解し、ご自身の責任で作業してください。***
:::

設定変更後、適当なサイトにアクセスした際に名前解決ができず、インターネット接続が失敗することを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c5e9597c-cd8e-c1b1-3e2c-930f6be89a4f.png)

***ブラウザで「```www.yahoo.co.jp```」にアクセスし、編集したhostsファイルの内容（IPアドレス）を基に名前解決が成功していることが確認できました！***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7a9b62c3-fb13-8286-9359-d268c79e3265.png)

***これで検証は大成功です！！***

## まとめ
今回の検証で、hostsファイルを利用することで意図的に名前解決の結果を変更できることを確認しました。

:::note
***hostsファイルは静的であるため、特定の目的（例：ローカル開発環境の構築や特定IPへのアクセス制御）に非常に便利です。***
:::

一方で、ロードバランサーや動的に変化するIPアドレスには対応できないため、そのような場合はDNSサーバーの利用が推奨されます。

## おまけ

少し趣味の話になりますが、私はVaundyが大好きです！特に「踊り子」や「napori」といった曲は、作業中のBGMとして最高です。

:::note alert
***ただし、Vaundyのライブの抽選倍率がとても高く、なかなか当選できないのが悩みです。***
:::

***ふと思いついたのですが、指定時間の先行予約サイトに少しでも早くアクセスするために、事前にhostsファイルで名前解決を設定すると、他の人よりも若干早く予約できるのではないかと考えました。***

もちろん、ロードバランサーのIPが可変の場合には効果が薄れるかもしれませんが、次回のライブでは試してみたいと思っています（笑）。

## 関連記事

https://qiita.com/vanaryu/items/6de34a3d611d6b78848e

https://itmanabi.com/dns_hosts/

https://qiita.com/kojiro513/items/4bba8937b0ccabefa994