GUI操作による仮想ネットワークの構築③　DNSサーバ・DHCPサーバ編

## １．概要説明
DNSサーバ・DHCPサーバを立てます。

Virtual Boxのような仮想化ソフトウェアを使ってネットワークの仕組みの理解に役立てようというコンセプトで説明していきます。応用情報技術者試験のために学習したことを実装しながら復習していく感覚で、いろいろ調べながら記事を作成してみました。

仕組みを理解するという趣旨であり、本格的なものではございません。

目標（ゴール）は内部的にだけ名前解決ができる事、DHCPサーバを立ててIPアドレスが自動割り振りされる事です。

## ２．ネットワークの構成
下記のような構成とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/c1edcd6a-8da8-85ea-fb92-86b7d4ed5f02.png)

## ３．VMの構築

アダプター１にNAT（ネット接続用）、アダプター２に内部ネットワーク（ここでは名前を"intranet01"とする）に設定します。インターネットに接続しない場合は、Ubuntu側で適宜接続を切ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/65350b2c-a80d-459f-6ea4-ae6d41dfd973.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/f366382c-3e79-9b80-c48d-09c97510c193.png)

## ４．DNSの構築

このあたりを参考にさせて頂きました。

https://zenn.dev/tochiman/articles/5434d4a1e40820

https://qiita.com/sugimount/items/ae251b187d18de7684eb


bind9というツールを使ってDNSの設定を行っていきます。
bind9-utilsも同時にインストールしていきます。

```bash:bash
sudo apt update && sudo apt install bind9 bind9-utils
```

bindに関する設定は etc/bindにあります。
ここでもまた、一般的にはviやvimを使うと思うのですが私は苦手なので、GUI中心に操作していきます。私と同じような環境を構築したければ、以下が参考になるかと思います（話の脱線）。

https://qiita.com/yknm1989/items/7eaca850a4a0a05a5113

### 設定ファイルの編集
ファイルアプリ→＋他の場所→このコンピュータ→etc/bind/

bindはnamedという名前で動作します。

namedが起動するとまずnamed.confを読みにいき、そこに記載されているパスの設定ファイルを見にいきます。
要は、基本となる設定ファイルから、追加の設定ファイルを読み込みにいっているということです。
includeするパスに設定ファイルのパスを追記することで、設定ファイルを見にいくことができるようになります。

```bash:named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
// 追記
include "/etc/bind/named.conf.internal-zones";
```
いま追記したパスには設定ファイルがありません。
named.conf.default-zonesを参考にして、named.conf.internal-zonesを新規作成します。
ここでfileに指定したものがDNSゾーンファイルになります。

```bash:named.conf.internal-zones
zone "mydnstest.home" IN {
	type	master;
	file	"/etc/bind/mydnstest.home.lan";
};
zone "1.16.172.in-addr.arpa" IN {
	type	master;
	file	"/etc/bind/db.1.16.172";
};
```
こちらはBINDのオプションファイルになります。ACL（アクセス制御リスト）の定義や、DNSのオプション設定から様々なDNSの挙動について設定することができます。

ACLに設定したネットワークのクエリを許可し、それ以外のネットワークのクエリには対応しないようになります。DNSサーバーが特定のネットワーク（例えば社内ネットワークや特定のデータセンター）からのクエリのみを受け入れるように制御するという意図ですね。

```bash:named.conf.options
acl internal-network {
	172.16.1.0/24;
};
options {
	directory "/var/cache/bind";
	// 問い合わせを受け付けるネットワーク
	allow-query{
		localhost; internal-network;
	};	
	// 再帰問い合わせ
	recursion no;
 
	dnssec-validation auto;
	listen-on-v6 { any; };
};
```
正引き用ゾーンファイル
```bash:mydnstest.home.lan
$TTL 86400
@   IN  SOA ns1.mydnstest.home. root.mydnstest.home. (
            2024080501 ; Serial
            3600       ; Refresh
            1800       ; Retry
            604800     ; Expire
            86400      ; Minimum TTL
)
    IN  NS  ns1.mydnstest.home.
ns1 IN  A   172.16.1.3
www IN  A   172.16.1.10
```
逆引きゾーンファイル
```bash:db.1.16.172
$TTL 86400
@   IN  SOA ns1.mydnstest.home. root.mydnstest.home. (
            2024080501 ; Serial
            3600       ; Refresh
            1800       ; Retry
            604800     ; Expire
            86400      ; Minimum TTL
)
    IN  NS  ns1.mydnstest.home.

; PTR records for reverse lookup
3   IN  PTR ns1.mydnstest.home.
10  IN  PTR www.mydnstest.home.
```

インストールするものがなくなった段階でNATアダプターから接続を切ります。
※必要に応じて接続すると思うので、設定自体を削除する必要はないと思います。

DNSサーバー自身のDNSのIPアドレスを自身のものに設定します。

ファイアーウォールの設定を変更します。
ポート53をTCPとUDPの両方で開ける理由は、DNS（Domain Name System）が異なるプロトコルを使用するためです。
```
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
```


## ５．DHCPサーバを立てる

こちらを参考にしました。

https://www.server-world.info/query?os=Ubuntu_22.04&p=dhcp&f=1

DHCPサーバー（isc-dhcp-server）のインストール
```bash:bash
sudo apt install isc-dhcp-server
```
etc/dhcp を見にいき、dhcpd.confを管理者権限で開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/cc84b4db-9609-e778-4004-af99ee7db909.png)

```bash:dhcp.conf
subnet 172.16.1.0 netmask 255.255.255.0{
	range 172.16.1.5 172.16.1.30;
	option routers 172.16.1.1;
	option domain-name-servers 172.16.1.3;
}
```
このDHCP設定は、以下のように機能します。
特に意味はないですが、ipアドレスの割りあて範囲を狭く設定してみました。

サブネットマスク: 172.16.1.0/24（ネットマスク255.255.255.0）
IPアドレスの割り当て範囲: 172.16.1.5から172.16.1.30
デフォルトゲートウェイ: 172.16.1.1
DNSサーバー: 172.16.1.3
この設定により、DHCPサーバーは172.16.1.5から172.16.1.30までのIPアドレスをクライアントに割り当て、デフォルトゲートウェイとして172.16.1.1を指定し、DNSサーバーとして172.16.1.3を使用するように設定します。

### DHCPサーバーの確認
新たに作成したVMで自動設定にし、指定した範囲のipアドレスが振られていることがわかります。
```bash:bash
ip a
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/6baf7e06-9409-8186-5041-868b7644a5a4.png)

クライアント側からDHCPサーバー側の情報を取得します。
```bash:bash
sudo dhclient -v
```

## ６．DNSサーバーの確認

hostコマンド等を使って、正引き・逆引きでそれぞれ名前解決を行っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/4c2caccb-de8c-3bc3-221a-5799b6792ff7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809517/d4535e28-2d5e-6b27-0bc5-705a61f52e51.png)

## まとめ
ひとまずは仮想サーバーを立てることには成功しました。実際にやってみると、「コマンドを打つだけの簡単なお仕事」とはいかず、いろいろな面で理解不足な部分も出てきました。それはまた今後の課題としていきたいと思います。

最初の図ではファイルサーバーがありましたが、本稿にまぜるとさらに複雑になりそうなので、ファイルサーバーについては次回以降取り扱いたいと思います。

何かの足しになれば幸いです。