10.2. DHCP サーバーの設定

dhcp パッケージには、Internet Systems Consortium (ISC) DHCP サーバーが含まれています。root でこのパッケージをインストールします。
~]# yum install dhcp
dhcp パッケージをインストールすると、/etc/dhcp/dhcpd.conf ファイルが作成されます。これは単なる空の設定ファイルです。root で以下のコマンドを実行します。
~]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
サンプルの設定ファイルは、/usr/share/doc/dhcp-version;/dhcpd.conf.example にあります。/etc/dhcp/dhcpd.conf を設定するする際に、このファイルを使用してください。詳細は以下で説明します。
また、DHCP/var/lib/dhcpd/dhcpd.leases ファイルを使用してクライアントのリースデータベースを格納します。詳細は 「リースデータベース」 を参照してください。

10.2.1. 設定ファイル

DHCP サーバーを設定するには、最初にクライアントのネットワーク情報を保存している設定ファイルを作成します。このファイルを使用して、クライアントシステムに対するオプションを宣言します。
設定ファイルには追加のタブや空白行が含まれているため、簡単に書式を整えることができます。キーワードは大文字と小文字の区別がなく、行頭がハッシュ記号 (#) で始まる行はコメントとみなされます。
設定ファイルのステートメントには、次のような 2 つのタイプがあります。
  • パラメーター — タスクの実行方法、タスクを実行するかどうか、クライアントに送信するネットワーク設定のオプションを規定します。
  • 宣言 — ネットワークトポロジの記述、クライアントの記述、クライアントのアドレス指定、宣言グループへのパラメーターグループの適用を行います。
キーワードオプションから始まるパラメーターは、オプション と呼ばれます。オプションは、DHCP オプションを制御します。一方、パラメーターはオプションでない値を設定し、DHCP サーバーの動作を制御します。
中括弧 ({ }) で囲まれたセクションの前で宣言されたパラメーター (オプションを含む) は、グローバルパラメーターとみなされます。グローバルパラメーターは、これ以降のすべてのセクションに適用されます。

重要

設定ファイルが変更された場合、systemctl restart dhcpd コマンドを使って DHCP デーモンを再起動するまでは変更内容は反映されません。

注記

毎回 DHCP 設定ファイルを変更してサービスを再起動させる代わりに、omshell コマンドを使用すると、DHCP サーバーへの接続、クエリー、設定の変更をインタラクティブに行うことができます。omshell を使用すると、DHCP サーバーの実行中でも変更を行うことができます。omshell の詳細については、omshell の man ページを参照してください。
例10.1「サブネットの宣言」 では、routerssubnet-maskdomain-searchdomain-name-servers、および time-offset の各オプションは、それらの下で宣言されている host ステートメントに使用されます。
機能するサブネットと、DHCP サーバーが接続するサブネットではすべて、subnet 宣言が 1 つ必要になります。これは DHCP デーモンにアドレスがそのサブネット上にあることを認識する方法を指示します。subnet 宣言は、そのサブネットに動的に割り当てるアドレスがない場合でも、各サブネットに必要となります。
この例では、サブネット内のすべての DHCP クライアントに対するグローバルオプションと range が宣言されています。クライアントには range 内の IP アドレスが割り当てられています。

例10.1 サブネットの宣言

subnet 192.168.1.0 netmask 255.255.255.0 {
        option routers                  192.168.1.254;
        option subnet-mask              255.255.255.0;
        option domain-search              "example.com";
        option domain-name-servers       192.168.1.1;
        option time-offset              -18000;     # Eastern Standard Time
	range 192.168.1.10 192.168.1.100;
}
サブネット内のシステムに動的 IP アドレスをリースする DHCP サーバーを設定するには、例10.2「Range パラメーター」 の例の値を修正します。これにより、クライアントのデフォルトのリース時間、最大リース時間、ネットワークの設定値を宣言します。この例ではクライアントシステムに、range 192.168.1.10 から 192.168.1.100 までの IP アドレスを割り当てます。

例10.2 Range パラメーター

default-lease-time 600;
max-lease-time 7200;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
option routers 192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-search "example.com";
subnet 192.168.1.0 netmask 255.255.255.0 {
   range 192.168.1.10 192.168.1.100;
}
ネットワークインターフェースカードの MAC アドレスに基づいてクライアントに IP アドレスを割り当てるには、host 宣言内の hardware ethernet パラメーターを使用します。例10.3「DHCP を使用した静的 IP アドレス」 の例では、host apex 宣言により、MAC アドレス 00:A0:78:8E:9E:AA のネットワークインターフェースカードが常に IP アドレス 192.168.1.4 を受け取るように指定されます。
オプションのパラメーターである host-name を使用すると、クライアントにホスト名を割り当てることができる点にも留意してください。

例10.3 DHCP を使用した静的 IP アドレス

host apex {
   option host-name "apex.example.com";
   hardware ethernet 00:A0:78:8E:9E:AA;
   fixed-address 192.168.1.4;
}
Red Hat Enterprise Linux 7 では、InfiniBand IPoIB インターフェースへの静的 IP アドレスの割り当てをサポートしています。ただし、これらのインターフェースには通常のハードウェアイーサネットアドレスがないため、IPoIB インターフェースに一意の ID を指定する別の方法を使用する必要があります。標準では、オプションの dhcp-client-identifier= コンストラクトを使用して、IPoIB インターフェースの dhcp-client-identifier フィールドを指定します。DHCP サーバーのホストコンストラクトは、最大でホストの 1 節あたりハードウェアイーサネット 1 つと dhcp-client-identifier エントリー 1 つをサポートします。ただし、固定アドレスエントリーは複数ある場合があり、DHCP サーバーは、DHCP リクエストを受信したネットワークに適切なアドレスに自動的に応答します。

例10.4 複数インターフェースにおける DHCP を使用した静的 IP アドレス

たとえば 2 つの InfiniBand インターフェースと各物理的インターフェース上に P_Key インターフェースがあり、イーサネット接続もある場合など、マシンの設定が複雑な場合は、以下の静的 IP コンストラクトを使用することができます。
Host apex.0 {
    option host-name “apex.example.com”;
    hardware ethernet 00:A0:78:8E:9E:AA;
    option dhcp-client-identifier=ff:00:00:00:00:00:02:00:00:02:c9:00:00:02:c9:03:00:31:7b:11;
    fixed-address 172.31.0.50,172.31.2.50,172.31.1.50,172.31.3.50;
}

host apex.1 {
    option host-name “apex.example.com”;
    hardware ethernet 00:A0:78:8E:9E:AB;
    option dhcp-client-identifier=ff:00:00:00:00:00:02:00:00:02:c9:00:00:02:c9:03:00:31:7b:12;
    fixed-address 172.31.0.50,172.31.2.50,172.31.1.50,172.31.3.50;
}
デバイスに適切な dhcp-client-identifier を見つけるには、通常、接頭辞 ff:00:00:00:00:00:02:00:00:02:c9:00 を使用して、IPoIB インターフェースの最後の 8 バイトを追加します (これは、 IPoIB インターフェースが接続されている InfiniBand ポートの 8 バイトの GUID と同じものです)。旧式のコントローラーのなかには、この接頭辞が適切でないものもあります。その場合、DHCP サーバーで tcpdump を使用し、着信 IPoIB DHCP リクエストを取得して、そこから適切な dhcp-client-identifier を収集することが推奨されます。例を示します。
]$ tcpdump -vv -i mlx4_ib0
tcpdump: listening on mlx4_ib0, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
23:42:44.131447 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
    0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request, length 300, htype 32, hlen 0, xid 0x975cb024, Flags [Broadcast] (0x8000)
          Vendor-rfc1048 Extensions
            Magic Cookie 0x63825363
            DHCP-Message Option 53, length 1: Discover
            Hostname Option 12, length 10: "rdma-qe-03"
            Parameter-Request Option 55, length 18:
              Subnet-Mask, BR, Time-Zone, Classless-Static-Route
              Domain-Name, Domain-Name-Server, Hostname, YD
              YS, NTP, MTU, Option 119
              Default-Gateway, Classless-Static-Route, Classless-Static-Route-Microsoft, Static-Route
              Option 252, NTP
            Client-ID Option 61, length 20: hardware-type 255, 00:00:00:00:00:02:00:00:02:c9:00:00:02:c9:02:00:21:ac:c1
