a tomato

トマトが大好きです

KEA-DHCPの構築

ISC-DHCPからKEA-DHCPに移行した際にサーバ構築を行いましたので、 構築手順をまとめます。今回の移行に至った経緯と現状の懸念事項は、以下の通りです。

採用理由

  • データベースを使ったIPリース状況の管理が出来る
  • ISC-DHCPに比べて高速
  • JSONによる無停止での設定変更
  • 大手企業でも利用されている実績が増えてきていること

懸念事項

  • DHCPフェイルオーバに未対応(RFC3074相当)

参考

f:id:kzdev:20170902055015p:plain

公式HP Kea DHCP server | Internet Systems Consortium

必要なもの


構成

KEAのバックエンドにするデータベースは以下の3種類から選べますが、今回はPostgreSQLを選択しました。

  1. mysql
  2. PostgreSQL
  3. Cassandra
  4. memfile

今回の作業は、以下のバージョンで構築を進めたいと思います。


PostgreSQLインストール

まずは、KEA-DHCPのリース情報、設定を管理するためのデータベースを構築していきます。

事前にデータベースのソースインストールに必要なモジュールをインストールします。

# required libraries install 
$ yum install boost boost-devel gcc gcc-c++ openssl-devel readline-devel -y 
$ yum install epel-release -y 
$ yum --enablerepo=epel install log4cplus -y 
$ yum --enablerepo=epel install log4cplus-devel -y 

次に、PostgreSQLのインストールを行います。 今回は、現時点の最新stableである9.6.4を利用します。

$ wget https://ftp.postgresql.org/pub/source/v9.6.4/postgresql-9.6.4.tar.gz 
$ tar xvzf postgresql-9.6.4.tar.gz
$ cd postgresql-9.6.4
$ ./configure 
$ gmake && make install
 
$ useradd -d /usr/local/pgsql pgsql 
$ passwd pgsql  #任意のパスワードを設定します。

$ su - pgsql 
$ initdb -D /usr/local/pgsql/data --no-locale

起動時に必要となるpostgresql環境変数を定義するファイルを以下の内容で作成する。

$ vim /etc/sysconfig/postgresql
POSTGRES_HOME=/usr/local/pgsql                                                  
PGLIB=$POSTGRES_HOME/lib                                                        
PGDATA=$POSTGRES_HOME/data  

次に、postgresqlの起動スクリプトを定義して、systemctlに登録する。

$ vim /usr/lib/systemd/system/postgresql.service 
[Unit] 
Description=PostgreSQL database server 
After=network.target 

[Service] 
Type=forking 
User=pgsql 
OOMScoreAdjust=-1000 
EnvironmentFile=/etc/sysconfig/postgresql 

ExecStart=/usr/local/pgsql/bin/pg_ctl -w -D /usr/local/pgsql/data start 
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D /usr/local/pgsql/data stop -m fast 

TimeoutSec=300 

[Install] 
WantedBy=multi-user.target 
# localhostからの接続をパスワード認証で行うように設定
$ echo “local   kea_db         kea                                   password” >>  /usr/local/pgsql/data/pg_hba.conf   
$ echo “host    kea_db          kea           127.0.0.1/32            password” >>  /usr/local/pgsql/data/pg_hba.conf   

# postgresqlの自動起動を有効にする
$ systemctl enable postgresql 

# postgresqlを起動する
$ systemctl start postgresql 

postgresqlのdynamicライブラリを読み込む設定ファイルを作成して、共有ライブラリを最新にする。

$ echo “/usr/local/pgsql/lib” > /etc/ld.so.conf.d/pgsql.conf 
$ ldconfig

ldconfigについては、以下を参考にして下さい。

参考 kazmax.zpp.jp


KEA-DHCPのインストール

$ wget https://www.isc.org/downloads/file/kea-1-2-0/?version=tar-gz -O kea-1.2.0.tgz
$ tar xvzf kea-1.2.0.tgz
$ cd kea-1.2.0
$ ./configure --with-dhcp-pgsql=/usr/local/pgsql/bin/pg_config --with-log4cplus 
$ make  
$ make install 
$ ldconfig 

初期データの設定

$ su - pgsql
$ psql postgres
postgres=# CREATE USER kea WITH PASSWORD 'kea';
postgres=# CREATE DATABASE kea_db;
postgres=# GRANT ALL PRIVILEGES ON DATABASE kea_db TO kea;
postgres=# \q

$ exit

# KEA初期データを投入する
$ kea-admin lease-init pgsql -u kea -p kea -n kea_db

KEA-DHCPの設定および起動

PostgreSQLをバックエンドに設定して、KEA-DHCPを起動する。
デフォルトから変更する箇所のみを抜粋しています。

$ vim /usr/local/etc/kea/keactrl.conf 
# Start DHCPv4 server?
dhcp4=yes

