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

rabbit51

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

ヤマハNVR500のLUAスクリプトでDHCPv6のDomainとPrefix抽出時に不具合発生

2018-06-15 23:00:00 | NVR500
NVR500のLUAスクリプトを使い、NGNの「Domain name」と「Prefix」を取得するスクリプトを作成した
NGN Domain nameの取得
NGN Prefixの取得

ひかり電話ルータ(PR-S300SE)からのDHCPv6情報とぷららIPv6 PPPoE接続によるDHCPv6情報が同時に取得されている


この時のDHCPv6情報は、二つのインターフェースからの情報として得られる
-- show status ipv6 dhcp
DHCPv6 status

LAN1 [server]
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply

LAN2 [client]
state: established
server:
address: ::
preference: 0
prefix: 2408:210:aaaa:bb10::/60
duration: 14400
T1: 7200
T2: 12600
preferred lifetime: 14400
valid lifetime: 14400
SIP server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
DNS server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
Domain name[1]: flets-east.jp
Domain name[2]: iptvf.jp
SNTP server[1]: 2404:1a8:1102::a
SNTP server[2]: 2404:1a8:1102::b
Vender Specific Information:
Enterprise Number: 210
MAC Address: 00:a0:de:12:34:1b
Tel Number: 3
SIP Domain: ntt-east.ne.jp

PP[11] [client]
state: established
server:
address: ::
preference: 0
prefix: 2400:7800:cccc:dd00::/56
duration: 14400
T1: 7200
T2: 11520
preferred lifetime: 14400
valid lifetime: 14400
DNS server[1]: 2400:7800:0:3001::1:1
DNS server[2]: 2400:7800:0:3001::2:1
---------------------------------------------
PP11インターフェースからのDHCPv6情報に「Domain name」が存在しないが、何時追加されるかわからない。「Prefix」は、それぞれのインターフェースに設定されている。「LAN2」の「Prefix」情報を抽出するため、下記の表なLUAスクリプトで対応することにした。
---------------------------------------------
r,m=rt.command("show status ipv6 dhcp")
if r then
for lr in string.gmatch(m,"[^%c]+") do
for v in string.gmatch(lr,"([%a%d%[%]]+) %[client%]") do
if v=="LAN2" then vf=true else vf=false end
end
-- DHCPv6 prefix
if vf then
for v in string.gmatch(lr,"prefix:%s([%a%d:/]+)") do NgnPrefix=v end
for v in string.gmatch(lr,"preferred lifetime:%s(%d+)") do preferred_lifetime=v end
for v in string.gmatch(lr,"valid lifetime:%s(%d+)") do valid_lifetime=v end
end
end
else
rt.syslog("info","[LUA] arg[0] "..m)
end
---------------------------------------------

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

ヤマハNVR500のLUAスクリプトでNGN Prefixを取得しRAのために設定を行う

2018-06-14 09:00:00 | NVR500
NGNの経路情報設定」でIPv6デフォルトゲートウェイが変更されてもNGNへの経路が確保され、「NGNドメイン名からDNSサーバを選択設定」でNGNドメインの名前解決が確実に出来る環境が確保される。
NGNからはIPv6 PrefixがRAされ設定される。ひかり電話ルータ(PR-S300SE)がRAされたPrefixを受取り、16 8分割したPrefixをDHCPv6経由でNVR500配下の機器にRAする事になる。 また、インターネット接続にIPv6 PPPoEを設定(plala ipv6接続)すると接続先からIPv6 Prefixが配布される。IPoE接続との違いは、NGNからのPrefixとPPPoE接続先からのPrefixをRAし、下図のようにMulti Prefix環境となる事だ。この環境では、IPv6始点アドレスを間違えると接続できない事になる。IPoEインターネット接続やNTTからのIPv6アダプタを使う場合は、マルチPrefixにならない。ひかり電話ルータ(PR-S300SE)のIPv6 PPPoE接続がどのようになっているのか不明(利用したことが無いので)。