上記のダンプでは、Client-ID フィールドが表示されています。hardware-type 255 は ID の最初の ff: に対応しており、ID の残りの部分は DHCP 設定ファイルに表記するそのままの形で引用されています。
同じ物理ネットワークを共有するすべてのサブネットは、例10.5「Shared-network 宣言」 のように shared-network 宣言内で宣言される必要があります。shared-network 内でも囲まれた subnet 宣言の外にあるパラメーターは、グローバルパラメーターとみなされます。shared-network に割り当てる名前は、そのネットワークの記述的なタイトルにします。たとえば、テストラボ環境のサブネットの場合は、test-labというタイトルにします。

例10.5 Shared-network 宣言

shared-network name {
    option domain-search            "test.redhat.com";
    option domain-name-servers      ns1.redhat.com, ns2.redhat.com;
    option routers                  192.168.0.254;
    #more parameters for EXAMPLE shared-network
    subnet 192.168.1.0 netmask 255.255.252.0 {
        #parameters for subnet
        range 192.168.1.1 192.168.1.254;
    }
    subnet 192.168.2.0 netmask 255.255.252.0 {
        #parameters for subnet
        range 192.168.2.1 192.168.2.254;
    }
}
例10.6「Group 宣言」 にあるように、group 宣言を使用すると、宣言のグループにグローバルパラメーターを適用できます。たとえば、共有ネットワーク、サブネット、ホストをグループ化することができます。

