rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

ひかり電話HGW PR-600MI のDHCPv6-PDに代わりISC dhcrelayでReconfigureメッセージを送信する

2022-05-21 11:00:00 | ひかり電話
ひかり電話 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を再取得させてみた。

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????????????????????????????????
クライアントのMACアドレスとサーバー(PR-600MI)のMACアドレスは、事前に取得しておく。RDMは、64ビットのNTPフォーマットの時刻データが使われている(RFC5905)。秒以下は、「0」とする。認証は、PR-600MIの認証鍵で128ビットのHMAC-MD5を生成する。

(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
}
設定後、Prefixのリリースと再取得を行う
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
これでleaseファイルにauthentication用鍵が記録される。

「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//:/}


(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
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メッセージのバイナリーデータ
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
75バイト(113オクテット)のデータとなる。このデータをDHCPv6-PDクライアントのポート547へUDPで送信する。

(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
何の変化もない。NVR500のログには、「[DHCPv6] discard packet from 2409:10:XXXX:YY40:f7eb:373:d1e8:3d0b (no configuration)」。
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
「-u」のアドレスは、debian10(VAIO VJP131B01N)端末のアドレス。端末上でwiresharkを稼動するとDHCPv6リレーされたパケットを確認できる。
dhcrelayの停止
ssh root@debian10.familyname kill `cat /var/run/dhcrelay6.pid`
Reconfigureメッセージは、Relay-Replyメッセージのデータとしてリレーサーバーに送信する。
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バイト
Peer addressは、Reconfigureメッセージを届けるルータのリンクローカルアドレス。Link addressは、Peer addressの接続されたインターフェースのグローバルIPv6アドレス。端末にRelay-Forwardで送られてくるパケットをwiresharkでモニタしてLink addressを確認した。hopcountは、最終リレーなので「0」。Reconfigureメッセージデータは、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
スクリプトで生成されたRelay-Replyメッセージのヘッダー部バイナリーデータ
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
このヘッダー部の後ろにReconfigureメッセージ75バイトを付加するとRelay-Replyメッセージになる。DHCPv6リレーサーバーを稼動させ、「DHCPv6-RelayReply.bin」と「DHCPv6-RECONFIGURE.bin」を連結してDHCPv6リレーサーバーにメッセージを送信する。その後リレーサーバーを停止する。
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`
「2409:10:XXXX:YY40:f7eb:373:d1e8:3d0b」は、端末のIPv6アドレス。「2409:10:XXXX:YY00::1:110」は、リレーサーバーのIPv6アドレス。リレーサーバー上のsyslogでリレーサーバーが稼動し、Reconfigureメッセージがリレーされた事を確認
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.
ReconfigureメッセージがリレーサーバーからNVR500に送信され、NVR500のRenew処理応答パケットがRelay-Forwardされた。


 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする