3 DHCPサービスの構成

動的ホスト構成プロトコル(DHCP)により、クライアント・システムは、ネットワークに接続するたびにDHCPサーバーからネットワーク構成情報を取得できます。DHCPサーバーは、IPアドレスの範囲、およびクライアントで必要なその他のネットワーク構成パラメータを使用して構成されます。

Oracle LinuxシステムをDHCPクライアントとして構成すると、クライアント・デーモンdhclientで、DHCPサーバーに接続してネットワーキング・パラメータが取得されます。DHCPはブロードキャストベースであるため、クライアントはサーバーまたはリレー・エージェントと同じサブネット上に存在する必要があります。クライアントをサーバーと同じサブネットに配置できない場合は、DHCPリレー・エージェントを使用して、サブネット間でDHCPメッセージを渡すことができます。

このサーバーは、クライアントに割り当てるIPアドレスのリースを行います。クライアントは、リースに関する特定条件(期間など)をリクエストできます。DHCPサーバーは、リースに関して付与できる条件を制限するように構成できます。クライアントが継続的にネットワークに接続している場合は、リースが期限切れになる前に、dhclientでリースが自動的に更新されます。DHCPサーバーは、ネットワーク・インタフェースのMACアドレスに基づいて同じIPアドレスをクライアントに割り当てるように構成できます。

DHCPを使用する利点は、次のとおりです。

  • IPアドレスの集中管理

  • 新規クライアントをネットワークに簡単に追加可能

  • IPアドレスの再利用により、必要なIPアドレスの合計数を削減

  • DHCPサーバー上のIPアドレス空間を再構成でき、各クライアントの再構成は不要

DHCPの詳細は、RFC 2131を参照してください。同様に、次のマニュアル・ページを参照してください。

  • dhcpd(8)
  • dhcp-options(5)

サーバーのネットワーク・インタフェースの設定

デフォルトでは、dhcpdサービスは、ネットワーク・インタフェース上でリクエストを処理して、DHCP構成ファイルにおいて定義されているサブネットにそれらを接続します。

DHCPサーバーに複数のインタフェースがあるとします。そのインタフェースenp0s1を介して、サーバーが、そのサーバーでサービス提供先として構成されている、クライアントと同じサブネットに接続されます。この場合、そのサーバーがそのインタフェースで着信リクエストをモニターし処理できるようにするには、DHCPサービスでenp0s1を設定する必要があります。

次のいずれかの手順に進む前に、次の要件を満たしていることを確認してください。

  • DHCPを構成するための適切な管理権限がある。
  • dhcp-serverパッケージをインストールしてある。

    していない場合は、次のコマンドを使用してそのパッケージをインストールします。

    sudo dnf install dhcp-server

次のように、ネットワーク・インタフェースを構成します。

  • IPv4ネットワークの場合:
    1. /usr/lib/systemd/system/dhcpd.serviceファイルを/etc/systemd/system/ディレクトリにコピーします。
      sudo cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/
    2. /etc/systemd/system/dhcpd.serviceを編集します。このためには、ExecStartパラメータを定義する行を見つけます。
    3. dhcpdサービスでリスニングするインタフェースの名前を追加します。

      入力例を太字で示します。

      ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS int1-name int2-name
    4. systemdマネージャ構成をリロードします。
      sudo systemctl daemon-reload
    5. dhcpdサービス構成を再起動します。
      sudo systemctl restart dhcpd.service

      または、次のように入力することもできます。

      sudo systemctl restart dhcpd
  • IPv6ネットワークの場合:
    1. /usr/lib/systemd/system/dhcpd6.serviceファイルを/etc/systemd/system/ディレクトリにコピーします。
      sudo cp /usr/lib/systemd/system/dhcpd6.service /etc/systemd/system/
    2. /etc/systemd/system/dhcpd6.serviceファイルを編集します。このためには、ExecStartパラメータを定義する行を見つけます。
    3. dhcpd6サービスでリスニングする必要があるインタフェースの名前を追加します。

      入力例を太字で示します。

      ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd6.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS int1-name int2-name
    4. systemdマネージャ構成をリロードします。
      sudo systemctl daemon-reload
    5. dhcpdサービス構成を再起動します。
      sudo systemctl restart dhcpd6.service

      または、次のように入力することもできます。

      sudo systemctl restart dhcpd6

DHCP宣言について

DHCPでそのクライアントにサービスを提供する方法は、IPv4ネットワークの場合は/etc/dhcp/dhcpd.confファイル内、IPv6ネットワークの場合は/etc/dhcp/dhcpd6.confファイル内のパラメータと宣言で定義します。このファイルには、クライアント・ネットワーク、アドレス・リース、IPアドレス・プールなどの詳細が含まれています。

注意:

新しくインストールされたOracle Linuxシステムでは、dhcpd.confファイルとdhcpd6.confファイルは両方とも空になっています。DHCPに関してサーバーを初めて構成する場合は、テンプレートを使用すると、それらのファイルを構成しやすくなります。次のコマンドのどちらかを入力します。
  • IPv4の場合
    cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
  • IPv6の場合
    cp /usr/share/doc/dhcp-server/dhcpd6.conf.example /etc/dhcp/dhcpd6.conf

その後、どちらかのファイルを開くと、参考のために例と説明が示されます。

構成ファイル内の情報は、次の宣言の組合せからなります。

グローバル設定

グローバル・パラメータにより、DHCPサーバーによるサポート対象またはサービス提供対象となるすべてのネットワークに適用する設定を定義します。

次のような設定をネットワーク全体にグローバルに適用する場合について考えてみましょう。

  • 企業ネットワークのドメイン名: example.com.d
  • ネットワークのDNSサーバー: dn1.example.comおよびdns2.example.com
  • すべてのクライアントに割り当てられたリース時間: 12時間(43200秒)
  • 割当て可能な最大リース時間: 24時間(86400秒)

この場合は、次のように、構成ファイル内のグローバル設定を構成します。

option domain-name "example.com";
default-lease-time 43200;
max-lease-time 86400;

authoritative;

authoritativeパラメータにより、そのサーバーをDHCPサービス用の公式またはプライマリ・サーバーとして特定します。このパラメータは、通常は、複数のDHCPサーバーがある設定において使用します。authoritativeパラメータが指定されているサーバーでは、そのパラメータが指定されていないサーバーよりも、優先的にリクエストが処理されます。

サブネット宣言

subnet宣言により、DHCPサーバーを直接接続するサブネット、およびそのサブネット内のシステムがクライアントとして機能を果たす場所について、詳細を提供します。

次のような、DHCPサーバーの構成について考えてみましょう。

  • サーバーのenp0s1インタフェースが192.0.2.0/24ネットワークに直接接続されます。
  • 192.0.2.0/24ネットワーク内のシステムはDHCPクライアントです。
  • このクライアント・サブネットのトポロジは次のとおりです。
    • サブネットのDNSサーバー: 192.0.2.1
    • サブネットのゲートウェイ: 192.0.2.1
    • ブロードキャスト・アドレス: 192.0.2.255
    • クライアントのアドレス範囲: 192.0.2.10から192.0.2.100
    • 各クライアントの最大リース時間: 86,400秒(1日)
この場合は、dhcp.confに次の宣言を入力します。

subnet 192.0.2.0 netmask 255.255.255.0 {
  range 192.0.2.10 192.0.2.100;
  option domain-name-servers 192.0.2.1;
  option routers 192.0.2.1;
  option broadcast-address 192.0.2.255;
  max-lease-time 86400;
}

IPv6ネットワーク環境では、dhcpd6.confファイル内のsubnet宣言は次の例のようになります。

subnet6 2001:db8:0:1::/64 {
  range6 2001:db8:0:1::20 2001:db8:0:1::100;
  option dhcp6.name-servers 2001:db8:0:1::1;
  max-lease-time 172800;
}

共有ネットワーク宣言

DHCPサーバーで、サーバーを、そのサーバーに直接接続されていない他のサブネット内のクライアントに提供する必要がある場合は、shared-network宣言を定義します。

次の例を考えてみましょう。この例では、前のセクションのシナリオを少し発展させています。

  • DHCPサーバーは192.0.2.0/24ネットワークに属していますが、このネットワーク内のシステムにサービスを提供しません。
  • このサーバーは、次のリモート・サブネット内のクライアントからのリクエストを処理します。
    • 192.168.5.0/24.
    • 198.51.100.0/24.
  • 複数のリモート・サブネットで同じDNSサーバーが共有されますが、各サブネットにそれ固有のルーターとIPアドレス範囲があります。

この場合は、dhcp.confに次の宣言を入力します。

shared-network example {
 
  option domain-name-servers 192.168.2.1;
  ...

  subnet 192.168.5.0 netmask 255.255.255.0 {
    range 192.168.5.10 192.168.5.100;
    option routers 192.168.5.1;
  }

  subnet 198.51.100.0 netmask 255.255.255.0 {
    range 198.51.100.10 198.51.100.100;
    option routers 198.51.100.1;
  }
  ...
}

subnet 192.0.2.0 netmask 255.255.255.0 {
}

前述の例では、最後のsubnet宣言は、このサーバーの固有のネットワークを示しており、shared-networkスコープの範囲外です。この宣言は、空宣言と呼ばれます。これは、それがこのサーバーのサブネットを定義しているためです。このサーバーはこのサブネットにサービスを提供しないため、リース、アドレス範囲、DNS情報などのその他のエントリは追加されていません。この宣言は、空ですが必要なものであり、これがないとdhcpdサービスが開始されません。

IPv6ネットワーク環境では、dhcpd6.confファイル内のshared-network宣言は次の例のようになります。

shared-network example {
  option domain-name-servers 2001:db8:0:1::1:1
  ...

  subnet6 2001:db8:0:1::1:0/120 {
    range6 2001:db8:0:1::1:20 2001:db8:0:1::1:100
  }

  subnet6 2001:db8:0:1::2:0/120 {
    range6 2001:db8:0:1::2:20 2001:db8:0:1::2:100
  }
  ...
}

subnet6 2001:db8:0:1::50:0/120 {
}

ホスト宣言

クライアントに静的IPアドレスが必要な場合は、host宣言を定義します。

次のような、サーバーの192.0.2.0/24ネットワーク内のクライアント・プリンタの例を考えてみましょう。今度は、サーバーがサブネットにDHCPサービスを提供します。
  • プリンタのMACアドレス: 52:54:00:72:2f:6e
  • プリンタのIPアドレス: 192.0.2.130

    重要:

    クライアントの固定IPアドレスは、他のクライアントに分散される動的IPアドレスのプール外にある必要があります。そうでないと、アドレスの競合が発生する可能性があります。
この場合は、dhcp.confに次の宣言を入力します。
host printer.example.com {
	hardware ethernet 52:54:00:72:2f:6e;
	fixed-address 192.0.2.130; 
}

システムは、host宣言における名前ではなく、ハードウェア・イーサネット・アドレスによって特定されます。したがって、ホスト名は変わる可能性がありますが、クライアントはそのイーサネット・アドレスを介して継続的にサービスを提供されます。

IPv6ネットワーク環境では、dhcpd6.confファイル内のhost宣言は次の例のようになります。

host server.example.com {
	hardware ethernet 52:54:00:72:2f:6e;
	fixed-address6 2001:db8:0:1::200;
}

グループ宣言

group宣言を定義して、同じパラメータを同時に複数の共有ネットワーク、サブネットおよびホストに適用します。

次の例を考えてみましょう。
  • DHCPサーバーは、サブネット192.0.2.0/24に属しており、そのサブネットにサービスを提供します。
  • 1つのクライアントに固定アドレスが必要となり、残りのクライアントにはそのサーバーからの動的IPアドレスが使用されます。
  • すべてのクライアントで、同じDNSサーバーが使用されます。

この場合は、dhcp.confに次の宣言を入力します。


group {
  option domain-name-servers 192.0.2.1;

  host server1.example.com {
    hardware ethernet 52:54:00:72:2f:6e;
    fixed-address 192.0.2.130;
  }

  subnet 192.0.2.0 netmask 255.255.255.0 {
  range 192.0.2.10 192.0.2.100;
  option routers 192.0.2.1;
  option broadcast-address 192.0.2.255;
  max-lease-time 86400;
  }
}

IPv6ネットワーク環境では、dhcpd6.confファイル内のgroup宣言は次の例のようになります。

group {
  option dhcp6.domain-search "example.com";

  host server1.example.com {
    hardware ethernet 52:54:00:72:2f:6e;
    fixed-address 2001:db8:0:1::200;
  }

  host server2.example.com {
    hardware ethernet 52:54:00:1b:f3:cf;
    fixed-address 2001:db8:0:1::ba3;
  }
}

subnet6 2001:db8:0:1::/64 {
  range6 2001:db8:0:1::20 2001:db8:0:1::100;
  option dhcp6.name-servers 2001:db8:0:1::1;
  max-lease-time 172800;
}

DHCPサービスのアクティブ化

すべてのDHCPサービスは、サーバーの/etc/DHCP/dhcpd.confファイル内または/etc/DHCP/dhcpd6.confファイル内で定義されます。サービスを構成してからその構成済サービスをアクティブ化するには、次の手順に従います。

  • IPv4ネットワークの場合:
    1. /etc/dhcp/dhcpd.confファイルを開きます。
    2. そのファイルにパラメータと宣言を追加します。

      指針として、「DHCP宣言について」、または/usr/share/doc/DHCP-server/dhcpd.conf.exampleテンプレート内のコメントとノートを参照してください。

    3. オプションで、サーバーの再起動時に自動的に起動されるように、dhcpdサービスを設定します。
      sudo systemctl enable dhcpd
    4. dhcpdサービスを起動または再起動します。
      sudo systemctl start dhcpd
  • IPv6ネットワークの場合:
    1. /etc/dhcp/dhcpd6.confファイルを開きます。
    2. そのファイルにパラメータと宣言を追加します。

      指針として、「DHCP宣言について」、または/usr/share/doc/dhcp-server/dhcpd6.conf.exampleテンプレート内のコメントとノートを参照してください。

    3. オプションで、サーバーが再起動された場合に自動的に起動されるように、dhcpd6サービスを設定します。
      sudo systemctl enable dhcpd6
    4. dhcpdサービスを起動または再起動します。
      sudo systemctl start dhcpd6

破損したリース・データベースからのリカバリ

dhcpdサービスにより、次のフラットファイル・データベース内の、IPアドレス、MACアドレス、リース有効期限などのリース情報をメンテナンスします。
  • DHCPv4の場合: /var/lib/dhcpd/dhcpd.leases
  • DHCPv6の場合: /var/lib/dhcpd/dhcpd6.leases
古いデータによってリース・データベース・ファイルが大きくなりすぎないように、dhcpdサービスによって、次のメカニズムでそれらのファイルが定期的に再生成されます。
  1. このサービスでは、次のように、既存のリース・ファイルの名前が変更されます。
    • /var/lib/dhcpd/dhcpd.leasesという名前が/var/lib/dhcpd/dhcpd.leases~に変更されます
    • /var/lib/dhcpd/dhcpd6.leasesという名前が/var/lib/dhcpd/dhcpd6.leases~に変更されます
  2. このサービスにより、新しいdhcpd.leasesファイルおよびdhcpd6.leasesファイルが再作成されます。

リース・データベース・ファイルが破損した場合は、そのリース・データベースを、そのデータベースの最新の既知のバックアップからリストアする必要があります。

通常、リース・データベースの最新のバックアップはfilename.leases~ファイルです。

注意:

バックアップ・インスタンスは、特定の時点で取得されたスナップショットであるため、システムの最新の状態が反映されていない場合があります。
必要な管理権限があることを確認し、次の手順を実行します。
  • DHCPv4の場合
    1. 次のように、dhcpdサービスを停止します。

      sudo systemctl stop dhcpd
    2. 次のように、破損したリース・データベースの名前を変更します。

      sudo mv /var/lib/dhcpd/dhcpd.leases /var/lib/dhcpd/dhcpd.leases.corrupt
    3. そのリース・データベースを、それに対応するfilename.leases~バックアップ・ファイルからリストアします。

      sudo cp -p /var/lib/dhcpd/dhcpd.leases~ /var/lib/dhcpd/dhcpd.leases
    4. 次のように、dhcpdサービスを開始します。

      sudo systemctl start dhcpd
  • DHCPv6の場合
    1. 次のように、dhcpdサービスを停止します。

      sudo systemctl stop dhcpd6
    2. 次のように、破損したリース・データベースの名前を変更します。

      sudo mv /var/lib/dhcpd/dhcpd6.leases /var/lib/dhcpd/dhcpd6.leases.corrupt
    3. そのリース・データベースを、それに対応するfilename.leases~バックアップ・ファイルからリストアします。

      sudo cp -p /var/lib/dhcpd/dhcpd6.leases~ /var/lib/dhcpd/dhcpd6.leases
    4. 次のように、dhcpd6サービスを開始します。

      sudo systemctl start dhcpd6