# Start DHCPv6 server?
dhcp6=no # DHCPv6を無効化

# Start DHCP DDNS server?
dhcp_ddns=no # DDNSを無効化

# Be verbose?
kea_verbose=no
$ vim /usr/local/etc/kea/kea.conf
"Dhcp4": {
  "interfaces-config": {
  "interfaces": [ "ens3" ]
},
"control-socket": {
  "socket-type": "unix",
  "socket-name": "/tmp/kea-dhcp4-ctrl.sock"
},
"lease-database": {
  "type": "postgresql",
  "persist": true,
  "lfc-interval": 1800,
  "name": "kea_db",
  "user": "kea",
  "password": "kea",
  "host": "",
  "connect-timeout": 5,
  "port": 5432
},
"hosts-database": {
  "type": "postgresql",
  "name": "kea_db",
  "user": "kea",
  "password": "kea",
  "host": "localhost",
  "port": 5432
},
"subnet4": [
{
  "subnet": "192.168.32.0/24",
  "pools": [ { "pool": "192.168.32.30 - 192.168.32.200" } ],
  "option-data": [
  {
    "name": "routers",
    "data": "192.168.32.1"
  }
], 
"Logging":
{
  "loggers": [
  {
    "name": "kea-dhcp4",
    "output_options": [
    {
      "output": "/var/log/kea-dhcp4.log"
$ keactrl start 
$ keactrl status 
DHCPv4 server: active  # activeになることを確認
DHCPv6 server: inactive 
DHCP DDNS: active 
Kea configuration file: /usr/local/etc/kea/kea.conf 
keactrl configuration file: /usr/local/etc/kea/keactrl.conf 

DHCP払出の動作確認

今回は、ネットワーク内でiPhoneを接続しIPアドレスの割当試験を行った。
払出の状況は、以下のログファイルとDBの内容から確認ができる。

$ tail -f /var/log/kea-dhcp4.log

2017-09-01 04:06:40.785 INFO  [kea-dhcp4.leases/12235] DHCP4_LEASE_ADVERT [hwtype=1 9c:04:eb:aa:aa:aa], cid=[01:9c:04:eb:aa:aa:aa], tid=0xf59403a9: lease 192.168.32.30 will be advertised 
2017-09-01 04:06:41.916 INFO  [kea-dhcp4.leases/12235] DHCP4_LEASE_ALLOC [hwtype=1 9c:04:eb:aa:aa:aa], cid=[01:9c:04:eb:aa:aa:aa], tid=0xf59403a9: lease 192.168.32.30 has been allocated 
2017-09-01 04:06:50.207 INFO  [kea-dhcp4.leases/12235] DHCP4_LEASE_ADVERT [hwtype=1 9c:04:eb:aa:aa:aa], cid=[01:9c:04:eb:aa:aa:aa], tid=0xf59403aa: lease 192.168.32.30 will be advertised 
2017-09-01 04:06:51.236 INFO  [kea-dhcp4.leases/12235] DHCP4_LEASE_ALLOC [hwtype=1 9c:04:eb:aa:aa:aa], cid=[01:9c:04:eb:aa:aa:aa], tid=0xf59403aa: lease 192.168.32.30 has been allocated 
2017-09-01 04:06:53.076 INFO  [kea-dhcp4.leases/12235] DHCP4_DECLINE_LEASE Received DHCPDECLINE for addr 192.168.32.30 from client [hwtype=1 9c:04:eb:aa:aa:aa], cid=[01:9c:04:eb:aa:aa:aa], tid=0x0. The lease will be unavailable for 86400 seconds. 

バックエンドに指定したkea_db内のlease4テーブルから、払出を行った端末のIPアドレスやリース期間を確認することが出来る。

kea_db=> SELECT '0.0.0.0'::inet + address as ip_address, encode(hwaddr, 'hex') as hwaddr_enc, lease4.* FROM lease4; 

  ip_address   |  hwaddr_enc  |  address   |     hwaddr     |    client_id     | valid_lifetime |         expire         | subnet_id | fqdn_fwd | fqdn_rev |    hostname     | state  
---------------+--------------+------------+----------------+------------------+----------------+------------------------+-----------+----------+----------+-----------------+------- 
 192.168.32.30 |              | 3232243742 | \x             | \x               |          86400 | 2017-09-02 04:06:53+09 |         1 | f        | f        |                 |     1 
 192.168.32.31 | 9c04eb32100f | 3232243743 | \x9c04eb32100f | \x019c04eb32100f |           3600 | 2017-09-01 05:07:04+09 |         1 | t        | t        | XXXXnoiPhone |     0 

まとめ

今回は、取り急ぎKEA-DHCPの構築のみを行いました。
KEAはフックを使って外部システムとの繋ぎ込みも出来るようなので、今後はフック開発にも着手しようと思います。