ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

DHCPサーバーに繋がらなくなった

とある環境を構築中に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をオフに設定しました。設定は以下を参考にしました。

qiita.com

設定を反映させるため、サーバーを再起動します。

% 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を使う方法は以下に書かれています。

Debian Stretch - Without Systemd