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でシェアする

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

ぷららプライベートホームページのcgiサーバ廃止連絡

2022-05-10 11:00:00 | 
「ぷらら」からプライベートホームページで利用できる「cgiサーバ」の廃止連絡が来た。

「php」「perl」などのスクリプト実行が出来便利だったのだが。
代替機能も無い。
自前のIPv6サーバー(nginx+PHP7@DS-216J)で対応することにした。

稼働中のcgi
ipv4ipv6js.php
<?php
header("Content-type: application/x-javascript");
$ip_address = $_SERVER['REMOTE_ADDR'] ;
$count_colon = substr_count( $ip_address, ':' );
$count_dot = substr_count( $ip_address, '.' );
if ( $count_colon > 0 && $count_dot == 0 ) {
	$ip_kind = 'IPv6' ;
} elseif ( $count_colon == 0 && $count_dot > 0 ) {
	$ip_kind = 'IPv4' ;
}
echo "var ipKind = '". $ip_kind . "';";
echo "var ipAddress = '". $ip_address . "';";
?>



 

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

ヤマハ NVR510/500 Recursive DNS設定用メモ

2022-05-09 11:00:00 | NVR510
ヤマハ NVR500の「簡単設定ページ」、NVR510の「簡単設定」共に便利なのだが、細かな設定はコマンド設定になる。しかし、簡単設定操作でコマンド設定内容が変化してしまう事がある(「NVR-500のかんたん設定とリカーシブDNS」「NVR-500 Rev11.00.20のリカーシブDNS」)。
DNS関連のコマンド機能についてもよく忘れる。メモを残しておく事にする。

DNSのコマンド詳細はコマンドリファレンス(NVR510 NVR500)が詳しい。

(1)NVR510/NVR500の差異
NVR510 Rev.15.01.21
NVR500 Rev.11.00.41
・「AAAAレコード」の問い合わせ制限
・「edns」対応
・「DHCPv6」でDNS サーバーの通知順序設定対応
・「NAT46/DNS46」対応
・nslookupのIPv6対応

(2)DNS機能設定
dns host any :DNSを利用できるホストの制限
dns syslog resolve off
dns domain familyname : ルーター上で「DNS search domain list
dns service aaaa filter off :「AAAAフィルタとはなんだったのか?
dns service fallback off :ルータが名前解決する時IPv6を優先。「フォールバックの問題について

(3)DNSキャッシュ機能
名前解決問い合わせ時に最初に検索される。
dns cache on
dns cache max entry 256
show dns cache
clear dns cache

(4)DNS機能
特定ドメインのレコードを設定し、DNSとして機能する。
dns private name ns.familyname :
「ip host ns.familyname ipv4アドレス@lan1」
「dns static aaaa ns.familyname ipv6アドレス@lan1」と同じ
ip host
dns static

(5)DNS問合せサーバー設定
キャッシュ、DNS機能で解決しない場合に問い合わせるサーバー設定。数字は、選定されるサーバーの順番。
1. dns server select
DNSレコードタイプと問合せ指定ドメインに一致すると選定される。サーバー応答が無くても以降の問合わせを行わない。「any .」で選択されるとサーバーダウンの場合でも2以降のサーバーに変更して問合わせる事は無い。セカンドサーバーやデフォルトサーバが指定されているとこれらのサーバーに問合わせが行われる。pp指定でrestrict指定が無い場合、選択条件が一致するとpp接続し、DNS情報を得てから名前解決する。
2. dns server
3. dns server pp
4. dns server pdp
5. dns server dhcp
1の検索条件に一致しない場合、2で指定されたサーバー、3, 4, 5で取得したサーバーに順番で問合わせを行う。
1,2,3,4,5のサーバー設定がされていない時は、dhcp取得のDNSサーバーに問い合わせる(取得出来ていれば)。
1,2,3,4,5のサーバー設定がされていなくとも「dns service recursive」がデフォルトなので「ひかり電話HGW」配下のDHCPv6-PD接続や「RA with o_flag=1」+DHCPv6 InformationでDNSサーバーアドレスが取得出来ていれば名前解決ができる。
2,3,4,5の設定で取得されるDNSサーバーアドレス情報は、端末のresolverに依存するが1番目のサーバ応答が無い時、優先順位2番目位までしか使用されない。
1, 2の設定で指定するIPアドレスは、IPv4, IPv6共に記載可能で混在してても可。
2で設定されたIPv4アドレスと3,4,5で取得されたDNSサーバーアドレスは、「dns notice order」のserver情報として使用される(2でIPv6アドレスを指定してもdhcpv6のserver情報に使用されない)。

「IPv4 over IPv6」で使用されるAFTRの名前解決は、NGNから通知されるDNSサーバーで検索する必要がある。
internet multifeed
$ host gw.transix.jp 2001:4860:4860::8888 Public DNS
Using domain server:
Name: 2001:4860:4860::8888
Address: 2001:4860:4860::8888#53
Aliases: 

Host gw.transix.jp not found: 3(NXDOMAIN)

$ host gw.transix.jp 2404:1a8:7f01:a::3 NGN網 DNS
Using domain server:
Name: 2404:1a8:7f01:a::3
Address: 2404:1a8:7f01:a::3#53
Aliases: 

gw.transix.jp has IPv6 address 2404:8e00::feed:102
gw.transix.jp has IPv6 address 2404:8e00::feed:100
gw.transix.jp has IPv6 address 2404:8e00::feed:101
Public DNSなどを使用する場合設定に注意が必要。
for using Public DNS service
dns server select 100 2404:1a8:7f01:a::3 2404:1a8:7f01:b::3 aaaa gw.transix.jp
dns server select 101 2001:4860:4860::8888 2001:4860:4860::8844 any .
NGN網のDNS指定にdhcpを使用せずIPv6アドレスを指定し、ひかり電話HGWのDHCPv6サーバー不具合に備える。

アルテリアネットワークス XPASSサービスのDS-Liteサーバーは、パブリックDNSで名前解決が出来るようだ。
arteria networks 
$ host dgw.xpass.jp 2001:4860:4860::8888 Public DNS
Using domain server:
Name: 2001:4860:4860::8888
Address: 2001:4860:4860::8888#53
Aliases: 

dgw.xpass.jp has IPv6 address 2001:f60:0:200::1:1

$ host dgw.xpass.jp 2404:1a8:7f01:a::3 NGN網 DNS
Using domain server:
Name: 2404:1a8:7f01:a::3
Address: 2404:1a8:7f01:a::3#53
Aliases: 

dgw.xpass.jp has IPv6 address 2001:f60:0:200::1:1
transixからxpassのDS-Lite AFTRへは疎通出来ない。

(6)DNS問合せ時の設定
dns private address spoof off
dns srcport 10000-10999

(7)DNSサーバー通知順序の設定
dns notice order dhcp me server
dns notice order msext me server
dns notice order dhcpv6 me
NVR500は、dhcpv6設定が無い。「dhcpv6 me」と同じ動作。
NVR510は、server指定でDHCPv6-PDやDHCPv6 Informationで得たサーバーアドレス


 

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

ヤマハ NVR510/500 LUA rt.mail() apiとぷららメールサーバー

