Kea DHCP＋MariadbをDockerで構築する

## 目的
isc-dhcp-serverは死ぬらしい。そこで、Keaで構築していく。

## github配置
https://github.com/shoma564/docker-kea


## ディレクトリ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/ab14fd9a-4e4d-7be5-26fb-b4422ba3481e.png)


## 構築
### Dockerfile
```
FROM almalinux:latest
RUN dnf -y update && dnf -y install epel-release && dnf -y install kea
RUN dnf -y localinstall  https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
RUN dnf -y install mysql mysql-community-client

ADD kea-dhcp4.conf /etc/kea/kea-dhcp4.conf
ADD start.sh /etc/kea/start.sh
RUN mkdir -p /var/run/kea/ && touch /var/run/kea/logger_lockfile

ENTRYPOINT ["/etc/kea/start.sh"]
```
### docker-compose.yml
```yml
version: "3.9"
services:
  kea:
    build: .
    image: keadhcp:1.0.0
    container_name: kea
    restart: always
    tty: true
    depends_on:
      - kea-db
    networks:
      net1:
      vlan0:
        ipv4_address: 172.24.20.211



  kea-db:
    container_name: kea-db
    restart: always
    build:
      context: ./db
    environment:
      MARIADB_ROOT_PASSWORD: kea
      MARIADB_DATABASE: kea
      MARIADB_USER: kea
      MARIADB_PASSWORD: kea
      TZ: 'Asia/Tokyo'
    volumes:
      - ./db/data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      net1:


networks:
  net1:

  vlan0:
    name: vlan0
    driver: macvlan
    driver_opts:
      parent: ens3
    ipam:
      config:
        - subnet: 172.24.20.0/24
          gateway: 172.24.20.254
```

### start.sh
```sh
#!/bin/bash
sleep 10
kea-admin db-init mysql -u kea -p kea -n kea -h kea-db
/usr/sbin/kea-dhcp4 -c /etc/kea/kea-dhcp4.conf
```



### kea-dhcp4.conf
```conf
{

"Dhcp4": {
    "interfaces-config": {
        "interfaces": [ "eth1" ]  // ココにインターフェース名を追加
    },
    "control-socket": {
        "socket-type": "unix",
        "socket-name": "/tmp/kea-dhcp4-ctrl.sock"
    },

    "lease-database": {
         "type": "mysql",
         "name": "kea",
         "user": "kea",
         "password": "kea",
         "host": "kea-db",
         "port": 3306
    },

     "hosts-database": {
         "type": "mysql",
         "name": "kea",
         "user": "kea",
         "password": "kea",
         "host": "kea-db",
         "port": 3306
     },

    "expired-leases-processing": {
        "reclaim-timer-wait-time": 10,
        "flush-reclaimed-timer-wait-time": 25,
        "hold-reclaimed-time": 3600,
        "max-reclaim-leases": 100,
        "max-reclaim-time": 250,
        "unwarned-reclaim-cycles": 5
    },
    "renew-timer": 900,
    "rebind-timer": 1800,
    "valid-lifetime": 3600,
    "option-data": [
        {
            "name": "domain-name-servers",
            "data": "172.24.2.51, 8.8.4.4"    // DNSサーバのIPアドレスへ変更
        },
        {
            "name": "default-ip-ttl",
            "data": "0xf0"
        }
    ],
    "subnet4": [
        {
            "subnet": "172.24.20.0/24",   // サブネットを変更
            "pools": [ { "pool": "172.24.20.160 - 172.24.20.200" } ], // DHCPプ ールの変更
            "option-data": [
                {
                    "name": "routers",
                    "data": "172.24.20.254"   // デフォルトゲートウェイの変更
                }
            ],
        }
    ],
    "loggers": [{
        "name": "kea-dhcp4",
        "output_options": [
            {
                "output": "stdout",
                "pattern": "%-5p %m\n"
            }
        ],
        "severity": "INFO",
        "debuglevel": 0
    }]
  }
}
```

### db/Dokerfile
```Dockerfile
FROM mariadb:latest
RUN touch /var/log/mysql/mysqld.log

ADD  my.cnf /etc/mysql/conf.d/my.cnf
ADD sql.sql /docker-entrypoint-initdb.d
RUN chmod 644 /etc/mysql/my.cnf
```
### db/my.cnf
```
[mysqld]
# 文字コード、整合順序の設定
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
```

### db/sql.sql
```sql
GRANT ALL PRIVILEGES ON kea.* TO 'kea'@'localhost' IDENTIFIED BY 'kea';
FLUSH PRIVILEGES;
```

## 解説
### ネットワークの設定
今回、dbとdhcpサーバー間をdocker-composeの名前解決で行いたかったので、ネットワークの設定は```network_mode:host```ではなく、```macvlan```である

以下の様に設定する事によって、Dockerホストと同じIP空間を用いる事が出来る。
```docker-compose.yml
    networks:
      net1:
      vlan0:
        ipv4_address: 172.24.20.211
```

### 起動時の挙動
```depends_on```で起動順の指定はしているが、```sleep 10```を入れている。```kea-admin```コマンドを用いる事によってデータベースの作成を行う。

```sh
#!/bin/bash
sleep 10
kea-admin db-init mysql -u kea -p kea -n kea -h kea-db
/usr/sbin/kea-dhcp4 -c /etc/kea/kea-dhcp4.conf
```

### データベースの設定
データベース、ユーザーの作成は、docker-compose内で行っているので、sqlファイルでは、作成したユーザーに権限付与を行っている。

```sql
GRANT ALL PRIVILEGES ON kea.* TO 'kea'@'localhost' IDENTIFIED BY 'kea';
FLUSH PRIVILEGES;
```

## 確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738475/9f3e1d1b-6f83-a90a-6b95-1a60515b6e10.png)