例10.6 Group 宣言

group {
   option routers                  192.168.1.254;
   option subnet-mask              255.255.255.0;
   option domain-search              "example.com";
   option domain-name-servers       192.168.1.1;
   option time-offset              -18000;     # Eastern Standard Time
   host apex {
      option host-name "apex.example.com";
      hardware ethernet 00:A0:78:8E:9E:AA;
      fixed-address 192.168.1.4;
   }
   host raleigh {
      option host-name "raleigh.example.com";
      hardware ethernet 00:A1:DD:74:C3:F2;
      fixed-address 192.168.1.6;
   }
}

注記

提供されている設定ファイルのサンプルをベースとして使用し、それにカスタムの設定オプションを追加することができます。このファイルを適切な場所にコピーするには、root で以下のコマンドを実行します。
~]# cp /usr/share/doc/dhcp-version_number/dhcpd.conf.example /etc/dhcp/dhcpd.conf
ここでの version_number は、DHCP バージョン番号になります。
オプションステートメントの全一覧とその機能については、dhcp-options(5) の man ページを参照してください。

10.2.2. リースデータベース

DHCP サーバーでは、/var/lib/dhcpd/dhcpd.leases ファイルが DHCP クライアントのリースデータベースを格納しています。このファイルは変更しないでください。最近割り当てられた各 IP アドレスの DHCP リース情報は、このリースデータベースに自動的に保存されます。この情報には、リース期間、IP アドレスの割り当て先、リースの開始日と終了日、リース取得に使用されるネットワークインターフェースカードの MAC アドレスが含まれます。
リースデータベースの時刻はすべて、現地時間でなく協定世界時 (UTC) を使用します。
リースデータベースは、サイズが大きくなり過ぎるのを避けるために適宜再作成されます。最初に、すべての既知のリースは一時的なリースデータベースに保存されます。dhcpd.leases ファイルの名前は dhcpd.leases~ に変更され、一時的なリースデータベースが dhcpd.leases に書き込まれます。
リースデータベースがバックアップファイルに名前変更された後、新規ファイルが書き込まれる前に、DHCPDHCP デーモンが強制終了されるか、システムがクラッシュする可能性があります。この場合、dhcpd.leases ファイルは存在しませんが、サービスを起動する必要があります。この際、新規のリースファイルを作成しないでください。作成すると、それまでのリースはすべて失われ、多くの問題が発生します。これを解決する方法は、dhcpd.leases~ バックアップファイルの名前を dhcpd.leases に変更して、デーモンを起動することです。

10.2.3. サーバーの起動と停止

重要

DHCP サーバーの初回起動時には、dhcpd.leases ファイルが存在しないと起動に失敗します。ファイルが存在しない場合、touch /var/lib/dhcpd/dhcpd.leases コマンドを使用してファイルを作成してください。このサーバーが DNS サーバーとして BIND も実行している場合、このステップは不要です。named サービスを開始すると、自動的に dhcpd.leases ファイルを確認するためです。
これまで稼働していたシステムで、新規のリースファイルを作成しないでください。作成すると、それまでのリースはすべて失われ、多くの問題が発生します。これを解決する方法は、dhcpd.leases~ バックアップファイルの名前を dhcpd.leases に変更して、デーモンを起動することです。
DHCP サービスを起動するには、以下のコマンドを実行します。
systemctl start dhcpd.service
DHCP サービスを停止するには、以下のコマンドを実行します。
systemctl stop dhcpd.service
デフォルトでは、DHCP サービスはブート時に起動しません。ブート時にデーモンが自動的に起動するように設定する方法については、Red Hat Enterprise Linux 7 システム管理者のガイド を参照してください。
システムに複数のネットワークインターフェースが接続されており、DHCP サーバーがいずれか 1 つのインターフェースでのみ DHCP リクエストをリッスンするようにするには、DHCP サーバーがそのデバイス上でのみリッスンするように設定します。DHCP デーモンは、/etc/dhcp/dhcpd.conf ファイル内でサブネット宣言がなされているインターフェース上でのみ、リッスンします。
これは、ネットワークカードが 2 つあるファイアウォールマシンで役立ちます。1 つのネットワークカードを DHCP クライアントとして設定してインターネットの IP アドレスを取得します。もう 1 つのネットワークカードは、ファイアウォールの背後にある内部ネットワークの DHCP サーバーとして使用できます。内部ネットワークに接続されたネットワークカードのみを指定するとユーザーはインターネット経由でデーモンに接続できないため、システムをよりセキュアにすることができます。
コマンドラインオプションを指定するには、rootdhcpd.service ファイルをコピーしてから編集します。例を示します。
~]# cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
~]# vi /etc/systemd/system/dhcpd.service
[Service] セクションの下にある行を編集します。
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid your_interface_name(s)
その後に root でサービスを再起動します。
~]# systemctl --system daemon-reload
~]# systemctl restart dhcpd
/etc/systemd/system/dhcpd.service ファイルの [Service] セクションの下では、ExecStart=/usr/sbin/dhcpd にコマンドラインオプションを追加することができます。使用可能なオプションには、以下のものがあります。
  • -p portnumdhcpd がリッスンする UDP ポート番号を指定します。デフォルト値はポート 67 です。DHCP サーバーは、指定された UDP ポートよりも番号が 1 つ大きいポートにある DHCP クライアントに応答を送信します。たとえば、デフォルトのポート 67 を使用する場合、サーバーはポート 67 でリクエストをリッスンし、ポート 68 にあるクライアントに応答します。ポートが指定され、DHCP リレーエージェントが使用される場合、DHCP は DHCP リレーエージェントがリッスンするポートと同じポートを指定する必要があります。詳細は 「DHCP リレーエージェント」 を参照してください。
  • -f — フォアグラウンドプロセスとしてデーモンを実行します。これは主にデバッグ用に使用されます。
  • -d — 標準エラー記述子に DHCP サーバーデーモンを記録します。これは主にデバッグ用に使用されます。このオプションを指定しないと、ログは /var/log/messages に書き込まれます。
  • -cf filename — 設定ファイルの場所を指定します。デフォルトの場所は /etc/dhcp/dhcpd.conf です。
  • -lf filename — リースデータベースファイルの場所を指定します。リースデータベースファイルが既に存在する場合、DHCP サーバーを起動する度に、同じファイルが使用されるようにすることが非常に重要です。このオプションは、実稼働環境以外のマシンでデバッグする目的にのみ使用することが強く推奨されます。デフォルトの場所は /var/lib/dhcpd/dhcpd.leases です。
  • -q — デーモンの起動時に著作権に関するメッセージ全体を表示しません。