2022-05-06 10:00:00 | NVR510
ヤマハ NVR510/500 Transix DS-Lite(IPv4 over IPv6)とIPv4 PPPoEとの自動切替」でrt.mail(LUA api)の挙動がおかしいのを感じていた。
ぷららのメールサーバーは、ぷらら網経由のsmtp(25), インターネット経由のサブミッションポートsmtp(587)共にstartTLS対応に加え、smtps(465)もサポートしている。ただ、インターネット経由のsmtp(587)やsmtps(465)は、「スパム対策」と称する接続制限が施されている。
ぷらら Transix DS-Lite経由のメールアクセス エラーは、「スパムメール対策のブロック!」???
ぷらら Transix DS-Lite経由のメールアクセス IP blocking解消
確か、Transix DS-Liteがシステム拡張でIPv4アドレスを増強した時「ヨーロッパ割り当てのIPv4アドレス」を使用した事により、ぷららのメールサーバーに接続出来なくなったと推定している。再び同様の事が発生したかと
「ぷらら」メールサーバをopenssl s_clientで確認する-WiresharkでstartTLSも確認した
で確認したが、問題なかった。NVR510とNVR500でrt.mail()のいくつかのパラメータを変更して確認してみた。

(1)NVR510/NVR500のrt.mail()とぷららメールサーバー接続結果

NVR510(Rev.15.01.21) / NVR500(Rev.11.00.41)

(2)テストLUAスクリプト
plalamailtest.lua
--[[ May.5 '2022 Rabbit51 plalamailtest.lua ]]
mail_table = {
    timeout = 10,
	smtp_address = "secure.plala.or.jp",
	smtps = true,
	smtp_port = 587,
	smtp_auth_name = "someone@somewhere.plala.or.jp",
	smtp_auth_password = "FUSHIGINAKOTOBA",
	smtp_auth_protocol = "cram-md5",
	from = "someone@somewhere.plala.or.jp",
	to = "someone@somewhere.plala.or.jp",
	subject = "NVR510/NVR500 rt.mail() testing"
}
-- smtp w/ ssl on port 465 
mail_table.smtp_port = 465
mail_table.smtp_auth_protocol = "cram-md5"
mail_table.subject = "1 smtp w/ ssl port 465"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
--
mail_table.smtp_auth_protocol = "digest-md5"
mail_table.subject = "2 smtp w/ ssl port 465"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
--
mail_table.smtp_auth_protocol = "plain"
mail_table.subject = "3 smtp w/ ssl port 465"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
-- smtps on port 587
mail_table.smtp_port = 587
mail_table.smtp_auth_protocol = "cram-md5"
mail_table.subject = "4 smtps port 587"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
--
mail_table.smtp_auth_protocol = "digest-md5"
mail_table.subject = "5 smtps port 587"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
--
mail_table.smtp_auth_protocol = "plain"
mail_table.subject = "6 smtps port 587"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
-- smtp on port 587
mail_table.smtps = false
mail_table.smtp_port = 587
mail_table.smtp_auth_protocol = "cram-md5"
mail_table.subject = "7 smtp port 587"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
--
mail_table.smtp_auth_protocol = "digest-md5"
mail_table.subject = "8 smtp port 587"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
--
mail_table.smtp_auth_protocol = "plain"
mail_table.subject = "9 smtp port 587"
mail_table.text = "auth protocol = " .. mail_table.smtp_auth_protocol .. string.char(13,10)
rtn,str=rt.mail(mail_table)
rt.syslog("info"," subject= " .. mail_table.subject .. " smtp_auth_protocol = " .. mail_table.smtp_auth_protocol)
if rtn == false then rt.syslog("info","rt.mail() is false") else rt.syslog("info","rt.mail() is true") end
rt.mail(LUA api)仕様には、「port 587」でstartTLSに対応しているか不明なので、「smtps=true」と「smtps=false」の二通りで確認した。「smtps」「startTLS」は、wiresharkのパケットキャプチャで確認した。

(3)確認結果
・ぷららメールサーバは、「diget-md5」に対応していない。
・NVR500のrt.mail()は、smtps(465)に対応していない。smtpsが有効でない。
・NVR510は、startTLSに対応していない。仕様記載なしの通り。

NVR510とNVR500でrt.mail()スクリプトを共通にするには、
 if string.match(_RT_FIRM_REVISION,"(NVR%d+)") == "NVR510" then
    mail_table.smtp_port=465
else
    mail_table.smtp_port=587
end



 

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