6年前の接続設定で「NGN経路情報の設定」「DNSによる名前解決の設定」に加えPrefixの広告(RA)方法の解決も必要だった。
NVR500でIPv6 PPPoEインターネットとフレッツ情報サイトへの同時接続
PR-S300SEとNVR500のフレッツ情報サイトIPv6常時接続方法を変更する
NVR500のrtadv sendの機能動作と制限について
NVR500のrtadv sendの機能動作と制限について(続)

NVR500の「ipv6 lan1 rtadv send 」で指定するPrefixは、同時に二つのproxyタイプのPrefixを指定できない。
NGNのIPv6は、常時接続状態。plalaのIPv6 PPPoEインターネット接続は、接続と切断ができるように考えると、NGN IPv6 Prefixは、proxyタイプでなく、DHCPv6から得たPrefixを「ipv6 prefix」コマンドで静的に設定し、plalaのIPv6 PPPoE接続時に得られるprefixをproxyタイプとして設定するのが良さそうである。
DNSサーバ選択と同様にLUAスクリプトでDHCPv6から得たNGN Prefixを「ipv6 prefix」コマンドで定期的に取得設定することとした。NGNのprefix定義は、「ipv6 prefix 10 2408:210:AAAA:BBBB::/64」。
PlalaのIPv6 PPPoE接続で得られるPrefixは、「ipv6 prefix 2 dhcp-prefix@pp2::/64」で設定される。接続後、LAN1側にRAされるよう「ipv6 lan1 rtadv 2 10 o_flag=on」とする。

LUAスクリプト


環境変数に記憶されるPrefix情報


設定されたNGNの「静的Prefix」


4時間毎にスクリプトを実行するスケデュール設定


更新チェックの記録



--- 2018/06/14 追記
LUAスクリプトの37行目で
ipv6 prefix 10 2408:210:XXXX:YYYY::/60 valid_lifetime=14400 preferred_lifetime=14400
のNVR500コマンドを生成している。この静的PrefixとIPv6 PPPoE接続のppから得たPrefix
ipv6 prefix 2 dhcp-prefix@pp2::/64

ipv6 lan1 rtadv send 2 10 o_flag=on
でRA(広告)したが、Lan1に接続された端末にIPv6アドレスが生成されない。。。。
RA(広告)するPrefixは、「2408:210:XXXX:YYYY::/64」とする必要がある。。

LUAスクリプトの37行目を
r,m=rt.command("ipv6 prefix 10 "..string.gsub(NgnPrefix,"([%a%d:]+)/%d+","%1/64").." preferred_lifetime="..preferred_lifetime.." valid_lifetime="..valid_lifetime)
に変更し、Prefixの「/60」マスクを「/64」で設定し、RA(広告)した。結果、Lan1側に接続された端末でIPv6アドレスが自動生成されるようになった。

--- 2018/06/15 追記
-- バグ?発見修正
ひかり電話ルータ(PR-S300SE)とIPv6 PPPoE接続でそれぞれDHCPv6 clientが実行される。
同時接続中にNVR500の「show status ipv6 dhcp」コマンドが実行されると両方のインターフェースのDHCP情報が出力される。
ぷららIPv6 PPPoEのDHCPv6からは、「Domain」情報が設定されていないが、「Prefix」が設定されている。LUAスクリプトで「Domain」や「Prefix」を抽出するとキーが同じため最後にマッチした「Domain」と「Prefix」の値となり、期待した情報を抽出できない。
PR-S300SEとPlala IPv6PPPoEの同時接続時に得られるDHCPv6情報は、下記の通り
---------------------------------------------
-- show status ipv6 dhcp
DHCPv6 status

LAN1 [server]
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply

LAN2 [client]
state: established
server:
address: ::
preference: 0
prefix: 2408:210:aaaa:bb10::/60
duration: 14400
T1: 7200
T2: 12600
preferred lifetime: 14400
valid lifetime: 14400
SIP server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
DNS server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
Domain name[1]: flets-east.jp
Domain name[2]: iptvf.jp
SNTP server[1]: 2404:1a8:1102::a
SNTP server[2]: 2404:1a8:1102::b
Vender Specific Information:
Enterprise Number: 210
MAC Address: 00:a0:de:12:34:1b
Tel Number: 3
SIP Domain: ntt-east.ne.jp

PP[11] [client]
state: established
server:
address: ::
preference: 0
prefix: 2400:7800:cccc:dd00::/56
duration: 14400
T1: 7200
T2: 11520
preferred lifetime: 14400
valid lifetime: 14400
DNS server[1]: 2400:7800:0:3001::1:1
DNS server[2]: 2400:7800:0:3001::2:1
---------------------------------------------

LUAスクリプの20行目から30行目を下記のように変更した
---------------------------------------------
r,m=rt.command("show status ipv6 dhcp")
if r then
for lr in string.gmatch(m,"[^%c]+") do
for v in string.gmatch(lr,"([%a%d%[%]]+) %[client%]") do
if v=="LAN2" then vf=true else vf=false end
end
-- DHCPv6 prefix
if vf then
for v in string.gmatch(lr,"prefix:%s([%a%d:/]+)") do NgnPrefix=v end
for v in string.gmatch(lr,"preferred lifetime:%s(%d+)") do preferred_lifetime=v end
for v in string.gmatch(lr,"valid lifetime:%s(%d+)") do valid_lifetime=v end
end
end
else
rt.syslog("info","[LUA] arg[0] "..m)
end
---------------------------------------------
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ヤマハNVR500のLUAスクリプトでNGNドメインのDNS選択を行う

2018-06-10 14:00:00 | NVR500
NGNの経路情報設定ができたのでNGNドメインの名前解決にNGNから提示されるDNSを使うようにNVR500にDNS選択の設定を加える。
ひかり電話ルータ(PR-S300SE)配下でDHCPv6情報を得ると下記のようにNGNドメイン名が提示される。この情報を元に「dns server select」コマンドで、設定する。

---- show status ipv6 dhcp
DHCPv6 status

LAN2 [client]
state: established
server:
address: ::
preference: 0
prefix: 2408:210:aaaa:bb10::/60
duration: 14400
T1: 7200
T2: 12600
preferred lifetime: 14400
valid lifetime: 14400
SIP server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
DNS server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
Domain name[1]: flets-east.jp
Domain name[2]: iptvf.jp
SNTP server[1]: 2404:1a8:1102::a
SNTP server[2]: 2404:1a8:1102::b
Vender Specific Information:
Enterprise Number: 210
MAC Address: 00:a0:de:12:34:1b
Tel Number: 3
SIP Domain: ntt-east.ne.jp
---------

LUAスクリプトがこれ(2018/0612 修正変更)


実行結果
「かんたん設定」で加えられるコマンドは、idが500000番台なのでidを100000番台として先に評価されるようにした


ほとんど変化する事は無いと思うが、毎日一回チェックして処理するようにスケデュールしてみた。


--- 2018/06/15 追記
-- バグ?発見修正
ひかり電話ルータ(PR-S300SE)とIPv6 PPPoE接続でそれぞれDHCPv6 clientが実行される。
同時接続中にNVR500の「show status ipv6 dhcp」コマンドが実行されると両方のインターフェースのDHCP情報が出力される。
ぷららIPv6 PPPoEのDHCPv6からは、「Domain」情報が設定されていないが、「Prefix」が設定されている。LUAスクリプトで「Domain」や「Prefix」を抽出するとキーが同じため最後にマッチした「Domain」と「Prefix」の値となり、期待した情報を抽出できない。
PR-S300SEとPlala IPv6PPPoEの同時接続時に得られるDHCPv6情報は、下記の通り
---------------------------------------------
-- show status ipv6 dhcp
DHCPv6 status

LAN1 [server]
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply
state: reply

LAN2 [client]
state: established
server:
address: ::
preference: 0
prefix: 2408:210:aaaa:bb10::/60
duration: 14400
T1: 7200
T2: 12600
preferred lifetime: 14400
valid lifetime: 14400
SIP server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
DNS server[1]: 2408:210:aaaa:bb00:225:dcff:fe12:340d
Domain name[1]: flets-east.jp
Domain name[2]: iptvf.jp
SNTP server[1]: 2404:1a8:1102::a
SNTP server[2]: 2404:1a8:1102::b
Vender Specific Information:
Enterprise Number: 210
MAC Address: 00:a0:de:12:34:1b
Tel Number: 3
SIP Domain: ntt-east.ne.jp

PP[11] [client]
state: established
server:
address: ::
preference: 0
prefix: 2400:7800:cccc:dd00::/56
duration: 14400
T1: 7200
T2: 11520
preferred lifetime: 14400
valid lifetime: 14400
DNS server[1]: 2400:7800:0:3001::1:1
DNS server[2]: 2400:7800:0:3001::2:1
---------------------------------------------

LUAスクリプの25行目から27行目を下記のように変更し、LAN2からの「Domain」情報を取得するようにした
-------------------------------------------
r,m=rt.command("show status ipv6 dhcp")
if r then
for lr in string.gmatch(m,"[^%c]+") do
for v in string.gmatch(lr,"([%a%d%[%]]+) %[client%]") do if v=="LAN2" then vf=true else vf=false end end
if vf then
for nn,dn in string.gmatch(lr,"Domain name%p(%d+)%p:% +([%a%.%-]+)") do
domain[dn]=nn
end
end
end
else
rt.syslog("info","[LUA] arg[0] "..m)
end
-------------------------------------------
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ヤマハNVR500のLUAスクリプトでNGN経路情報設定を行う

2018-06-08 23:59:59 | NVR500
NVR500のLUAスクリプト「rt.httprequest関数」を使ってNGNのIPv6経路情報を取得できることを確認した。取得したNGN経路情報を「rt.command関数」でconfig設定してみた。
NGN経路情報を提供するIPv6サーバは、NGN内に設置されており、NVR500のdnsリゾルバで名前解決が出来る必要がある。但し、NVR500コマンド「nslookup」では、IPv6アドレスを確認できない(dns関連設定が適切でないとIPv6アドレスで接続出来るがホスト名で接続出来ないなどの不具合が発生する。結構手間取った)。

IPv6アドレスでhttpアクセスするときのURLは、
http://[2404:1a8:c023:3201::15]:49881/v6/route-info

NGNのIPv6経路情報の取得と設定は、下記の手順で実行されるよう設計した。

「経路情報ID」は、「IP通信網サービスのインターフェース(第3分冊)」の「2.5.3.2.3 メッセージボディ部」に記載された「タイプナンバー[0000]の経路情報の更新年月日」とした。取得設定した経路情報は、更新変化を確認するためNVR500の環境変数に記憶し、変化分の経路情報を追加・削除処理するようにした。
「タイプナンバー111N、121N、131N、141N」については、LUAのテーブルに読込、連想配列(文字列キー)として使用した。

LUAスクリプトは、6年前に作成した「NVR500でDynDNSの登録更新をしてみた」以来触っていなかったので難儀した。
・予約語の1文字目を大文字にして書いたら「エラー」
・変数の接頭語を小文字で書いたり、先頭文字を大文字にしたら、異なる変数
・ローカルテーブルの初期化で失敗「local t1, t2 = {}」->「local t1={}; local t2={}」
・next(t1)としてもnilテーブル確認出来なかった。next(t1,nil)とする必要があった
・正規表現を使うとうまく動作させられなかった
---
・NVR500のsetコマンドパラメータ「変数名='変数データ'」のように「=」の前後にスペースを入れるとエラー
慣れていないスクリプトは、時間が掛かる。。。。

出来上がったスクリプトがこれ


環境変数に保存されたデータ


設定されたNGNのIPv6経路情報


スケデュール設定(毎週土曜日に実行)


syslogの履歴。は、初回全てのデータを設定。は、経路情報に変化が無いため確認した「経路情報の更新年月日」を記録


--- 2018/06/09 追記 ---
スケデュール実行の結果



2011/01/14の経路情報から2018/02/02の経路情報に更新されたときの処理テストデータ
(PCで評価)

エラー発見:
スクリプトコード71行目
for plr in string.gmatch(prev_NgnRouteInfo,"[^%b--]+") do
「-」と「-」で囲まれる以外の文字列としたかったが、この表記では、「%」「b」「-」以外の文字となってしまう。
for plr in string.gmatch(prev_NgnRouteInfo,"[^-]+") do

for plr in string.gmatch(prev_NgnRouteInfo,"[0-9a-fA-F:/ ]+") do
です。。。
コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ヤマハNVR500のLUAでNGN経路情報取得が出来るか?

2018-06-02 09:00:00 | NVR500
「IPv6 PPPoE」インターネット接続と「ひかり電話」「NGN」サービス情報サイト接続を同時に接続するには、「NGN」経路情報取得(2.5.3.1 経路情報提供サーバ)が必要になる。
光ネクストの経路情報提供サービスとPR-S300SEで確認したがリクエストヘッダーの内容により情報取得に失敗する。

NVR500のLUAで経路情報を取得するため確認してみた。
ヤマハのIPv6対応も確認してみた。これによるとLUAは対応していないが、httpライブラリは対応しているようだ。
---------------
req_table = {
url = "http://route-info.flets-east.jp:49881/v6/route-info",
method = "GET"
}
resp_table = rt.httprequest(req_table)
print("Result - " .. testing(req_table.url) .. "¥r¥nrtn1-> " .. tostring(resp_table.rtn1) .. "¥r¥nrtn2-> " .. tostring(resp_table.rtn2) .. "¥r¥nerr-> " .. tostring(resp_table.err) .. "¥r¥ncode-> " .. tostring(resp_table.code) .. "¥r¥nheader-> " .. tostring(resp_table.header) .. "¥r¥nbody-> " .. tostring(resp_table.body) )
---------------

NVR500上でLUAスクリプトを実行してみると

幸いなことにheaderでのトラブルは無いようようだ。

NVR500のLUAによるhttp requestのheaderに何がセットされるかWireSharkでキャプチャしてみた

User-Agentがセットされていても問題無いようだ。
取得したNGNのIPv6経路情報を「rt.command()」で「ipv6 route 経路情報 gateway PR-S300SEのIPv6アドレス」を順次設定するLUAスクリプトを作成し、scheduleで毎週1回(PR-S300SEが毎週1回実行している)実行する予定。


NGN IPv6経路情報をPCで取得する

Macbook pro( macOS )
curl -H 'Host:route-info.flets-east.jp:49881' -H 'Accept:*/*' -H 'Connection:close' --http1.1 http://route-info.flets-east.jp:49881/v6/route-info




Windows(powershell)
Invoke-RestMethod -Uri http://route-info.flets-east.jp:49881/v6/route-info -Method Get -Headers @{"Host"="route-info.flets-east.jp:49881"; "Accept"="*/*"} -DisableKeepAlive
「Connection:close」をHeadersから指定して実行すると設定出来ないエラーが発生する。
「DisableKeepAlive」で指定するようだが、、、

「Connection:Close」と設定され、「Bad Request」でエラーになる。

Windows(WindowsSHell)
光ネクストの経路情報提供サービスとPR-S300SE」も再度パケットを確認してみる
---------------
Set oHttp=Wscript.CreateObject("MSXML2.XMLHTTP")
Call oHttp.Open("GET","http://route-info.flets-east.jp:49881/v6/route-info",False)
Call oHttp.setRequestHeader("Host","route-info.flets-east.jp:49881")
Call oHttp.setRequestHeader("Accept","*/*")
Call oHttp.setRequestHeader("Connection","close")
Call oHttp.send()
WScript.Echo(oHttp.status)
WScript.Echo(oHttp.responseText)
---------------
PowerShellと同様にRequestHeaderで「Connection:Close」となってしまう。指定した通りに設定してほしい。。。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする