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
が便利です。 dhtest
は GitHub でソースコードが配布されている為、自分でコンパイルする必要があります。 コンパイルに必要なので gcc
と make
をインストールしておきます。
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 は以下のように使います。 -i
で DHCP discover を送信するインターフェイスを指定し、-m
で MAC アドレスを指定します。 尚、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 ```