らくがきちょう

なんとなく

dhtest を使って DHCP サーバをテストする

DHCP サーバの動作確認テストを行いたい場合、実機の DHCP クライアント機能を使っていては大量の試験を実施するのは難しいです。 そういった場合、dhtest を使うことでダミーの MAC アドレスを使って DHCP サーバの動作を確認することが出来ます。 今回は DHCP サーバを作り、dhtest で動作確認を行う… という流れを試してみます。

DHCP サーバのインストール

yum で標準リポジトリからインストールします。

yum -y install dhcp

設定ファイルにサブネットの定義を追加します。 設定ファイルは /etc/dhcp/dhcpd.conf にあります。 ログは LOCAL4 扱いとしました。

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

log-facility local4;

subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.1 192.168.1.99;
        option routers 192.168.1.254;
        option domain-name-servers 8.8.8.8;
}

DHCP サーバは dhcpd ユーザで動作しますので、このユーザが書き込める所有者/権限でログファイルを作成しておきます。

touch /var/log/dhcpd.log
chown dhcpd. /var/log/dhcpd.log

サービスを起動します。 併せて自動起動の設定も実施しておきます。

systemctl start dhcpd.service
systemctl enable dhcpd.service

DHCP のログをファイルに出力する為、/etc/rsyslog.conf へ以下を追記します(※ LOCAL4 は未定義で、今回はじめて設定する前提です

# Dhcp server
local4.*                                                /var/log/dhcpd.log

もし、外部の Syslog サーバへログを UDP/514 で送信するのであれば以下のように設定します。

# Dhcp server
local4.*                                                @10.0.0.1:514

TCP/514 で送信するには以下のように設定します(アットマークの数が UDP の場合と異なります)。

# Dhcp server
local4.*                                                @@10.0.0.1:514

設定変更を反映する為、rsyslog デーモンを再起動します。

systemctl restart rsyslog.service

Syslog を受信する側のサーバでも「このサーバからの受信を許可する」設定を実施しておきます。

dhtest のコンパイル

DHCP クライアントを模したテストには Linux dhcp client simulation tool で公開されている dhtest が便利です。 dhtestGitHubソースコードが配布されている為、自分でコンパイルする必要があります。 コンパイルに必要なので gccmake をインストールしておきます。

yum -y install gcc make

GitHub から最新のソースコードを取得し、展開してコンパイルします。

curl -L -O https://github.com/saravana815/dhtest/archive/master.zip
unzip master.zip
cd dhtest-master/
make
cp dhtest /usr/local/bin/

dhtest の使い方

dhtest は以下のように使います。 -iDHCP discover を送信するインターフェイスを指定し、-mMAC アドレスを指定します。 尚、dhtest を実行すると MAC アドレスと同じファイル名を作成しますので、スクリプトで連続実行すると大量のファイルが出来ることになる為、要注意です。

# dhtest -i ens192 -m 00:00:11:22:33:44
DHCP discover sent   - Client MAC : 00:00:11:22:33:44
DHCP discover sent   - Client MAC : 00:00:11:22:33:44
DHCP offer received  - Offered IP : 192.168.1.2
DHCP request sent    - Client MAC : 00:00:11:22:33:44
DHCP ack received    - Acquired IP: 192.168.1.2

詳細ログを表示するには -V オプションを指定します。

# dhtest -i ens192 -m 00:00:11:22:33:44 -V
DHCP discover sent   - Client MAC : 00:00:11:22:33:44
DHCP offer received  - Offered IP : 192.168.1.2

DHCP offer details
----------------------------------------------------------
DHCP offered IP from server - 192.168.1.2
Next server IP(Probably TFTP server) - 0.0.0.0
Option no - 53, option length - 1
  OPTION data (HEX)
    02
  OPTION data (ASCII)

DHCP server  - 192.168.1.199
Lease time - 0 Days 12 Hours 0 Minutes
Subnet mask - 255.255.255.0
Router/gateway - 192.168.1.254
DNS server - 8.8.8.8
----------------------------------------------------------

DHCP request sent    - Client MAC : 00:00:11:22:33:44
DHCP ack received    - Acquired IP: 192.168.1.2

DHCP ack details
----------------------------------------------------------
DHCP offered IP from server - 192.168.1.2
Next server IP(Probably TFTP server) - 0.0.0.0
Option no - 53, option length - 1
  OPTION data (HEX)
    05
  OPTION data (ASCII)

DHCP server  - 192.168.1.199
Lease time - 0 Days 12 Hours 0 Minutes
Subnet mask - 255.255.255.0
Router/gateway - 192.168.1.254
DNS server - 8.8.8.8
----------------------------------------------------------

dhtest を使ったサンプルスクリプト

dhtest を使って 10 回、DHCP 要求を出すサンプルは以下の通りです。

#!/bin/sh

for i in `seq -w 10`
do
  dhtest -i ens192 -m 00:00:00:00:00:$i
  rm -f 00:00:00:00:00:$i
done

DHCP で割当てたアドレス状況の確認

DHCP サーバで割当てたアドレスは /var/lib/dhcpd/dhcpd.leases を表示することで確認することが出来ます。

参考

デフォルト状態の /etc/dhcp/dhcpd.conf

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#

dhtest のヘルプ表示

# dhtest --help
Usage: dhtest [ options ]
  -m mac_address
  -N                    # always use interface's MAC address in Ethernet frame
  -r, --release             # Releases obtained DHCP IP for corresponding MAC
  -L, --option51-lease_time [ Lease_time ] # Option 51. Requested lease time in secondes
  -I, --option50-ip [ IP_address ]  # Option 50 IP address on DHCP discover
  -o, --option60-vci    [ VCI_string ]  # Vendor Class Idendifier string
  -h, --option12-hostname [ hostname_string ] # Client hostname string
  -c, --custom-dhcp-option [ option_format ] # option_format - option_number,type_of_option_value(str|num|hex|ip),option_value
  -v, --vlan        [ vlan_id ] # VLAN ID. Range(1 - 4094)
  -t, --tos     [ TOS_value ]   # IP header TOS value
  -i, --interface   [ interface ]   # Interface to use. Default eth0
  -T, --timeout     [ cmd_timeout ] # Command returns within specified timout in seconds
  -b, --bind-ip             # Listens on the obtained IP. Supported protocols - ARP and ICMP
  -k, --bind-timeout    [ timeout ] # Listen timout in seconds. Default 3600 seconds
  -f, --bcast_flag          # Sets broadcast flag on DHCP discover and request
  -d, --fqdn-domain-name   [ fqdn ] # FQDN domain name to use
  -n, --fqdn-server-not-update      # Sets FQDN server not update flag
  -s, --fqdn-server-update-a        # Sets FQDN server update flag
  -p, --padding             # Add padding to packet to be at least 300 bytes
  -P, --port        [ port ]    # Use port instead of 67
  -g, --giaddr      [ giaddr ]  # Use giaddr instead of 0.0.0.0
  -u, --unicast     [ ip ]      # Unicast request, IP is optional. If not specified, the interface address will be used.
  -a, --nagios              # Nagios output format.
  -S, --server      [ address ] # Use server address instead of 255.255.255.255
  -j, --json                # Set the output format to json
  -D, --decline             # Declines obtained DHCP IP for corresponding MAC
  -V, --verbose             # Prints DHCP offer and ack details
  dhtest version 1.5
  ```