FreeBSDでDHCPv6サーバ

IPv6のネットワークはIPv4に比べると難しい。正直いろいろワケワカラン。
DHCPv6によるアドレス固定やセキュリティについて紹介されているページをあまり見かけないのでちょっとだけやってみた。

先ず、IPv6で馴染めないのは1つのホストがIPアドレスを複数持つこと。特に一時用アドレスは匿名性が高くなるという利点はあるものの当然ながら使い捨てで変わりまくるので管理者にとってはまことにウザい。
IPv6的にスマートな解決方法があるのかもしれないのだけれど、そういうのを知らないので泥臭く対応する。
で、そのためにDHCPv6サーバを用意することにした。必須じゃなくて個人的な趣味でそうしたいだけ。

この記事では以前のFreeBSDルーターでIPoEFreeBSDルーターでDS-Liteの記事に倣い、NICはそれぞれWAN側(Flets側)のem0とLAN側のem1とする。

ルーター広告の設定変更

/etc/rtadvd.conf
1
2
3
4
5
6
em1:\     ←RA広告を行う(LAN側)ネットワークのIF名
        :raflags="mo":\
        :addr="fdc1:xxxx:xxxx:xxxx::":prefixlen#64:\
        :pinfoflags="l":\
        :rdnss="fdc1:xxxx:xxxx:xxxx::1":\
        :dnssl="local.net6":

既にRAが動いているとしたらステートレスな自動設定でIPv6アドレスが割り当てられている筈。
DHCPv6サーバを動かすにあたり変更するのはraflags (とpinfoflags)。
DHCPv6などのステートフルなプロトコルでIPv6アドレスを割り当てるのでManagedフラグ "m"を立てる。アドレス以外の情報もステートフルなプロトコルで割り当てるのでOtherフラグ "o"を立てる。2つ並べて"mo"を指定。

pinfoflagsは"l"が on-linkフラグ、"a"が自動アドレス設定フラグ。初期値は両フラグが立った"la"。 上の例のようにaフラグを下げる("l"指定)とアドレス割当てをDHCPv6だけに強制だが、それはそれで弊害あるのでpinfoflagsは指定しない("la"指定と同等)方が良いかも。

DHCPv6サーバのインストール

既にIPv4用にISC DHCPサーバをインストールしているならそれを使う。
無ければ以下。

# cd /usr/ports/net/isc-dhcp43-server
# make install clean
または
# pkg install net/isc-dhcp43-server

portsではビルド時のコンフィグメニューでIPv6を有効にする(無効にしない)こと。

DHCPv6サーバ設定

ネットワーク fdc1:xxxx:xxxx:xxxx::/64
DHCPサーバ兼DNSサーバ兼ルーターとして、IPアドレスはfdc1:xxxx:xxxx:xxxx::1とする。
リースするアドレスの範囲はfdc1:xxxx:xxxx:xxxx::8000:0〜fdc1:xxxx:xxxx:xxxx::ffff:ffffとする。

/usr/local/etc/dhcpd6.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
authoritative;
default-lease-time 86400;  #単位は秒 以下3行 最初は小さめに取る方が良いかも
preferred-lifetime 43200;
max-lease-time     86400;

option dhcp6.name-servers fdc1:xxxx:xxxx:xxxx::1;  #DNSサーバ (同居)
option dhcp6.domain-search "local.net6";
option dhcp6.info-refresh-time 3600;  #DHCPクライアント側の情報更新間隔

dhcpv6-lease-file-name "/var/db/dhcpd6.leases";

subnet6 fdc1:xxxx:xxxx:xxxx::/64 {
    #配るアドレスの範囲 最小と最大 を指定
    range6 fdc1:xxxx:xxxx:xxxx::8000:0 fdc1:xxxx:xxxx:xxxx::ffff:ffff;
}

# DUIDで識別してアドレス付与
host hoge {
    host-identifier option dhcp6.client-id yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy:yy;
    fixed-address6 fdc1:xxxx:xxxx:xxxx::1111;  #与えるIPv6アドレス
}

# MACアドレスで識別してアドレス付与
host hage {
    hardware ethernet zz:zz:zz:zz:zz:zz;
    fixed-address6 fdc1:xxxx:xxxx:xxxx::2222;
}

ホストの識別にはMACアドレスでもDUIDでもどちらでもいけるっぽい。本来はMACアドレスではなくDUIDを使う筈だが、DUIDは正直面倒の元なのでMACアドレスの方が簡単。っていうかDUIDの仕様決めた奴絶対おかしい。使うの困る。
3種(4種)のDUIDの内、一番わかりやすいDUID-LLは 00:03:00:01: ➕ MACアドレス

DHCPv6サーバの起動

/etc/rc.conf (追記)
1
2
dhcpd6_enable="YES"
dhcpd6_ifaces="em1" #←LAN側のIF
# service isc-dhcpd6 start
または
# /usr/local/etc/rc.d/isc-dhcpd6 start

確認

サーバ側の設定を試行錯誤するにあたり、リース期間が残っているとクライアント側でIPアドレス等が反映しないかも。そこで強制的に再取得させる。

Windowsなら (管理者権限のコマンドプロンプトで)
C:\Windows\system32> ipconfig /release     #開放
C:\Windows\system32> ipconfig /renew       #再取得
C:\Windows\system32> ipconfig /all         #情報表示
Linuxなら
# dhclient -6 -r eth0             #開放 (eth0のIPv6だけ)
# dhclient -6 eth0                #再取得 (eth0のIPv6だけ)

Linuxはネットワークの情報確認でよく使うifconfig hogeやip addrではDHCPクライアントとしての情報が判り難いので以下。

# dhclient -6 -cf /etc/dhcp/dhclient.conf eth0 -v
Internet Systems Consortium DHCP Client 4.3.3
Copyright 2004-2015 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on Socket/eth0
Sending on   Socket/eth0
Created duid \xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx\xxx.
PRC: Soliciting for leases (INIT).
XMT: Forming Solicit, 0 ms elapsed.
XMT:  X-- IA_NA xx:xx:xx:xx
XMT:  | X-- Request renew in  +3600
XMT:  | X-- Request rebind in +5400
XMT: Solicit on eth0, interval 1090ms.
RCV: Advertise message on eth0 from fe80::xxxx:xxxx:xxxx:xxxx.
RCV:  X-- IA_NA xx:xx:xx:xx
RCV:  | X-- starts 1515042578
RCV:  | X-- t1 - renew  +0
RCV:  | X-- t2 - rebind +0
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fdc1:xxxx:xxxx::1111
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
RCV:  Advertisement recorded.
PRC: Selecting best advertised lease.
PRC: Considering best lease.
PRC:  X-- Initial candidate xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx (s: 155, p: 0).
XMT: Forming Request, 0 ms elapsed.
XMT:  X-- IA_NA xx:xx:xx:xx
XMT:  | X-- Requested renew  +3600
XMT:  | X-- Requested rebind +5400
XMT:  | | X-- IAADDR fdc1:xxxx:xxxx::1111
XMT:  | | | X-- Preferred lifetime +7200
XMT:  | | | X-- Max lifetime +7500
XMT:  V IA_NA appended.
XMT: Request on eth0, interval 1070ms.
RCV: Reply message on eth0 from fe80::xxxx:xxxx:xxxx:xxxx.
RCV:  X-- IA_NA xx:xx:xx:xx
RCV:  | X-- starts 1515042579
RCV:  | X-- t1 - renew  +0
RCV:  | X-- t2 - rebind +0
RCV:  | X-- [Options]
RCV:  | | X-- IAADDR fdc1:xxxx:xxxx::1111
RCV:  | | | X-- Preferred lifetime 604800.
RCV:  | | | X-- Max lifetime 2592000.
RCV:  X-- Server ID: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
PRC: Bound to lease xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Checking DAD results for fdc1:xxxx:xxxx::1111

表示される情報量は多かったり少なかったり。

次はフィルタリングをやる予定。

関連記事: