goo blog サービス終了のお知らせ 

rabbit51

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

ひかり電話 HGW PR-600MIのfirmware update to 01.00.0008

2022-06-20 22:30:00 | ひかり電話

ファームウェアの更新通知が来た。
ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合」以来、手動更新に設定している。PR-600MI最新ファームウェアからfirmwareをダウンロードして確保。

PR-600MIの「ファームウェア更新」ページの「手動アップデート」「ファームウェア更新情報」で「更新確認」を実施


「新しいファームウェアがありました。」
情報確認なのにダウンロードに書き込み?
何するつもり?

挙句に「失敗しました」。。。?


「更新確認」をあきらめ「ファームウェア更新」を実行する


すぐに「再起動中」になり


数分で「再起動完了」となる


ファームウェアバージョン「01.00.0008」となる


「01.00.0007」で確認した不具合
解決ぜずひかり電話HGW PR-600MI の「メインテナンス」「pingテスト」の表記バグ

解決ぜず
ひかり電話 HGW PR-600MI のハングアップと勝手に再起動する不具合について
ひかり電話 HGW PR-600MI のハングアップと勝手に再起動する不具合について#2
ひかり電話 HGW PR-600MIのfirmware更新とIPv6パケットフィルターの不具合
ひかり電話 HGW PR-600MI DHCPv6-PDに複数Prefixを要求してみた

 

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

ひかり電話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でシェアする

ひかり電話 HGW PR-600MI のハングアップと勝手に再起動する不具合について#2

2022-05-11 13:00:00 | ひかり電話
ひかり電話 HGW PR-600MI のハングアップと勝手に再起動する不具合について」メモした。「ひかり電話 HGW PR-600MI DHCPv6-PDに複数Prefixを要求してみた」を行うと、不具合が発生しやすい。PR-600MIの不具合が発生すると、DHCPv6サーバー機能が停止する。IPv6セキュリティログの記録が停止する。その他の機能がどうなるか確認してみた。


(1)PR-600MIの詳細な状態
PR-600MI(01.00.0007)
ひかり電話機能(IPv4)正常
IPv4通信(ルーティング) 正常(SIP通信で確認)
DHCPv4サーバー 正常
DNS(IPv4) 正常
ISP接続 未使用のため不明
IPv6通信(ルーティング) 正常
IPv6 RA(LAN側) 正常
DHCPv6 停止
DNS(IPv6) 正常
IPv6パケットフィルタ 正常
IPv6セキュリティログ 停止
IPv6セキュリティログ記録が停止しているためIPv6パケットフィルタとSPIが正常に機能しているかログで確認出来ない。インターネットからpingとtcpアクセスで確認した結果、設定通りに動作しているようだ。LAN側のRA+SLAAC端末は、正常に動作する。RAのパラメータ値は、DHCPv6稼動時と同じ
PR-600MI RA@LAN
o_flag=1, prf=00
Router lifetime=5400
Reachable time=30000
Retransmission timer=1000
Prefix=2409:10:XXXX:YY00::/64
Onlink=1, Autoconfig=1
Valid lifetime=14400
Preferred lifetime=12600
o_flag=1なのでRAを受けた端末は、DHCPv6のInformationメッセージでDNS等の情報を取得しようとする。DHCPv6が停止しているためDNS情報を得ることが出来ない。
Debian10などは、DHCPv6 DUIDの問題でInformationメッセージ応答を受けられない場合がある。「ひかり電話HGW PR-600MI LANに接続したDebian10のDHCPv6 Informationに応答しない」の対策が必要。Windows10, macOSなどは、DUIDにLLTを使うためInformation応答を受けられる。

DHCPv6-PDのprefix情報
DHCPv6-PD関連
T1=6300
T2=10800
Preferred lifetime=12600
Valid lifetime=14400
DHCPv6は、T1秒間隔でrenewを行う。renew応答が無いため(T2-T1)秒後にrebindを行う。応答が無いため、(Valid lifetime-T1)秒後にPrefix Delegationを無効にする。Prefix Delegationしたルータ宛のルートテーブルも削除される。「情報」「DHCPv6サーバ払い出し状況」の該当する「IPv6プレフィックス」の「リース時間」がValid lifetime。この時間を過ぎるとこのPrefixに関するルートテーブルが消失しパケット通信が適切に出来なくなる。
Prefix Delegationされていたルータは、配下のネットワークにRA(Preferred lifetime=0/Valid lifetime=0)でprefixの無効を通知する。通知を受けた端末は、端末インターフェースのValid lifetime=14400をカウントダウンしValid lifetime=0でIPv6アドレスを廃棄する。この期間、IPv6アドレスが有効なのに通信が出来ない状態となる。IPv6通信が失敗したり、IPv4通信切替えに時間がかかり反応が鈍くなる。DNSでAAAA(IPv6)名前解決を止めるかIPv4名前解決だけのDNS(ぷららIPv4 PPPoEで通知されるDNSなど)に切り替えるのが良いかも。

(2)DHCPv6-PDを受けるNVR510/500
NVR510/500は、PR-600MIのLAN側にWAN(LAN2)で接続し、DHCPv6-PDでPrefixの委譲を受けている。LAN2アドレスは、RAからSLAAC(Modified EUI-64)で設定。 委譲されたPrefixは、LAN(LAN1)側にo_flag=1でRA。LAN1アドレスは、委譲されたprefixで「::1/64」。
NVR510/500 config
ipv6 routing on
ipv6 route default gateway dhcp lan2 #NVR500簡単設定のIPv6 IPoE設定で挿入される
ipv6 route 2409:10:XXXX:YY10::/60 gateway fe80::ae44:f2ff:feAA:BBCC%2  # for NVR500
ipv6 route 2409:10:XXXX:YY20::/60 gateway fe80::21d:73ff:fe34:4556%2
ipv6 route 2409:10:XXXX:YY30::/60 gateway fe80::c225:e9ff:fe34:5123%2
ipv6 route 2409:10:XXXX:YY40::/60 gateway fe80::c225:e9ff:feAA:BBDD%2  # for NVR510
ipv6 prefix 1 dhcp-prefix@lan2::/64 #2409:10:XXXX:YY10::/64
ipv6 prefix 2 dhcp-prefix@lan2::1:0:0:0:1/64 #2409:10:XXXX:YY11::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 address auto
ipv6 lan2 dhcp service client
#名前解決用DNS設定
dns service fallback on
dns server select 500000 dhcp lan2 any .  #NVR500簡単設定のIPv6 IPoE設定で挿入される
dns server select 500001 pp 1 any . restrict pp 1  #NVR500簡単設定のIPv4 PPPoE設定で挿入される
#自ドメイン(familynameドメイン)のDNSサーバー設定
dns domain familyname
dns private address spoof on
dns private name ns.familyname
ip host nvr500.familyname 192.168.5.1
ip host nvr500-lan2.familyname 192.168.1.50
ip host nvr510.familyname 192.168.11.250
ip host nvr510-lan2.familyname 192.168.1.51
dns static aaaa nvr500.familyname 2409:10:XXXX:YY40::1
dns static aaaa nvr500-lan2.familyname 2409:10:XXXX:YY00:2a0:deff:feAA:BBDD
dns static aaaa nvr510.familyname 2409:10:XXXX:YY10::11:250
dns static aaaa nvr510-lan2.familyname 2409:10:XXXX:YY00:ae44:f2ff:feAA:BBCC
dns server select 500000, 500001は、NVR500簡単設定でIPv6 IPoEとIPv4 PPPoE設定で挿入されたコマンド(「ヤマハNVR500の簡単設定でひかり電話とぷららIPv4 PPPoEとIPv6 PPPoEの同時接続設定」)。

PR-600MIのDHCPv6サーバー機能停止時の挙動
DHCPv6 renewに応答しなくなるため、valid lifetime後に取得したprefixが無効になる。LAN1アドレスが消失する。LAN1に関連したIPv6 routeテーブル情報が消失する。DHCPv6で得たDNS情報も無効になる。LAN1のリンクローカルアドレスからpreferred lifetime=0, valid lifetime=0のRAを広告する。NVR500簡単設定のIPv6 IPoE設定で IPv6デフォルトゲートウェイがDHCPv6情報でstatic設定されている
ipv6 route default gateway dhcp lan2
このゲートウェイアドレスが消失するためIPv6通信が出来なくなる。static設定なのでroute情報が残っている。
# show ipv6 route detail
Destination                         Gateway                                       Interface        Type
default                                -                                                    LAN2(DHCP)  static
default                                 fe80::2ae9:8eff:fe12:3457         LAN2              RA
2409:10:XXXX:YY00::/64   -                                                LAN2              implicit
2409:10:XXXX:YY10::/60   fe80::ae44:f2ff:feAA:BBCC         LAN2              static
2409:10:XXXX:YY20::/60  fe80::21d:73ff:fe34:4556            LAN2              static
2409:10:XXXX:YY30::/60  fe80::c225:e9ff:fe34:5123           LAN2              static
metricを変更してdefault gatewayのpriorityをRAのpriorityより下げてくれれば、RA情報からのdefault gatewayが有効になるのだが。
no ipv6 route default gateway dhcp lan2
としてstatic設定を削除しRAのdefault gateway設定に任せる事にした。これでPR-600MIのDHCPv6が機能停止してもIPv6通信が確保される。簡単設定のIPv6 IPoE設定を変更すると書き換えられると思われる(未確認)。

DHCPv6停止によりDNSの名前解決が出来なくなった。
dns server select 500000 dhcp lan2 any . 
dns server select 500001 pp 1 any . restrict pp 1 
「dns server」の各コマンドは、「dns server select」が最初に評価され、「dns server」「dns server pp」「dns server dhcp」と続く。「dns server select」のtype/query条件にマッチするとdns応答が有っても無くても以降のdns serverによる検索が行われない。NVR500簡単設定のIPv6 IPoEで挿入された「dns server select 500000」は、すべての検索条件に一致するため、DHCPv6で得たDNSアドレスが無効になり問い合わせがタイムアウトする。結果、DNSによる名前解決が出来なくなる。「dns server select 500000」設定を削除すると「dns server select 500001」(pp 1は常時接続)が使用される。ぷららのIPv4 PPPoE接続(pp 1)で得られるDNSサーバーは、type「a」しか応答しないIPv4専用DNSとなる。PR-600MIのアドレスを直接指定して設定する事にした。「ヤマハ NVR510/NVR500 Recursive DNS設定用メモ」に確認結果を記載しておく。
dns server select 1000 2409:10:XXXX:YY00:2ae9:8eff:fe12:3457 192.168.1.1 any . 
これで、PR-600MIのDHCPv6が機能停止してもDNSに問合せする。NVR510/500からのIPv6通信がインターネットを含めて確保される。
NVR510/500配下のネットワークに接続された端末は、RAされていたGlobal prefixがvalid lifetime後に無効となりリンクローカルアドレスだけになる。この期間にDNS名前解決でIPv6アドレスが返されると端末側はIPv6アドレスが有効だがゲートウェイは、IPv6アドレスが無効状態となる。IPv4にフォールバックされないと通信に失敗する。
NVR510上でprefix@lan2が無効になったら「dns service aaaa filter on」にするのが良さそう(NVR500は、「dns server select 500001」が有効になるようにする)。prefix@lan2が無効になった事を検出するコマンドが見つからない。LUAで対応してみた。
ckIPv6Address.lua
--[[ May.3 '2022 Rabbit51
 ckIPv6Address.lua
 schedule at #id# startup * sd1:/lua/ckIPv6Address.lua ]]
mail_table = {
	smtp_address = "secure.plala.or.jp",
	smtps = true,
	smtp_port = 465,
	smtp_auth_name = "someone@somewhere.plala.or.jp",
	smtp_auth_password = "MAIL-ACCESS-JYUMON",
	smtp_auth_protocol = "cram-md5",
	from = "someone@somewhere.plala.or.jp",
	to = "someone@somewhere.plala.or.jp",
	subject = "PR-600MI DHCPv6-PD down"
}
dnscmd = "dns service aaaa filter on"
if string.match(_RT_FIRM_REVISION,"(NVR%d+)") == "NVR500" then
    mail_table.smtp_port = 587
    dnscmd = "dns server select 100 pp 1 any ."
end
adrflag = true
while true do
rtn,str = rt.command("show ipv6 address lan1")
    if rtn ~= nil then
        adr = string.match(str, "global%s+([0-9a-zA-Z:/]+)")
        if adr == nil then
            if adrflag == true then
                rtn,str = rt.command(dnscmd)
                rt.command("clear dns cache")
                rt.syslog("info","PR-600MI DHCPv6-PD is down. switching to IPv4 DNS")
                mail_table.subject = "PR-600MI-PD DHCPv6-PD down"
                mail_table.text = "switching to IPv4 DNS"
                rt.mail(mail_table)
                adrflag = false
            end
        else
            if adrflag == false then
                rtn,str = rt.command("no " .. dnscmd)
                rt.syslog("info","PR-600MI DHCPv6-PD is up. switching to IPv6/IPv4 DNS")
                mail_table.subject = "PR-600MI-PD DHCPv6-PD up"
                mail_table.text = "switching to IPv6/IPv4 DNS"
                rt.mail(mail_table)
                adrflag = true
            end
        end
    end
    rt.sleep(60)
end
1分毎にLAN1のIPv6 Globalアドレスを確認し、消失したらDNSの設定変更を行う。同時にメールで通知する。IPv4だけ応答するDNSに切り替えたときは、DNSのキャッシュを削除する。ぷららのメールサーバーは、smtp w/ SSL(ポート465)に対応しているがrt.mail()と相性が良くないのか接続できない。startTLS(ポート587)は、rt.mail()が対応していないのでsmtps=trueの効果が無い。「ヤマハ NVR510/500 LUA rt.mail() apiとぷららメールサーバー」で詳細を確認した。結果、NVR500でsmtpsが未サポートだった。
LAN1のIPv6 Globalアドレスが復活するとDNS設定を元に戻し、メールで通知する。

(3)運用結果
概ね上手く動作している。NVR510/500のIPv6アドレスが消失した時、接続中のブラウザ更新などで若干の遅れが見られた。
PR-600MIのDHCPv6復帰には、再起動が必要となる。電話や回線使用の無い時にタイミングを観て再起動が可能となった。



 

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

ひかり電話 HGW PR-600MI DHCPv6-PDに複数Prefixを要求してみた

2022-05-02 15:00:00 | ひかり電話
PR-600MIのDHCPv6仕様は、「次世代ネットワークインタフェース資料 (IP通信網) ― ユーザ・網インタフェース(UNI)― 本編 第1.0版 (2007年10月25日)」の付属資料B DHCP プロトコル (B.2 DHCPv6 プロトコル)に準拠していると考えられる。
DHCPv6のオプションIA_PD(25)とIA_PD Prefix(26)は、RFC3633に準拠していそうだ。RFC3633によれば、DHCPv6 メッセージには、複数のIA_PDを含められ、IA_PDには複数のIA_PD Prefixの包含が許されている。一つのDUIDで複数のPrefix委譲が許される事になる。UNIの仕様なのでPR-600MI HGWのLAN側DHCPv6に当てはまるか確かめる事にした。

複数のクライアントIDを使用してクライアントID分のprefix取得は、「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」で確認した。ISC dhclientは、一つのクライアントIDで複数のprefixを要求する事ができる。
マニュアルによれば、複数のprefixを要求する場合、要求する数だけ「-P」オプションを指定する。

(1)複数prefixテストスクリプト
引数にget, getm2, getm4を指定することで「-P」「-P -P」「-P -P -P -P」のprefix要求を実行する。rel, relm2, relm4でreleaseして終了を実行する。
dhclient6mpd.sh
#!/bin/sh
PTH="/root/"
IF="enx3476c5570b8f"
## -P DHCPv6-PD request; ## -r for release; ## -x for NOT release
## Multiple Prefix Delegation request
get_DHCPv6_MPD4 () {
    /sbin/dhclient -6 -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
    /sbin/dhclient -6 -x -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
rel_DHCPv6_MPD4 () {
    /sbin/dhclient -6 -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
    /sbin/dhclient -6 -r -P -P -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
get_DHCPv6_MPD2 () {
    /sbin/dhclient -6 -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
    /sbin/dhclient -6 -x -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
rel_DHCPv6_MPD2 () {
    /sbin/dhclient -6 -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
    /sbin/dhclient -6 -r -P -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
get_DHCPv6_PD () {
    /sbin/dhclient -6 -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
    /sbin/dhclient -6 -x -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
rel_DHCPv6_PD () {
    /sbin/dhclient -6 -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
    /sbin/dhclient -6 -r -P -cf "$PTH$1.conf" -pf "$PTH$1.pid" -lf "$PTH$1.$IF.leases" $IF
}
## 
DEVL="vaio1mpd"
case "$1" in
    "getm4")
         for i in $DEVL; do get_DHCPv6_MPD4 $i; done
    ;;
    "relm4")
         for i in $DEVL; do rel_DHCPv6_MPD4 $i; done
    ;;
    "getm2")
         for i in $DEVL; do get_DHCPv6_MPD2 $i; done
    ;;
    "relm2")
         for i in $DEVL; do rel_DHCPv6_MPD2 $i; done
    ;;
    "get")
         for i in $DEVL; do get_DHCPv6_PD $i; done
    ;;
    "rel")
         for i in $DEVL; do rel_DHCPv6_PD $i; done
    ;;
    *)
    echo "$0 getm4/relm4/getm2/relm2/get/rel";;
esac
clientIDは、LLタイプで指定。
vaio1mpd.conf
interface "enx3476c5570b8f" {
	also request dhcp6.sntp-servers, dhcp6.sip-servers-addresses;
	send dhcp6.client-id 00:03:00:01:34:76:c5:57:0b:8f; #vaio LL
}


(2)実行結果
dhclient6mpd.sh getm2
solicit

IA_PDを2個メッセージで送出。IAIDは、「c5570b8f」「c5570b90」を指定。

advertise

IA_PDを1個返答。IAID「c5570b8f」でIA_PDに内包設定されたIA_PD Prefixは、「2409:10:XXXX:YY50::/60」。

request

IAID「c5570b8f」IA_PD Prefix「2409:10:XXXX:YY50::/60」とIAID「c5570b90」のIA_PDをもう一個欲しいと要求。

reply

IAID「c5570b8f」IA_PD Prefix「2409:10:XXXX:YY50::/60」とIAID「c5570b90」IA_PD Prefix「2409:10:XXXX:YY50::/60」を使えると応答してきた。同じprefixで1個目のpreferred lifetime=12600/valid lifetime=14400、2個目のpreferred lifetime=14400/valid lifetime=14400。RFC3633によればlifetimeは有効だが。PR-600MI大丈夫か?
「dhclient6mpd.sh relm2」を実行すると1個目のIAID「c5570b8f」は、リリースされる。2個目のIAID「c5570b90」は、「No Binding(3)」となる。PR-600MIは、IAID「c5570b8f」だけ委譲している状態。dhclientは、IAID「c5570b8f」とIAID「c5570b90」が委譲されている状態。リリース後、dhclient側でIAID「c5570b90」が委譲されている状態になる。

(3)その他
複数のIA_PDを含むDHCPv6メッセージを送ると棄却されず応答がある。PDの取得とリリースを繰り返すと高い確率で下記不具合が発生する
・DHCPv6の機能が停止する(応答がなくなる)
・「セキュリティログ(IPv6)」記録が止まり「0 entries」になる
・その他の機能は、動作している(不具合を認識できない)
・valid lifetime後にprefixが無効になり、prefix委譲されたネットワークでIPv6通信ができなくなる


 

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

ひかり電話HGW PR-600MI LANに接続したDebian10のDHCPv6 Informationに応答しない

2022-04-25 11:00:00 | ひかり電話

ひかり電話 HGW PR-600MI(Ver: 01.00.0007)のLANにDebian10 GNOME(4.19.255-1)[VAIO VJP131B01N]を接続使用している。


IPv4は、DHCPでIPアドレスなどネットワーク情報を取得し設定する。IPv6は、RA(Router Advertise)からPrefixを得てSLAACでアドレスを設定する。RAのO_Flagを認識し、DHCPv6のInformationメッセージでDNSやDomain search listの取得を試みる。
PR-600MIは、DHCPv6のInformationに応答しない。パケットキャプチャするとClient IDがTYPE4でrequestしている。「ひかり電話 HGW PR-600MI のDHCPv6-PDサーバーが割当てるPrefixを制御する」に記載した通りPR-600MIのDHCPv6で求められるDUIDは、「LL=Link-Layre address」が指定されている。「LLT=Link-Layer address plus Time」も動作する。
NVR500/510は、DHCPv6のDUID Type 4に応答する。

