LinuxでのKea DHCPv6構築ガイド:ステートフルIPv6割り当てとPrefix Delegationの実践

Network tutorial - IT technology blog
Network tutorial - IT technology blog

なぜSLAACだけでは不十分なのか?DHCPv6が必要となるケース

約50台のクライアント端末と10台の社内サーバーで構成されるオフィス環境に初めてIPv6を導入する際、手軽さからSLAAC(Stateless Address Autoconfiguration)が最初の選択肢になりがちです。ルーターがRouter Advertisement(RA)パケットを送信するだけで、クライアントは自律的にプレフィックスを取得し、EUI-64やランダムなインターフェースIDと組み合わせてネットワーク接続を完了します。しかし、日々の運用管理フェーズに入ると様々な課題に直面します。

SLAACを3ヶ月運用してみて直面した主な課題は以下の3点です:

  • 端末の追跡が困難:WindowsやmacOSのIPv6 Privacy Extensions機能により、IPアドレスが24時間ごとに自動変更されます。ファイアウォールからセキュリティ警告が出た際、午前10時に通信を発生させた端末を特定する作業は極めて困難になります。
  • 内部サーバー用の固定IPが必要:プリンター、NAS、データベースサーバーには固定アドレスが必須です。各端末で手動で静的設定を行うのは手間がかかり、インフラ変更時の設定ミスにもつながりやすくなります。
  • サブネットの自動分割(Prefix Delegation)への要求:MikroTikルーターで構築した拠点ネットワークやProxmox仮想サーバー群に個別のネットワーク帯を割り当てる際、手動で/64ブロックを1つずつ配分するのは時間がかかり、IPの重複リスクも高まります。

定番だったisc-dhcp-serverはすでに公式開発を終了(EOL)しています。ISCが後継として開発したKea DHCPは、JSON形式の明快な設定ファイル、フックモジュール対応、REST APIによる管理、そしてステートフルIPv6(IA_NA)およびPrefix Delegation(IA_PD)の高い信頼性を備えた最適な代替ソリューションです。

Ubuntu / DebianへのKea DHCPv6 Serverのインストール

KeaはUbuntu 22.04 LTSおよびDebian 11以降の標準リポジトリで提供されています。サーバーパッケージと管理ツールをインストールするだけで導入できます:

# リポジトリの更新とKea DHCPv6のインストール
sudo apt update
sudo apt install -y kea-dhcp6-server kea-admin

# バージョンの確認
kea-dhcp6 -v

デフォルトの設定ファイルは/etc/kea/kea-dhcp6.confに配置されます。編集前にオリジナル設定のバックアップを取得しておきましょう:

sudo cp /etc/kea/kea-dhcp6.conf /etc/kea/kea-dhcp6.conf.bak

設定シナリオ:ステートフルIP&Prefix Delegation

本ガイドでは、以下のような実践的なネットワーク環境を想定します:

  • サーバー側インターフェース:eth0(静的IP:2001:db8:1000:1::1/64)
  • ISPから企業全体に割り当てられたIPv6ブロック:2001:db8:1000::/48
  • 社内クライアント向け割り当て帯(IA_NA):2001:db8:1000:1::/64(プール範囲:::100 〜 ::200)
  • Prefix Delegation用ブロック(IA_PD):2001:db8:1000:f000::/52(配下のルーター向けに256個の/60ブロックへ分割)

設定ファイル /etc/kea/kea-dhcp6.conf の作成

設定ファイルを以下のJSONテンプレートに従って編集します:

{
"Dhcp6": {
    "interfaces-config": {
        "interfaces": [ "eth0" ]
    },
    "control-socket": {
        "socket-type": "stdout"
    },
    "lease-database": {
        "type": "memfile",
        "persist": true,
        "name": "/var/lib/kea/kea-leases6.csv",
        "lfc-interval": 3600
    },
    "preferred-lifetime": 3000,
    "valid-lifetime": 7200,
    "renew-timer": 1000,
    "rebind-timer": 2000,

    "option-data": [
        {
            "name": "dns-servers",
            "data": "2001:db8:1000:1::1, 2001:4860:4860::8888"
        },
        {
            "name": "domain-search",
            "data": "itfromzero.local"
        }
    ],

    "subnet6": [
        {
            "id": 1,
            "subnet": "2001:db8:1000:1::/64",
            "interface": "eth0",
            "pools": [
                {
                    "pool": "2001:db8:1000:1::100 - 2001:db8:1000:1::200"
                }
            ],
            "pd-pools": [
                {
                    "prefix": "2001:db8:1000:f000::",
                    "prefix-len": 52,
                    "delegated-len": 60
                }
            ],
            "reservations": [
                {
                    "duid": "00:01:00:01:2c:4a:5b:6c:00:0c:29:8a:9d:11",
                    "ip-addresses": [ "2001:db8:1000:1::50" ]
                }
            ]
        }
    ]
}
}

重要パラメータの解説

  • lease-database (memfile): リース情報をメモリ上で保持し、定期的にCSVファイルへ書き出すモードです。MySQLやPostgreSQLを追加導入することなく、1,000台以下の規模であれば軽量かつ高速に動作します。
  • pools: /64サブネット内のクライアント端末へ直接割り当てる個別IPアドレス帯(IA_NA)です。
  • pd-pools: プレフィックス配布用ブロック(IA_PD)です。/52ブロックから、配下のルーター向けに/60サブネット(それぞれ16個の/64を含む)を自動的に分割・委譲します。
  • reservations: IPv4のようなMACアドレスではなく、NICのDUID(DHCP Unique Identifier)に基づいて固定IPを予約割り当てします。

重要ポイント:Router RAでのMフラグおよびOフラグの設定

IPv6クライアントは、デフォルトゲートウェイのルーターがRouter Advertisement(RA)パケット内で適切なフラグをセットしていない限り、自発的にDHCPv6リクエストを送信しません。このフラグが設定されていない場合、クライアントはSLAACを使い続けてしまいます。

RAを広報するゲートウェイ(radvd、dnsmasq、FRRoutingなど)で以下の2つのフラグを有効化する必要があります:

  • Mフラグ(Managed Address Configuration = 1): クライアントに対してDHCPv6サーバーからIPアドレスを取得するよう要求します。
  • Oフラグ(Other Configuration = 1): DNSや検索ドメインなどの追加設定情報をDHCPv6から取得するよう要求します。

radvdを使用する場合、/etc/radvd.confに最低限以下の設定を含める必要があります:

interface eth0 {
    AdvSendAdvert on;
    AdvManagedFlag on;
    AdvOtherConfigFlag on;
    prefix 2001:db8:1000:1::/64 {
        AdvAutonomous off; # SLAACによるIP自動生成を無効化
    };
};

構文チェックとサービスの起動

設定後すぐにサービスを起動せず、Keaに組み込まれているJSON構文チェッカーで設定の整合性を検証します:

# 設定ファイルのテスト
sudo kea-dhcp6 -t /etc/kea/kea-dhcp6.conf

ターミナルに検証成功メッセージが表示されたら、Keaサービスを有効化して起動します:

sudo systemctl restart kea-dhcp6-server
sudo systemctl enable kea-dhcp6-server
sudo systemctl status kea-dhcp6-server

サービスポートの確認

DHCPv6サーバーはUDP 547ポートをリッスンし、クライアントはUDP 546からパケットを送信します。ssコマンドで待受状態を確認します:

sudo ss -u -l -n -p | grep 547
# 正常な出力例: UNCONN 0 0 *:547 *:* users:(("kea-dhcp6",pid=...,fd=...))

クライアント端末からの割り当て確認

Linuxクライアント端末で以下のコマンドを実行し、ステートフルIPv6(IA_NA)の割り当てを要求します:

# 既存のリースを解放し、新規にIA_NA要求を送信
sudo dhclient -6 -r eth0
sudo dhclient -6 -N -v eth0

拠点ルーターやサブゲートウェイとして機能する仮想マシンでは、Prefix Delegation(IA_PD)を要求するコマンドを実行します:

# Prefix Delegationの取得要求を送信
sudo dhclient -6 -P -v eth0

ログ監視とリース情報の確認

ハンドシェイク(Solicit → Advertise → Request → Reply)の流れをリアルタイムで追跡するには、systemdのライブログを確認します:

sudo journalctl -u kea-dhcp6-server -f

どのクライアントがどのIPまたはプレフィックスを保持しているかを正確に把握するには、CSVリースファイルを直接確認します:

cat /var/lib/kea/kea-leases6.csv

ファイル内の各行には、IPv6アドレス(または委譲されたプレフィックス)、DUID、リース期間、およびリースタイプ(端末用のIA_NA、配下ルーター用のIA_PD)が記録されます。これにより、IPv6インフラの運用と監視の可視性が大幅に向上し、確実なネットワーク制御が可能になります。

Share: