とある環境を構築中にDHCPサーバーに繋がらなくなってしまいました。
とりあえず、VLANを切り替えて自分が構築したDHCPサーバーにアクセスできるように設定したのですが、それでもDHCPサーバーに接続できません。ところがすでにDHCPサーバーからIPアドレスを貰っている端末は問題ありません。原因は配布できるIPアドレスがないのか、それともサーバーの設定の問題なのかだと思いますが、早速調べてみることにしました。
tcpdumpコマンドでみると、DHCPリクエストは投げているようです。でも応答は返してくれない。ちなみにIPアドレスを固定にすると外部インターネットにアクセス出来るのを確認しました。 また、サービスのステータスを見るとなにも出力されず、再起動するとIPv6のサービスを起動しようとしてError扱いになっているようです。このことからクライアントが問題という訳ではなく、サーバー側の問題である可能性が高くなりました。
この環境は現在Debian 9で稼働しており、DNSはdnsmasqでDHCPサーバーはISC DHCPサーバーを利用しています。dnsmasqでDHCPサーバーを稼働することも出来るのですが、一部のクライアントと相性が悪かったために見送りになりました。現在のDebianの標準のInitはsystemdなのですが、諸事情でSysVInitを使っているのも通常と異なる構成になっています。
Debian 9ではクライアントに配布する系の設定は/etc/dhcp/dhcpd.conf、サーバー自体の設定は/etc/default/isc-dhcp-serverに書かれているようです。「そういえばインストールしたときに/etc/default/isc-dhcp-server側の設定はいじっていなかったな」と思い、ファイルを開いてみました。案の定設定を書き換えた形跡はありません。ローカル環境でIPv6を使うことはもうしばらくないと思ったため、次のように設定変更しました。
# vi /etc/default/isc-dhcp-server # Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf). DHCPD_CONF=/etc/dhcp/dhcpd.conf # Path to dhcpd's PID file (default: /var/run/dhcpd.pid). DHCPD_PID=/var/run/dhcpd.pid # Additional options to start dhcpd with. # Don't use options -cf or -pf here; use DHCPD_CONF/ DHCPD_PID instead OPTIONS="-4" # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". INTERFACES="eth0"
OPTIONSがDHCPDの起動オプションです。-4でIPv4で待ち受けしなさいと指定しています。設定にパラメーターがあったためインターフェイスも指定しました。また、システム自体もIPv6をオフに設定しました。設定は以下を参考にしました。
設定を反映させるため、サーバーを再起動します。
% sudo service isc-dhcp-server restart [sudo] password for ytooyama: [ ok ] Stopping ISC DHCPv4 server: dhcpd. DHCPv4 interfaces are no longer set by the INTERFACES variable in /etc/default/isc-dhcp-server. Please use INTERFACESv4 instead. Migrating automatically for now, but this will go away in the future. Launching IPv4 server only. [ ok ] Starting ISC DHCPv4 server: dhcpd. % sudo service isc-dhcp-server status Status of ISC DHCPv4 server: dhcpd is running.
サービスは起動しましたが、なんか警告が出ていますね。そこで設定を次のように書換えました。
... # On what interfaces should the DHCP server (dhcpd) serve DHCP requests? # Separate multiple interfaces with spaces, e.g. "eth0 eth1". #INTERFACES="eth0" INTERFACESv4="eth0"
今度は警告も消えてきれいになりました。動作確認のために新しいサーバーを起動したところ、IPv4アドレスをきちんともらうことができました。これにて問題解決です。
% sudo service isc-dhcp-server restart [ ok ] Stopping ISC DHCPv4 server: dhcpd. Launching IPv4 server only. [ ok ] Starting ISC DHCPv4 server: dhcpd. % sudo service isc-dhcp-server status Status of ISC DHCPv4 server: dhcpd is running. % ps aux|grep dhcp root 3498 0.0 0.5 14012 5892 ? Ss 15:46 0:00 /usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf eth0 ytooyama 3531 0.0 0.0 4736 804 pts/0 S+ 15:47 0:00 grep dhcp
ちなみに、Debian 9でSysV Initを使う方法は以下に書かれています。