(1)Debian10のdhclient設定を変更してみる
/etc/dhcp/dhclient.conf
send dhcp6.client-id 00:03:00:01:34:76:c5:57:0b:8f; #vaio LL
この設定では、DUIDに変化が無かった。「ps ax | grep dhclient」は、実行中のDHCPv4プロセスしか表示しない。DHCPv6のInformationプロセスは、取得またはタイムアウトするまでしか実行されない。タイミングを計り記録して観ると
ps ax | grep dhclient
20656 ?        S      0:00 /sbin/dhclient -d -q -6 -S -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/dhclient6-enx3476c5570b8f.pid -lf /var/lib/NetworkManager/dhclient6-357be8af-5062-32df-8bdb-bbc419476f71-enx3476c5570b8f.lease -cf /var/lib/NetworkManager/dhclient6-enx3476c5570b8f.conf enx3476c5570b8f
が記録される。また、プロセスが終了すると「/var/lib/NetworkManager/dhclient6-<device>.conf」の設定ファイルは削除される。NetworkManagerで設定するしか無い。

(2)NetworkManagerでDHCPv6のclient IDを変更する
NetworkManager.confの「[connection]」セクションで「ipv6.dhcp-duid」を設定する。defaultは、「lease」。「NetworkManager(8)」「NetworkManager.conf(5)」「nm-settings(5)のipv6 setting」を参考に「ipv6.dhcp-duid」設定値を決定
/etc/NetworkManager/conf.d/clientid.conf
[connection]
ipv6.dhcp-duid=ll
設定後、NetworkManagerに反映させるための作業を行う
設定反映
root@debian10-vaio:/root# ls -al /var/lib/NetworkManager/dhclient6*.lease
-rw-r--r--  1 root root  617  4月 23 07:24 dhclient6-357be8af-5062-32df-8bdb-bbc419476f71-enx3476c5570b8f.lease
root@debian10-vaio:/root# rm /var/lib/NetworkManager/dhclient6-357be8af-5062-32df-8bdb-bbc419476f71-enx3476c5570b8f.lease
root@debian10-vaio:/root# systemctl restart NetworkManager.service
dhclient6-*-enx3476c5570b8f.leaseにDUIDが記録されているためファイルを削除してからNetworkManagerに反映させる。

(3)DHCPv6のclient IDをLLに変更後
/etc/resolv.conf
---- before ----
root@debian10-vaio:/root# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 192.168.1.1

---- after ----
root@debian10-vaio:/root# cat /etc/resolv.conf
# Generated by NetworkManager
search flets-east.jp iptvf.jp
nameserver 192.168.1.1
nameserver 2409:10:XXXX:YY00:2ae9:8eff:fe12:3457

(4)デフォルト・ルート
PR-600MIは、「詳細設定」「LAN側静的ルーティング設定」でデフォルトルートが設定出来なくなり「IPv4 over IPv6」「DS-Lite」へのルート設定が出来ない。
IPv4アドレスをPR-600MIのDHCPで取得すると、デフォルトゲートウェイがPR-600MIとなりインターネットアクセスが出来ない(IPv4 PPPoE接続設定をしていないため)。RAとDHCPv6によるIPv6ネットワーク設定でデフォルトルートは、PR-600MI宛にリンクローカルアドレスで設定される。IPv6パケットは、transixを経由してインターネットアクセスが出来る。
Debian10のGNOME版NetworkManagerのIPv4メソッドが自動(DHCP)の時、デフォルトルートを追加設定する方法が見出せない。
「ルート」設定で「0.0.0.0/0」の経路を設定出来ない。
コマンドで「ip -4 route add 0.0.0.0/0 metric 1 via 192.168.1.51 dev enx3476c5570b8f」を投入すると良いが、ネットワーク接続が切れると経路が消失する。

 

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