DNSを学んで触ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/66393394-ede9-4a8b-b4ce-22554903198f.png)

こんにちは！
DNSについて書籍を読んだり、Linux環境で触ったりしたのでここでアウトプットしていきます！

# DNSとは
インターネットが発展する前、コンピュータ同士はIPアドレス（例：192.168.1.1）を使って通信していました。しかし、IPアドレスは覚えにくく、ネットワークが拡大すると管理が大変になりました。そこで、「人間が覚えやすい名前（ドメイン名）」と「コンピュータが理解できるIPアドレス」を対応させる仕組であるDNSが誕生したのです。

DNSは、「www.example.com」➡「192.0.2.1」 のように、ドメイン名をIPアドレスに変換する役割を持っています。これにより、人間は覚えやすいドメイン名を使いながら、コンピュータは正しいIPアドレスに接続できます。

# ドメイン名の構造
ドメイン名は、階層構造（ツリー構造）を持ち、ピリオド（.）で区切られています。
例えば、「www.example.com」は以下のような階層になっています。

| 階層 | ドメイン名   | 説明                               |
|------|--------------|------------------------------------|
| ルートドメイン  | .            | 最上位のドメイン（ルートドメイン） |
| トップレベルドメイン (TLD) | com          | ドメイン名の最上位部分          |
| セカンドレベルドメイン (2LD) | example      | ドメイン名の中間部分            |
| サードレベルドメイン (3LD)  | www          | サブドメイン（ホスト名）        |

# 名前解決の仕組み
名前解決は、ドメイン名をIPアドレスに変換する仕組みのことです。
例えば、www.example.comにアクセスする際、DNSがドメイン名に対応するIPアドレス（例: 192.0.2.1）を探し、正しいサーバーへ接続できるようにします。

流れは下記のようになります。

| 手順 | 処理内容 |
| --- | --- |
| **1** | ユーザー端末（PCやスマホ）がwww.example.comの問い合わせを開始し、持っているスタブリゾルバにキャッシュ検索を行う。 |
| **2** | ISP（インターネットサービスプロバイダ）や社内ネットワークで提供されるリカーシブ（再帰）DNSサーバーがキャッシュ検索を行う。<br>**※もしキャッシュがあれば即応答し、なければ次の手順へ** |
| **3** | 全てのTLDを管理しているルートDNSサーバーが検索を行う。 |
| **4** | 対象のTLD DNSサーバーが検索を行う。 |
| **5** | ドメインの正式な情報（IPアドレスやサブドメインの管理情報）を持つ権威DNS（オーソリティブDNS）が最終的な応答を行う。 |
| **6** | リカーシブ（再帰）DNSサーバーがキャッシュを登録し、以後の問い合わせに備える。 |

# リソースレコード
DNSのデータは リソースレコード（RR） という形式で保存されています。リソースレコードには、ドメインに関するさまざまな情報（IPアドレス、メールサーバー、DNSサーバーの情報など） が含まれます。

| レコードタイプ | 説明                               | 例                               |
|----------------|------------------------------------|----------------------------------|
| A レコード      | IPv4アドレスを指定する                | example.com → 192.0.2.1         |
| AAAA レコード   | IPv6アドレスを指定する               | example.com → 2001:db8::1       |
| CNAME レコード  | 別のドメイン名にエイリアスを設定      | www.example.com → example.com   |
| MX レコード     | メールサーバーの情報を指定する        | example.com → mail.example.com  |
| NS レコード     | 権威DNSサーバーを指定する             | example.com → ns1.example.com   |
| TXT レコード    | 任意のテキストデータ（SPF, DKIM, etc.） | example.com → "v=spf1 include:_spf.google.com ~all" |
| SRV レコード    | 特定のサービス用のDNS情報（VoIP, SIP, etc.） | _sip._tcp.example.com 10 60 5060 sip.example.com |
| PTR レコード    | 逆引きDNS（IPからドメインを取得）    | 192.0.2.1 → example.com         |
| SOA レコード    | ゾーン（ドメイン）の管理情報         | example.com → 管理者情報、シリアル番号 |

# 実際にLinuxに試してみる
では、DNSを実際にローカル環境で試していきたいと思います。

### **前提条件**

- Ubuntuサーバーが動作している
- Apache（Webサーバー）がインストールされている
- `192.168.～.～` をUbuntuサーバーのIPとする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/27b54643-2cbf-4709-8778-96f7c5d71d04.png)

---
### **1. BIND（DNSサーバー）のインストール**
まず、DNSサーバーのインストールを行います
下記コマンドを実行していきます
```bash
sudo apt update
sudo apt install -y bind9
sudo systemctl enable --now bind9
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/9af2c3d8-30fa-437b-ac0b-46cc5bed26a1.png)

---
### **2. ゾーンファイルの設定**
BINDに`keita.server`のゾーン情報を登録します。

```bash
sudo nano /etc/bind/named.conf.local
```

のファイルに以下を追記します。

```conf
zone "keita.server" {
    type master;
    file "/etc/bind/db.keita.server";
};
```

---

### **3. ゾーンデータの作成**

```bash
sudo cp /etc/bind/db.empty /etc/bind/db.keita.server
sudo nano /etc/bind/db.keita.server
```

以下の内容に編集をします。

```conf
$TTL 604800
@       IN      SOA     keita.server. root.keita.server. (
                        2         ; Serial
                        604800    ; Refresh
                        86400     ; Retry
                        2419200   ; Expire
                        604800 )  ; Negative Cache TTL
;
@       IN      NS      keita.server.
@       IN      A       192.168.～.～
www     IN      A       192.168.～.～
```

設定後にBINDを再起動します。

```bash
sudo systemctl restart bind9
```
---
### **4. クライアント側のDNS設定**

クライアントPCのDNS設定をBINDに向けます。

```bash
sudo nano /etc/resolv.conf
```

のファイルに以下を追記します。

```conf
nameserver 192.168.～.～
```

設定後に動作確認をします。

```bash
nslookup keita.server
```

期待される出力：

```bash
Server: 192.168.～.～
Address: 192.168.～.～#53

Name: keita.server
Address: 192.168.～.～
```
---

### **5. Apacheのバーチャルホスト設定**

```bash
sudo nano /etc/apache2/sites-available/keita.server.conf
```

のファイルに以下を記載します。

```conf
<VirtualHost *:80>
    ServerName keita.server
    ServerAlias www.keita.server
    DocumentRoot /var/www/html

    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/keita_error.log
    CustomLog ${APACHE_LOG_DIR}/keita_access.log combined
</VirtualHost>
```

設定反映：

```bash
sudo a2ensite keita.server.conf
sudo systemctl restart apache2
```

動作確認：

```bash
curl http://keita.server
```

期待される出力：

```html
<html>
  <body>
    <h1>Apache Test Page</h1>
  </body>
</html>
```
---

### **6. 他のPCからアクセスする方法**

クライアントPC（Windows）の`hosts`ファイルを編集する必要があります。

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

以下を追加：

```plaintext
192.168.～.～ keita.server
```

ブラウザで `http://keita.server` にアクセスし、ページが開けば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/a2511837-1e63-4eb2-83ff-b09e5e852a36.png)

---

### **まとめ**

今回詳細した方法は **ローカル環境限定** で有効な設定です。セキュリティ的対策はしていないので、ローカル開発環境のテストとして活用してください！