「ひかり電話 HGW PR-600MI DHCPv6-PDのReconfigureを捉えPrefix再取得を実行する」で「Reconfigureメッセージ認証と認証鍵」について調べた。結果、認証鍵が不変であることが判った。また、「ひかり電話 HGW PR-600MI DHCPv6-PDサーバーが再起動時に割り当てるPrefix」でReconfigureメッセージが発行されない場合がある事が確認された。PR-600MIからPrefix委譲を受けたDHCPv6-PDクライアントにPR-600MI以外の機器からDHCPv6 Reconfigureメッセージを送りPrefixを再取得させてみた。
![](https://blogimg.goo.ne.jp/user_image/2c/01/7b2de39f7a6e0d768e148d6e0d858a85.png)
PR-600MIのLAN側に、4台のルータが接続されている。
・NVR510
・OpenWrt(WZR-HP-G300NH)
・Debian10(XPS8300)
・NVR500
それぞれの機器は、DHCPv6-PDでPrefix委譲を受けている。
NVR500のネットワークにdebian10(VAIO VJP131B01N)クライアントを接続。ルータ機器にDHCPv6 Reconfigureメッセージを送り、PrefixのRenewを実行させる。
(1)Reconfigureメッセージ
debian10では、dhclient(ISC)から直接Reconfigureメッセージを送ることが出来ない。PR-600MIが送信するReconfigureメッセージをwiresharkでキャプチャし、RFC3315のReconfigure messageを参考にメッセージデータを作成する。作成したデータをnc(network cat)で各ルータに送信する事とした。ルータ毎にルータのクライアントID、RDM用データと認証データを生成する必要がある(赤文字部)。
クライアントのMACアドレスとサーバー(PR-600MI)のMACアドレスは、事前に取得しておく。RDMは、64ビットのNTPフォーマットの時刻データが使われている(RFC5905)。秒以下は、「0」とする。認証は、PR-600MIの認証鍵で128ビットのHMAC-MD5を生成する。
(2)Reconfigureメッセージ用の認証鍵を取得する
鍵は、Wiresharkなどで取得しておくか、dhclientのreconfigure accept応答に含まれるauthentictionをleaseファイルから取得する。設定後、Prefixのリリースと再取得を行うこれでleaseファイルにauthentication用鍵が記録される。
![](https://blogimg.goo.ne.jp/user_image/60/ad/ebfc5d95c6df9ab09a33d3bc19783857.png)
「dhcp6.unknown-11」の最後の16バイトが鍵。鍵だけを抽出する![](https://blogimg.goo.ne.jp/user_image/5e/e5/c1d35fa7bdda5b8503a75774d19fd7b4.png)
(3)Reconfigureメッセージをスクリプトで生成
RDMに設定する時刻は、NTP書式となる。NTPは、「1900年1月1日 00:00:00 UTC」が基準とした秒数。linuxやmacOSのdateコマンドは、「1970年1月1日 00:00:00 UTC」が基準となる。秒数以下は「0」とした。RDMの単位が1秒となるので1秒以内にDHCPv6メッセージを複数送るとエラーになると思われる。「Authentication option」を最後にしたが、Reconfigureメッセージに含まれるoptionの順番は、順不同で含ませても良い。ただし、認証用データは、構成順序が変わると同じデータでも値は異なる。
スクリプトで生成されたreconfigureメッセージのバイナリーデータ75バイト(113オクテット)のデータとなる。このデータをDHCPv6-PDクライアントのポート547へUDPで送信する。
(4)Reconfigureメッセージを送信
debian10のクライアントパッケージには、「nc(network cat)」がインストールされていない。aptでインストールする必要がある。IPv6対応がされた「netcat-openbsd」をインストールした。
ncでNVR500のWAN側(LAN2)インターフェースにReconfigureメッセージを送信してみた何の変化もない。NVR500のログには、「[DHCPv6] discard packet from 2409:10:XXXX:YY40:f7eb:373:d1e8:3d0b (no configuration)」。
debian10端末をPR-600MIと同じネットワークに繋ぎ直し、リンクローカルアドレス宛に送信してみた。結果、Reconfigureメッセージとして認識しRenew処理が実行された
(5)ReconfigureメッセージをDHCPv6リレーで送信
PR-600MIのLANインターフェースが接続されたネットワークにdebian10(XPS8300)が接続されdhclient(ISC)でDHCPv6 Prefix委譲を受けている。dhclientは、Reconfigureメッセージ処理機能が実装されていない。debina10でdhcrelay(ISC)を起動し、NVR500のLANネットワークに接続された端末からReconfigureメッセージをリレー送信する。(NVR510/500のDHCPにRelay機能がある。DHCPv6には、Relay機能が無い。)
「-u」のアドレスは、debian10(VAIO VJP131B01N)端末のアドレス。端末上でwiresharkを稼動するとDHCPv6リレーされたパケットを確認できる。Reconfigureメッセージは、Relay-Replyメッセージのデータとしてリレーサーバーに送信する。
Peer addressは、Reconfigureメッセージを届けるルータのリンクローカルアドレス。Link addressは、Peer addressの接続されたインターフェースのグローバルIPv6アドレス。端末にRelay-Forwardで送られてくるパケットをwiresharkでモニタしてLink addressを確認した。hopcountは、最終リレーなので「0」。Reconfigureメッセージデータは、75バイト。
スクリプトで生成されたRelay-Replyメッセージのヘッダー部バイナリーデータこのヘッダー部の後ろにReconfigureメッセージ75バイトを付加するとRelay-Replyメッセージになる。DHCPv6リレーサーバーを稼動させ、「DHCPv6-RelayReply.bin」と「DHCPv6-RECONFIGURE.bin」を連結してDHCPv6リレーサーバーにメッセージを送信する。その後リレーサーバーを停止する。「2409:10:XXXX:YY40:f7eb:373:d1e8:3d0b」は、端末のIPv6アドレス。「2409:10:XXXX:YY00::1:110」は、リレーサーバーのIPv6アドレス。リレーサーバー上のsyslogでリレーサーバーが稼動し、Reconfigureメッセージがリレーされた事を確認ReconfigureメッセージがリレーサーバーからNVR500に送信され、NVR500のRenew処理応答パケットがRelay-Forwardされた。
![](https://blogimg.goo.ne.jp/user_image/2c/01/7b2de39f7a6e0d768e148d6e0d858a85.png)
PR-600MIのLAN側に、4台のルータが接続されている。
・NVR510
・OpenWrt(WZR-HP-G300NH)
・Debian10(XPS8300)
・NVR500
それぞれの機器は、DHCPv6-PDでPrefix委譲を受けている。
NVR500のネットワークにdebian10(VAIO VJP131B01N)クライアントを接続。ルータ機器にDHCPv6 Reconfigureメッセージを送り、PrefixのRenewを実行させる。
(1)Reconfigureメッセージ
debian10では、dhclient(ISC)から直接Reconfigureメッセージを送ることが出来ない。PR-600MIが送信するReconfigureメッセージをwiresharkでキャプチャし、RFC3315のReconfigure messageを参考にメッセージデータを作成する。作成したデータをnc(network cat)で各ルータに送信する事とした。ルータ毎にルータのクライアントID、RDM用データと認証データを生成する必要がある(赤文字部)。
Reconfigure Message type(10): 0x0a
Transaction ID: 0x000000
Client ID
option(1): 0x0001
length: 0x000a
DUID: 0003000100A0DEAABBDD
Server ID
option(2): 0x0002
length: 0x000a
DUID: 0003000128E98E123457
Option Request
option(6): 0x0006
length: 0x0002
Requested code: IA-PD(25): 0x0019
Reconfigure messages
option(19): 0x0013
length: 0x0001
Reconfigure type: Renew(5): 0x05
Authentication
option(11): 0x000b
length: 0x001c
protocol(3): 0x03
algorithm(1): 0x01
RDM(0): 0x00
Replay Detection: 0x????????????????(NTP format date) 64bit
Authentication: 0x02????????????????????????????????
(2)Reconfigureメッセージ用の認証鍵を取得する
鍵は、Wiresharkなどで取得しておくか、dhclientのreconfigure accept応答に含まれるauthentictionをleaseファイルから取得する。
/etc/dhcp/dhclient.conf
option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
interface "enp3s0" {
also request dhcp6.sntp-servers, dhcp6.sip-servers-address;
also request dhcp6.vendor-opts;
also request dhcp6.reconf-msg; #Reconfigure authentication option
send dhcp6.client-id 00:03:00:01:c0:25:e9:34:51:23;
send dhcp6.vendor-class 210 6 28:e9:8e:12:34:56;
send dhcp6.reconf-accept; #Reconfigure accept option
}
dhclient -6 -r -P -pf /var/dhclient6.enp3s0.pid -lf /var/lib/dhcp/dhclient6.enp3s0.leases enp3s0
killl `cat /var/dhclient6.enp3s0.pid`
dhclient -6 -P -I -N -pf /var/dhclient6.enp3s0.pid -lf /var/lib/dhcp/dhclient6.enp3s0.leases enp3s0
![](https://blogimg.goo.ne.jp/user_image/60/ad/ebfc5d95c6df9ab09a33d3bc19783857.png)
「dhcp6.unknown-11」の最後の16バイトが鍵。鍵だけを抽出する
get-authentication-key
#!/bin/bash
PR600MIKEY=`ssh root@debian10.familyname grep dhcp6.unknown-11 /var/lib/dhclient6.enp3s0.leases | sed -e 's/^.*3:1:0:.*:1:¥([0-9a-fA-F:]*¥);$/¥1/'`
for i in $PR600MIKEY; do key=$i; done
echo ${key//:/}
![](https://blogimg.goo.ne.jp/user_image/5e/e5/c1d35fa7bdda5b8503a75774d19fd7b4.png)
(3)Reconfigureメッセージをスクリプトで生成
make-reconfigure
#!/bin/bash
PR600MI="28:E9:8E:12:34:57"
NVR510="AC:44:F2:AA:BB:CC"
NVR500="00:A0:DE:AA:BB:DD"
OpenWrt="00:1D:73:34:45:56"
XPS8300="C0:25:E9:34:51:23"
srvmac=${PR600MI//:/}
cldev=$NVR500
clmac=${cldev//:/}
PR600MIKEY="31123456789ABCDEF0123456789ABC43"
dt1900=`date --date='1900/1/1 0:0:0 UTC' +%s` #linux
dtnow=`date +%s` #linux
#dt1900=`date -j -u -f "%Y/%m/%d %H:%M:%S" "1900/1/1 00:00:00" +%s` #macOS
#dtnow=`date -j -u +%s` #macOS
dtntp=$(($dtnow-$dt1900))
#DHCPv6 Message type
echo -en "\xa\x0\x0\x0" > DHCPv6-MSG.bin
#Client ID option(1):length(10)
echo -en "\x0\x1\x0\xa\x0\x3\x0\x1" >> DHCPv6-MSG.bin
echo -n "$clmac" | xxd -r -p >> DHCPv6-MSG.bin
#Server ID option(2):length(10)
echo -en "\x0\x2\x0\xa\x0\x3\x0\x1" >> DHCPv6-MSG.bin
echo -n "$srvmac" | xxd -r -p >> DHCPv6-MSG.bin
#Option Request IA-PD(25) option(6):length(2)
echo -en "\x0\x6\x0\x2\x0\x19" >> DHCPv6-MSG.bin
#Reconfigure Messages Type: Renew(5) option(19):length(1)
echo -en "\x0\x13\x0\x1\x5" >> DHCPv6-MSG.bin
#Authentication option(11):length(28)#protocol(3):algorithm(1):RDM(0):ReplayDetection(8):key(1+16)
echo -en "\x0\xb\x0\x1c\x3\x1\x0" >> DHCPv6-MSG.bin
printf "%x%08x" $dtntp "0" | xxd -r -p >> DHCPv6-MSG.bin
#Authentication
echo -en "\x2" >> DHCPv6-MSG.bin
echo -n "00000000000000000000000000000000" | xxd -r -p > DHCPv6-0.bin
cat DHCPv6-MSG.bin DHCPv6-0.bin | openssl dgst -md5 -mac hmac -macopt hexkey:$PR600MIKEY -binary -out DHCPv6-DGST.bin
cat DHCPv6-MSG.bin DHCPv6-DGST.bin > DHCPv6-RECONFIGURE.bin
スクリプトで生成されたreconfigureメッセージのバイナリーデータ
cat DHCPv6-RECONFIGURE.bin | od -t xC
0000000 0a 00 00 00 00 01 00 0a 00 03 00 01 00 a0 de aa
0000020 bb dd 00 02 00 0a 00 03 00 01 28 e9 8e 12 34 57
0000040 00 06 00 02 00 19 00 13 00 01 05 00 0b 00 1c 03
0000060 01 00 e6 2d 76 71 00 00 00 00 02 7b 40 3e 27 42
0000100 9a fb e0 f2 2b 9a 74 01 fa 29 08
0000113
(4)Reconfigureメッセージを送信
debian10のクライアントパッケージには、「nc(network cat)」がインストールされていない。aptでインストールする必要がある。IPv6対応がされた「netcat-openbsd」をインストールした。
ncでNVR500のWAN側(LAN2)インターフェースにReconfigureメッセージを送信してみた
send reconfigure
cat DHCPv6-RECONFIGURE.bin | nc -6 -u 2409:10:XXXX:YY00:02A0:DEFF:FEAA:BBDD 547
debian10端末をPR-600MIと同じネットワークに繋ぎ直し、リンクローカルアドレス宛に送信してみた。結果、Reconfigureメッセージとして認識しRenew処理が実行された
send reconfigure to LinkLocal address
cat DHCPv6-RECONFIGURE.bin | nc -6 -u fe80::02A0:DEFF:FEAA:BBDD%enx3476c5570b8f 547
NVR500 syslog
info,user May 13 14:58:27 nvr500-lan2.familyname [DHCPv6] receive RECONFIGURE
info,user May 13 14:58:27 nvr500-lan2. familyname [DHCPv6] Renumbering start (LAN2)
debug,user May 13 14:58:28 nvr500-lan2. familyname [IPv6] prefix 2409:10:XXXX:YY40::/60 (duration: 14400) is delegated from LAN2 (DHCPv6)
info,user May 13 14:58:30 nvr500-lan2. familyname LAN1: PORT3 link down
info,user May 13 14:58:30 nvr500-lan2. familyname LAN1: PORT4 link down
info,user May 13 14:58:30 nvr500-lan2. familyname LAN1: link down
info,user May 13 14:58:30 nvr500-lan2. familyname [DHCPv6] Renumbering success (LAN2)
info,user May 13 14:58:31 nvr500-lan2. familyname LAN1: PORT3 link up (100BASE-TX Full Duplex)
info,user May 13 14:58:31 nvr500-lan2. familyname LAN1: link up
info,user May 13 14:58:31 nvr500-lan2. familyname [ONFS] Network configuration or status changed
debug,user May 13 14:58:31 nvr500-lan2. familyname [ONFS] Loaded interface configuration (count:2)
debug,user May 13 14:58:32 nvr500-lan2. familyname [IPv6] start DAD for fe80::2a0:deff:feAA:BBDC
info,user May 13 14:58:32 nvr500-lan2. familyname LAN1: PORT4 link up (1000BASE-T Full Duplex)
info,user May 13 14:58:32 nvr500-lan2. familyname [ONFS] Network configuration or status changed
debug,user May 13 14:58:33 nvr500-lan2. familyname [IPv6] complete DAD for fe80::2a0:deff:feAA:BBDC
(5)ReconfigureメッセージをDHCPv6リレーで送信
PR-600MIのLANインターフェースが接続されたネットワークにdebian10(XPS8300)が接続されdhclient(ISC)でDHCPv6 Prefix委譲を受けている。dhclientは、Reconfigureメッセージ処理機能が実装されていない。debina10でdhcrelay(ISC)を起動し、NVR500のLANネットワークに接続された端末からReconfigureメッセージをリレー送信する。(NVR510/500のDHCPにRelay機能がある。DHCPv6には、Relay機能が無い。)
dhcrelayの起動
ssh root@debian10.familyname /usr/sbin/dhcrelay -6 -l enp3s0 -u 2409:10:XXXX:YY40:f7eb:373:d1e8:3d0b%enp3s0
dhcrelayの停止
ssh root@debian10.familyname kill `cat /var/run/dhcrelay6.pid`
Relay-Replyメッセージ
Relay-Reply Message Type(13): 0x0d
hopcount: 0x00
Link address: 0x24 09 00 10 XX XX YY 00 00 00 00 00 00 01 01 10
Peer address: fe 80 00 00 00 00 00 00 02 a0 de ff fe AA BB DC
Relay Message(9):
option(9): 0x0009
length(75): 0x004b
DHCPv6 Reconfigure Message データ75バイト
mk-relayreply
#!/bin/bash
NVR510="AC:44:F2:AA:BB:CC"
NVR500="00:A0:DE:AA:BB:DD"
OpenWrt="00:1D:73:34:45:56"
XPS8300="C0:25:E9:34:51:23"
cldev=$NVR500
clmac=${cldev//:/}
printf -v ladr "FE80::%02X%s:%sFF:FE%s:%s" $((16#${clmac:0:2}+2)) ${clmac:2:2} ${clmac:4:2} ${clmac:6:2} ${clmac:8:4}
linkaddress="24090010XXXXYY000000000000010110"
peeraddress=${ladr//::/:0000:0000:0000:}
peeraddress=${peeraddress//:/}
# Relay-Reply message headder
echo -en "\xd\x0" > DHCPv6-RelayReply.bin
echo -n "$linkaddress" | xxd -r -p >> DHCPv6-RelayReply.bin
echo -n "$peeraddress" | xxd -r -p >> DHCPv6-RelayReply.bin
echo -en "\x0\x9\x0\x4b" >> DHCPv6-RelayReply.bin
cat DHCPv6-RelayReply.bin | od -t xC
0000000 0d 00 24 09 00 10 XX XX YY 00 00 00 00 00 00 01
0000020 01 10 fe 80 00 00 00 00 00 00 02 a0 de ff fe aa
0000040 bb dd 00 09 00 4b
0000046
send reconfigure via DHCPv6 relay
ssh root@debian10.familyname /usr/sbin/dhcrelay -6 -l enp3s0 -u 2409:10:XXXX:YY40:f7eb:373:d1e8:3d0b%enp3s0
cat DHCPv6-RelayReply.bin DHCPv6-RECONFIGURE.bin | nc -6 -u -w 1 2409:10:XXXX:YY00::1:110 547
ssh root@debian10.familyname kill `cat /var/run/dhcrelay6.pid`
DHCPv6 Relay-Reply Reconfigure syslog
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: parse_upstream: Interface 'enp3s0' is both down and up.
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Internet Systems Consortium DHCP Relay Agent 4.4.1
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Copyright 2004-2018 Internet Systems Consortium.
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: All rights reserved.
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: For info, please visit https://www.isc.org/software/dhcp/
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Bound to *:547
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Listening on Socket/enp3s0
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Sending on Socket/enp3s0
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Relaying Reconfigure to fe80::2a0:deff:feaa:bbdd port 546 down.
info,daemon May 16 14:31:03 debian10 dhcrelay[9273]: Relaying Renew from fe80::2a0:deff:feaa:bbdd port 546 going up.