$Date: 2026/01/06 19:56:19 $
アルテリア・ネットワークス株式会社が提供する クロスパス(Xpass) を利用したインターネット接続の設定例です。
(※) クロスパス(Xpass)は、アルテリア・ネットワークス株式会社の登録商標(または商標)です。
| 変更前 | 変更後 |
|---|---|
| dns server pp 1 dns server dhcp lan2 (dns server select 500000 dhcp lan2 any .) dns server select 500001 pp 1 any . restrict pp 1 |
dns server pp 1 dns server dhcp lan2 dns server select 500000 dhcp lan2 aaaa . dns server select 500001 pp 1 any . restrict pp 1 |
ヤマハRTシリーズでは、以下の機種およびファームウェアで、クロスパス(Xpass)のサービスが動作可能です。
| 機種 | ファームウェア | |
|---|---|---|
| 可変IP契約 | 固定IP1/8/16契約 | |
| RTX840 | すべてのリビジョン | すべてのリビジョン |
| RTX3510 | ||
| RTX1300 | ||
| RTX1220 | ||
| RTX830 | Rev.15.02.03 以降 | |
| NVR510 | Rev.15.01.09 以降 | |
| NVR700W | Rev.15.00.10 以降 | |
| RTX1210 | Rev.14.01.26 以降 | |
| RTX5000 | Rev.14.00.26 以降 | |
| RTX3500 | Rev.14.00.26 以降 | |
NWR100 の対応ファームウェアは以下を参照ください。
クロスパス(Xpass)のサービス利用下におけるIPv4のVPN接続は、以下の機種およびファームウェアで動作可能です。
| 機種 | ファームウェア | |||
|---|---|---|---|---|
| 可変IP契約 | 固定IP1/8/16契約 | |||
| IPsec (イニシエーター) |
IPsec | L2TP/IPsec | L2TPv3/IPsec L2TPv3 |
|
| RTX840 | すべてのリビジョン | すべてのリビジョン | すべてのリビジョン | すべてのリビジョン |
| RTX3510 | ||||
| RTX1300 | ||||
| RTX1220 | Rev.15.04.03 以降 | Rev.15.04.03 以降 | ||
| RTX830 | Rev.15.02.03 以降 | Rev.15.02.03 以降 | Rev.15.02.20 以降 | Rev.15.02.20 以降 |
| NVR510 | - | - | Rev.15.01.21 以降 | - |
| NVR700W | Rev.15.00.14 以降 | Rev.15.00.14 以降 | Rev.15.00.22 以降 | Rev.15.00.22 以降 |
| RTX1210 | Rev.14.01.28 以降 | Rev.14.01.28 以降 | Rev.14.01.40 以降 | Rev.14.01.40 以降 |
| RTX5000 | Rev.14.00.32 以降 | Rev.14.00.32 以降 | Rev.14.00.32 以降 | Rev.14.00.32 以降 |
| RTX3500 | Rev.14.00.32 以降 | Rev.14.00.32 以降 | Rev.14.00.32 以降 | Rev.14.00.32 以降 |
クロスパス(Xpass)のサービス利用下におけるIPv4のVPN接続は、以下のVPN接続の設定例を参考に、クロスパス(Xpass)のサービスと組み合わせてご利用ください。
(※) DS-Lite は、IPIPトンネリング(IPv4 over IPv6トンネル接続)を利用して行います。この時、ルーターはIPv4パケットをIPv6でカプセル化し、IPv6ネットワークに設置された AFTR(Address Family Transition Router)にIPv6パケットを転送します。AFTRにて、カプセル化されたIPv4パケットをIPv6パケットから取り出し、IPマスカレードによる変換を行い、IPv4インターネットへとIPv4パケットを転送します。
| 光回線 | 契約 | WAN側の接続機器 | 確認事項 | 設定例 | ||
|---|---|---|---|---|---|---|
| フレッツ 光ネクスト | 可変IP契約 | ONU | ひかり電話契約 なし | 1 | ||
| ひかり電話契約 あり | 2 | |||||
| ホームゲートウェイ (HGW) |
ひかり電話契約 なし | 1 | ||||
| ひかり電話契約 あり | HGWがルーターへ RA を広告 | 1 | ||||
| HGWがルーターへ DHCPv6-PD によるIPv6アドレスを配布 | 2 | |||||
| 固定IP1契約 | ONU | ひかり電話契約 なし | 3 | |||
| ひかり電話契約 あり | 4 | |||||
| ホームゲートウェイ (HGW) |
ひかり電話契約 なし | 3 | ||||
| ひかり電話契約 あり | HGWがルーターへ RA を広告 | 3 | ||||
| HGWがルーターへ DHCPv6-PD によるIPv6アドレスを配布 | 4 | |||||
| 固定IP8/16契約 | ONU | ひかり電話契約 なし | LAN側でグローバルIPv4アドレスを使用する場合 | 5 | ||
| LAN側でグローバルIPv4アドレスとプライベートIPv4アドレスを使用する場合 | 7 | |||||
| ひかり電話契約 あり | LAN側でグローバルIPv4アドレスを使用する場合 | 6 | ||||
| LAN側でグローバルIPv4アドレスとプライベートIPv4アドレスを使用する場合 | 8 | |||||
| ホームゲートウェイ (HGW) |
ひかり電話契約 なし | LAN側でグローバルIPv4アドレスを使用する場合 | 5 | |||
| LAN側でグローバルIPv4アドレスとプライベートIPv4アドレスを使用する場合 | 7 | |||||
| ひかり電話契約 あり | HGWがルーターへ RA を広告 | LAN側でグローバルIPv4アドレスを使用する場合 | 5 | |||
| LAN側でグローバルIPv4アドレスと プライベートIPv4アドレスを使用する場合 |
7 | |||||
| HGWがルーターへ DHCPv6-PD によるIPv6アドレスを配布 |
LAN側でグローバルIPv4アドレスを使用する場合 | 6 | ||||
| LAN側でグローバルIPv4アドレスと プライベートIPv4アドレスを使用する場合 |
8 | |||||
| フレッツ 光クロス | 可変IP契約 | ONU | - | 2 | ||
| ホームゲートウェイ (HGW) |
HGWがルーターへ RA を広告 | 1 | ||||
| HGWがルーターへ DHCPv6-PD によるIPv6アドレスを配布 | 2 | |||||
| 固定IP1契約 | ONU | - | 4 | |||
| ホームゲートウェイ (HGW) |
HGWがルーターへ RA を広告 | 3 | ||||
| HGWがルーターへ DHCPv6-PD によるIPv6アドレスを配布 | 4 | |||||
| 固定IP8/16契約 | ONU | LAN側でグローバルIPv4アドレスを使用する場合 | 6 | |||
| LAN側でグローバルIPv4アドレスとプライベートIPv4アドレスを使用する場合 | 8 | |||||
| ホームゲートウェイ (HGW) |
HGWがルーターへ RA を広告 | LAN側でグローバルIPv4アドレスを使用する場合 | 5 | |||
| LAN側でグローバルIPv4アドレスとプライベートIPv4アドレスを使用する場合 | 7 | |||||
| HGWがルーターへ DHCPv6-PD によるIPv6アドレスを配布 |
LAN側でグローバルIPv4アドレスを使用する場合 | 6 | ||||
| LAN側でグローバルIPv4アドレスとプライベートIPv4アドレスを使用する場合 | 8 | |||||
(※) ホームゲートウェイの動作は、ホームゲートウェイの設定をご確認ください。
| LAN1 | IPv4アドレス | 192.168.100.1/24 |
| IPv6アドレス | (RAで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address 192.168.100.1/24
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
【AFTRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint name dgw.xpass.jp
tunnel enable 1
【DHCPの設定】
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
【DNSの設定】
dns server dhcp lan2
【IPv4フィルター関連設定】
tunnel select 1
ip tunnel secure filter in 200030 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 ra-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| LAN1 | IPv4アドレス | 192.168.100.1/24 |
| IPv6アドレス | (DHCPv6-PDで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | (DHCPv6-PDで取得したプレフィックス)::(EUI-64で生成されたインターフェースID)/64 |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address 192.168.100.1/24
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 route default gateway dhcp lan2
ipv6 prefix 1 dhcp-prefix@lan2::/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 dhcp
ipv6 lan2 dhcp service client
【AFTRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint name dgw.xpass.jp
tunnel enable 1
【DHCPの設定】
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
【DNSの設定】
dns server dhcp lan2
【IPv4フィルター関連設定】
tunnel select 1
ip tunnel secure filter in 200030 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 dhcp-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| DDNS_SV | DDNSアップデート先URL |
| FQDN | FQDN |
| DDNS_ID | DDNS ID |
| DDNS_PASS | DDNS パスワード |
| BASIC_ID | Basic認証ID |
| BASIC_PASS | Basic認証パスワード |
| LAN1 | IPv4アドレス | 192.168.100.1/24 |
| IPv6アドレス | (RAで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address 192.168.100.1/24
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
【BRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address (固定IPトンネル終端装置のIPv6アドレス)
ip tunnel nat descriptor 1
ip tunnel tcp mss limit auto
tunnel enable 1
【NAT設定】
nat descriptor type 1 masquerade
nat descriptor address outer 1 (固定IPv4アドレス)
# 注意事項
# (固定IPv4アドレス) = XXX.XXX.XXX.XXX
# /24 のようなアドレスプレフィックスは不要
【DHCPの設定】
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
【DNSの設定】
dns host lan1
dns service fallback on
dns server dhcp lan2
dns server select 500000 dhcp lan2 any .
【IPv4フィルター関連設定】
tunnel select 1
ip tunnel secure filter in 200030 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
【IPv6アドレスの通知設定】
ipv6 lan1 prefix change log on
lan linkup send-wait-time lan2 5
schedule at 1 startup * lua emfs:/xpass_ra.lua
embedded file xpass_ra.lua <<EOF
--[[
■ クロスパス(Xpass) IPv6アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.02 ヤマハ株式会社
本スクリプトは、クロスパス(Xpass) の 固定IP1/8/16契約の RAプロキシ において
指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、
アップデートサーバーにIPv6アドレスの更新通知を行うLuaスクリプト
のサンプルです。
新しいIPv6プレフィックスが付与されたことは、ルーターのSYSLOGを監視し、以下
のログが出力された場合に検知しています。
(IPv6アドレスがLAN1に設定されている場合の例)
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by RA
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[注意事項]
・本スクリプトは、schedule atコマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[更新履歴]
2021.03.02 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- DDNSアップデート先URL
DDNS_SV = "DDNSアップデート先URL"
-- FQDN
FQDN = "FQDN"
-- DDNS ID
DDNS_ID = "DDNS ID"
-- DDNS パスワード
DDNS_PASS = "DDNS パスワード"
-- Basic認証ID
BASIC_ID = "Basic認証ID"
-- Basic認証パスワード
BASIC_PASS = "Basic認証パスワード"
-- IPv6アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- WANインターフェース名
WAN_IF = "LAN2"
-- IPv6プレフィックスが追加されたときのSYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- 新しい動的IPv6アドレスを確認するコマンド
SHOW_IP6_CMD = "show ipv6 address " .. string.lower(IPv6_IF)
-- ステートレスDHCPv6でDNS情報を取得するコマンド
DHCPv6_IR_CMD = "ipv6 " .. string.lower(WAN_IF) .. " dhcp service client ir=on"
-- 新しい動的IPv6アドレスを確認する最大回数
GET_IP6_MAX = 5
-- エラー時のリトライの間隔 (秒)
RETRY_INTVL = 5
-- エラー時のリトライ回数
RETRY_NUM = 3
-- 定期実行間隔 最少値(秒)
AUTO_INTVL_MIN = 480
-- 定期実行間隔 最大値(秒)
AUTO_INTVL_MAX = 600
-- SYSLOGのレベル
LOG_LEVEL = "info"
-- SYSLOGのプレフィックス
LOG_PFX = "[Xpass]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- 新しい動的IPv6アドレスを取得する関数-
----------------------------------------
function get_addr(pfx)
local rtn, str, i, t, id, addr
for i = 1, GET_IP6_MAX do
-- 新しい動的IPv6アドレスを確認
rtn, str = rt.command(SHOW_IP6_CMD .. " | grep " .. pfx)
-- tentativeの場合、待機後に再確認
if rtn then
if str then
t = str:match("tentative")
if t == nil then
-- 有効の場合、新しい動的IPv6アドレスを生成されているためループを抜ける
break
end
end
end
-- 確認回数の上限を迎えた場合、終了
if i >= GET_IP6_MAX then
return
end
-- 2秒待機
rt.sleep(2)
end
-- インターフェースID部を取得
id = str:match(pfx .. "(.-)/(%d+)")
-- 新しい動的IPv6アドレスを生成
addr = pfx .. id
return addr
end
----------------------------------------
-- SYSLOGを出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, str, count, log, result, sleep_time, pfx, addr, return_watch
local req_t = {}
local res_t
--------------------
-- 初期化
math.randomseed(os.time())
--------------------
-- 監視
while true do
addr = nil
return_watch = 0
-- SYSLOGを監視する
rtn, str = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr ~= nil then
while true do
-- リトライ回数をリセット
count = RETRY_NUM
while true do
req_t = {
url = string.format("%s\?d=%s&p=%s&a=%s&u=%s", DDNS_SV, FQDN, DDNS_PASS, addr, DDNS_ID),
method = "GET",
auth_type = "basic",
auth_name = BASIC_ID,
auth_pass = BASIC_PASS
}
-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)
log = string.format("アップデートサーバーへの通知を実行しました。(addr=%s)", addr)
logger(log)
-- リクエストに成功
if res_t.rtn1 then
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d)",
result, res_t.code)
logger(log)
-- ループを抜け、定期実行を行う
if res_t.code == 200 then
break
end
else
-- リクエストの応答がない場合、DNS情報が取得できていない可能性があるため
-- DNS情報を再取得する
rt.command(DHCPv6_IR_CMD)
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- (RETRY_INTVL)秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
return_watch = 1
break
end
end
if return_watch == 1 then
break
end
-- 定期的に通知する
sleep_time = math.random(AUTO_INTVL_MIN, AUTO_INTVL_MAX)
rtn, str = rt.syslogwatch(LOG_PTN, 1, sleep_time)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr == nil then
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
break
end
end
end
else
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
end
end
end
EOF
# 注意事項
# Luaスクリプトの最終行は EOF を改行した空行としてください。
# 最終行が EOF の場合、Luaスクリプトが最終行を認識できず、Luaスクリプトが動作しません。
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 ra-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| DDNS_SV | DDNSアップデート先URL |
| FQDN | FQDN |
| DDNS_ID | DDNS ID |
| DDNS_PASS | DDNS パスワード |
| BASIC_ID | Basic認証ID |
| BASIC_PASS | Basic認証パスワード |
| LAN1 | IPv4アドレス | 192.168.100.1/24 |
| IPv6アドレス | (DHCPv6-PDで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address 192.168.100.1/24
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 route default gateway dhcp lan2
ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client
【BRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address (固定IPトンネル終端装置のIPv6アドレス)
ip tunnel nat descriptor 1
ip tunnel tcp mss limit auto
tunnel enable 1
【NAT設定】
nat descriptor type 1 masquerade
nat descriptor address outer 1 (固定IPv4アドレス)
# 注意事項
# (固定IPv4アドレス) = XXX.XXX.XXX.XXX
# /24 のようなアドレスプレフィックスは不要
【DHCPの設定】
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
【DNSの設定】
dns host lan1
dns service fallback on
dns server dhcp lan2
dns server select 500000 dhcp lan2 any .
【IPv4フィルター関連設定】
tunnel select 1
ip tunnel secure filter in 200030 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
【IPv6アドレスの通知設定】
ipv6 lan1 prefix change log on
lan linkup send-wait-time lan2 5
schedule at 1 startup * lua emfs:/xpass_pd.lua
embedded file xpass_pd.lua <<EOF
--[[
■ クロスパス(Xpass) IPv6アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.02 ヤマハ株式会社
本スクリプトは、クロスパス(Xpass) の 固定IP1/8/16契約の DHCPv6-PD において
指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、
アップデートサーバーにIPv6アドレスの更新通知を行うLuaスクリプト
のサンプルです。
新しいIPv6プレフィックスが付与されたことは、ルーターのSYSLOGを監視し、以下
のログが出力された場合に検知しています。
(IPv6アドレスがLAN1に設定されている場合の例)
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by DHCPv6
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[注意事項]
・本スクリプトは、schedule atコマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[更新履歴]
2021.03.02 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- DDNSアップデート先URL
DDNS_SV = "DDNSアップデート先URL"
-- FQDN
FQDN = "FQDN"
-- DDNS ID
DDNS_ID = "DDNS ID"
-- DDNS パスワード
DDNS_PASS = "DDNS パスワード"
-- Basic認証ID
BASIC_ID = "Basic認証ID"
-- Basic認証パスワード
BASIC_PASS = "Basic認証パスワード"
-- IPv6アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- IPv6プレフィックスが追加されたときのSYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- 新しい動的IPv6アドレスを確認するコマンド
SHOW_IP6_CMD = "show ipv6 address " .. string.lower(IPv6_IF)
-- 新しい動的IPv6アドレスを確認する最大回数
GET_IP6_MAX = 5
-- エラー時のリトライの間隔 (秒)
RETRY_INTVL = 5
-- エラー時のリトライ回数
RETRY_NUM = 3
-- 定期実行間隔 最少値(秒)
AUTO_INTVL_MIN = 480
-- 定期実行間隔 最大値(秒)
AUTO_INTVL_MAX = 600
-- SYSLOGのレベル
LOG_LEVEL = "info"
-- SYSLOGのプレフィックス
LOG_PFX = "[Xpass]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- 新しい動的IPv6アドレスを取得する関数-
----------------------------------------
function get_addr(pfx)
local rtn, str, i, t, id, addr
for i = 1, GET_IP6_MAX do
-- 新しい動的IPv6アドレスを確認
rtn, str = rt.command(SHOW_IP6_CMD .. " | grep " .. pfx)
-- tentativeの場合、待機後に再確認
if rtn then
if str then
t = str:match("tentative")
if t == nil then
-- 有効の場合、新しい動的IPv6アドレスを生成されているためループを抜ける
break
end
end
end
-- 確認回数の上限を迎えた場合、終了
if i >= GET_IP6_MAX then
return
end
-- 2秒待機
rt.sleep(2)
end
-- インターフェースID部を取得
id = str:match(pfx .. "(.-)/(%d+)")
-- 新しい動的IPv6アドレスを生成
addr = pfx .. id
return addr
end
----------------------------------------
-- SYSLOGを出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, str, count, log, result, sleep_time, pfx, addr, return_watch
local req_t = {}
local res_t
--------------------
-- 初期化
math.randomseed(os.time())
--------------------
-- 監視
while true do
addr = nil
return_watch = 0
-- SYSLOGを監視する
rtn, str = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr ~= nil then
while true do
-- リトライ回数をリセット
count = RETRY_NUM
while true do
req_t = {
url = string.format("%s\?d=%s&p=%s&a=%s&u=%s", DDNS_SV, FQDN, DDNS_PASS, addr, DDNS_ID),
method = "GET",
auth_type = "basic",
auth_name = BASIC_ID,
auth_pass = BASIC_PASS
}
-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)
log = string.format("アップデートサーバーへの通知を実行しました。(addr=%s)", addr)
logger(log)
-- リクエストに成功
if res_t.rtn1 then
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d)",
result, res_t.code)
logger(log)
-- ループを抜け、定期実行を行う
if res_t.code == 200 then
break
end
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- (RETRY_INTVL)秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
return_watch = 1
break
end
end
if return_watch == 1 then
break
end
-- 定期的に通知する
sleep_time = math.random(AUTO_INTVL_MIN, AUTO_INTVL_MAX)
rtn, str = rt.syslogwatch(LOG_PTN, 1, sleep_time)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr == nil then
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
break
end
end
end
else
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
end
end
end
EOF
# 注意事項
# Luaスクリプトの最終行は EOF を改行した空行としてください。
# 最終行が EOF の場合、Luaスクリプトが最終行を認識できず、Luaスクリプトが動作しません。
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 dhcp-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| DDNS_SV | DDNSアップデート先URL |
| FQDN | FQDN |
| DDNS_ID | DDNS ID |
| DDNS_PASS | DDNS パスワード |
| BASIC_ID | Basic認証ID |
| BASIC_PASS | Basic認証パスワード |
| IPv4アドレス | (xxx.xxx.xxx.0)/29 |
| LAN1 | IPv4アドレス | (xxx.xxx.xxx.1)/29 |
| IPv6アドレス | (RAで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし |
| IPv4アドレス | (xxx.xxx.xxx.2-6)/29 |
| デフォルトゲートウェイ | (xxx.xxx.xxx.1) |
| DNSサーバー | (xxx.xxx.xxx.1) |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address (xxx.xxx.xxx.1)/29
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
【BRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address (固定IPトンネル終端装置のIPv6アドレス)
ip tunnel tcp mss limit auto
tunnel enable 1
【DNSの設定】
dns host lan1
dns service fallback on
dns server dhcp lan2
dns server select 500000 dhcp lan2 any .
【IPv4フィルター関連設定】
# LAN1のグローバルIPv4アドレスへのアクセスを許可する必要がある場合は、inフィルターを適宜追加してください
tunnel select 1
ip tunnel secure filter in 200030 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * (xxx.xxx.xxx.0)/29 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
【IPv6アドレスの通知設定】
ipv6 lan1 prefix change log on
lan linkup send-wait-time lan2 5
schedule at 1 startup * lua emfs:/xpass_ra.lua
embedded file xpass_ra.lua <<EOF
--[[
■ クロスパス(Xpass) IPv6アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.02 ヤマハ株式会社
本スクリプトは、クロスパス(Xpass) の 固定IP1/8/16契約の RAプロキシ において
指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、
アップデートサーバーにIPv6アドレスの更新通知を行うLuaスクリプト
のサンプルです。
新しいIPv6プレフィックスが付与されたことは、ルーターのSYSLOGを監視し、以下
のログが出力された場合に検知しています。
(IPv6アドレスがLAN1に設定されている場合の例)
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by RA
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[注意事項]
・本スクリプトは、schedule atコマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[更新履歴]
2021.03.02 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- DDNSアップデート先URL
DDNS_SV = "DDNSアップデート先URL"
-- FQDN
FQDN = "FQDN"
-- DDNS ID
DDNS_ID = "DDNS ID"
-- DDNS パスワード
DDNS_PASS = "DDNS パスワード"
-- Basic認証ID
BASIC_ID = "Basic認証ID"
-- Basic認証パスワード
BASIC_PASS = "Basic認証パスワード"
-- IPv6アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- WANインターフェース名
WAN_IF = "LAN2"
-- IPv6プレフィックスが追加されたときのSYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- 新しい動的IPv6アドレスを確認するコマンド
SHOW_IP6_CMD = "show ipv6 address " .. string.lower(IPv6_IF)
-- ステートレスDHCPv6でDNS情報を取得するコマンド
DHCPv6_IR_CMD = "ipv6 " .. string.lower(WAN_IF) .. " dhcp service client ir=on"
-- 新しい動的IPv6アドレスを確認する最大回数
GET_IP6_MAX = 5
-- エラー時のリトライの間隔 (秒)
RETRY_INTVL = 5
-- エラー時のリトライ回数
RETRY_NUM = 3
-- 定期実行間隔 最少値(秒)
AUTO_INTVL_MIN = 480
-- 定期実行間隔 最大値(秒)
AUTO_INTVL_MAX = 600
-- SYSLOGのレベル
LOG_LEVEL = "info"
-- SYSLOGのプレフィックス
LOG_PFX = "[Xpass]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- 新しい動的IPv6アドレスを取得する関数-
----------------------------------------
function get_addr(pfx)
local rtn, str, i, t, id, addr
for i = 1, GET_IP6_MAX do
-- 新しい動的IPv6アドレスを確認
rtn, str = rt.command(SHOW_IP6_CMD .. " | grep " .. pfx)
-- tentativeの場合、待機後に再確認
if rtn then
if str then
t = str:match("tentative")
if t == nil then
-- 有効の場合、新しい動的IPv6アドレスを生成されているためループを抜ける
break
end
end
end
-- 確認回数の上限を迎えた場合、終了
if i >= GET_IP6_MAX then
return
end
-- 2秒待機
rt.sleep(2)
end
-- インターフェースID部を取得
id = str:match(pfx .. "(.-)/(%d+)")
-- 新しい動的IPv6アドレスを生成
addr = pfx .. id
return addr
end
----------------------------------------
-- SYSLOGを出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, str, count, log, result, sleep_time, pfx, addr, return_watch
local req_t = {}
local res_t
--------------------
-- 初期化
math.randomseed(os.time())
--------------------
-- 監視
while true do
addr = nil
return_watch = 0
-- SYSLOGを監視する
rtn, str = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr ~= nil then
while true do
-- リトライ回数をリセット
count = RETRY_NUM
while true do
req_t = {
url = string.format("%s\?d=%s&p=%s&a=%s&u=%s", DDNS_SV, FQDN, DDNS_PASS, addr, DDNS_ID),
method = "GET",
auth_type = "basic",
auth_name = BASIC_ID,
auth_pass = BASIC_PASS
}
-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)
log = string.format("アップデートサーバーへの通知を実行しました。(addr=%s)", addr)
logger(log)
-- リクエストに成功
if res_t.rtn1 then
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d)",
result, res_t.code)
logger(log)
-- ループを抜け、定期実行を行う
if res_t.code == 200 then
break
end
else
-- リクエストの応答がない場合、DNS情報が取得できていない可能性があるため
-- DNS情報を再取得する
rt.command(DHCPv6_IR_CMD)
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- (RETRY_INTVL)秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
return_watch = 1
break
end
end
if return_watch == 1 then
break
end
-- 定期的に通知する
sleep_time = math.random(AUTO_INTVL_MIN, AUTO_INTVL_MAX)
rtn, str = rt.syslogwatch(LOG_PTN, 1, sleep_time)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr == nil then
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
break
end
end
end
else
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
end
end
end
EOF
# 注意事項
# Luaスクリプトの最終行は EOF を改行した空行としてください。
# 最終行が EOF の場合、Luaスクリプトが最終行を認識できず、Luaスクリプトが動作しません。
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 ra-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| DDNS_SV | DDNSアップデート先URL |
| FQDN | FQDN |
| DDNS_ID | DDNS ID |
| DDNS_PASS | DDNS パスワード |
| BASIC_ID | Basic認証ID |
| BASIC_PASS | Basic認証パスワード |
| IPv4アドレス | (xxx.xxx.xxx.0)/29 |
| LAN1 | IPv4アドレス | (xxx.xxx.xxx.1)/29 |
| IPv6アドレス | (DHCPv6-PDで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし |
| IPv4アドレス | (xxx.xxx.xxx.2-6)/29 |
| デフォルトゲートウェイ | (xxx.xxx.xxx.1) |
| DNSサーバー | (xxx.xxx.xxx.1) |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address (xxx.xxx.xxx.1)/29
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 route default gateway dhcp lan2
ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client
【BRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address (固定IPトンネル終端装置のIPv6アドレス)
ip tunnel tcp mss limit auto
tunnel enable 1
【DNSの設定】
dns host lan1
dns service fallback on
dns server dhcp lan2
dns server select 500000 dhcp lan2 any .
【IPv4フィルター関連設定】
# LAN1のグローバルIPv4アドレスへのアクセスを許可する必要がある場合は、inフィルターを適宜追加してください
tunnel select 1
ip tunnel secure filter in 200030 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * (xxx.xxx.xxx.0)/29 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
【IPv6アドレスの通知設定】
ipv6 lan1 prefix change log on
lan linkup send-wait-time lan2 5
schedule at 1 startup * lua emfs:/xpass_pd.lua
embedded file xpass_pd.lua <<EOF
--[[
■ クロスパス(Xpass) IPv6アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.02 ヤマハ株式会社
本スクリプトは、クロスパス(Xpass) の 固定IP1/8/16契約の DHCPv6-PD において
指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、
アップデートサーバーにIPv6アドレスの更新通知を行うLuaスクリプト
のサンプルです。
新しいIPv6プレフィックスが付与されたことは、ルーターのSYSLOGを監視し、以下
のログが出力された場合に検知しています。
(IPv6アドレスがLAN1に設定されている場合の例)
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by DHCPv6
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[注意事項]
・本スクリプトは、schedule atコマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[更新履歴]
2021.03.02 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- DDNSアップデート先URL
DDNS_SV = "DDNSアップデート先URL"
-- FQDN
FQDN = "FQDN"
-- DDNS ID
DDNS_ID = "DDNS ID"
-- DDNS パスワード
DDNS_PASS = "DDNS パスワード"
-- Basic認証ID
BASIC_ID = "Basic認証ID"
-- Basic認証パスワード
BASIC_PASS = "Basic認証パスワード"
-- IPv6アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- IPv6プレフィックスが追加されたときのSYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- 新しい動的IPv6アドレスを確認するコマンド
SHOW_IP6_CMD = "show ipv6 address " .. string.lower(IPv6_IF)
-- 新しい動的IPv6アドレスを確認する最大回数
GET_IP6_MAX = 5
-- エラー時のリトライの間隔 (秒)
RETRY_INTVL = 5
-- エラー時のリトライ回数
RETRY_NUM = 3
-- 定期実行間隔 最少値(秒)
AUTO_INTVL_MIN = 480
-- 定期実行間隔 最大値(秒)
AUTO_INTVL_MAX = 600
-- SYSLOGのレベル
LOG_LEVEL = "info"
-- SYSLOGのプレフィックス
LOG_PFX = "[Xpass]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- 新しい動的IPv6アドレスを取得する関数-
----------------------------------------
function get_addr(pfx)
local rtn, str, i, t, id, addr
for i = 1, GET_IP6_MAX do
-- 新しい動的IPv6アドレスを確認
rtn, str = rt.command(SHOW_IP6_CMD .. " | grep " .. pfx)
-- tentativeの場合、待機後に再確認
if rtn then
if str then
t = str:match("tentative")
if t == nil then
-- 有効の場合、新しい動的IPv6アドレスを生成されているためループを抜ける
break
end
end
end
-- 確認回数の上限を迎えた場合、終了
if i >= GET_IP6_MAX then
return
end
-- 2秒待機
rt.sleep(2)
end
-- インターフェースID部を取得
id = str:match(pfx .. "(.-)/(%d+)")
-- 新しい動的IPv6アドレスを生成
addr = pfx .. id
return addr
end
----------------------------------------
-- SYSLOGを出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, str, count, log, result, sleep_time, pfx, addr, return_watch
local req_t = {}
local res_t
--------------------
-- 初期化
math.randomseed(os.time())
--------------------
-- 監視
while true do
addr = nil
return_watch = 0
-- SYSLOGを監視する
rtn, str = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr ~= nil then
while true do
-- リトライ回数をリセット
count = RETRY_NUM
while true do
req_t = {
url = string.format("%s\?d=%s&p=%s&a=%s&u=%s", DDNS_SV, FQDN, DDNS_PASS, addr, DDNS_ID),
method = "GET",
auth_type = "basic",
auth_name = BASIC_ID,
auth_pass = BASIC_PASS
}
-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)
log = string.format("アップデートサーバーへの通知を実行しました。(addr=%s)", addr)
logger(log)
-- リクエストに成功
if res_t.rtn1 then
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d)",
result, res_t.code)
logger(log)
-- ループを抜け、定期実行を行う
if res_t.code == 200 then
break
end
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- (RETRY_INTVL)秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
return_watch = 1
break
end
end
if return_watch == 1 then
break
end
-- 定期的に通知する
sleep_time = math.random(AUTO_INTVL_MIN, AUTO_INTVL_MAX)
rtn, str = rt.syslogwatch(LOG_PTN, 1, sleep_time)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr == nil then
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
break
end
end
end
else
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
end
end
end
EOF
# 注意事項
# Luaスクリプトの最終行は EOF を改行した空行としてください。
# 最終行が EOF の場合、Luaスクリプトが最終行を認識できず、Luaスクリプトが動作しません。
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 dhcp-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| DDNS_SV | DDNSアップデート先URL |
| FQDN | FQDN |
| DDNS_ID | DDNS ID |
| DDNS_PASS | DDNS パスワード |
| BASIC_ID | Basic認証ID |
| BASIC_PASS | Basic認証パスワード |
| IPv4アドレス | (xxx.xxx.xxx.0)/29 |
| LAN1 | IPv4アドレス | 192.168.100.1/24 |
| IPv6アドレス | (RAで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし | |
| LAN3 | IPv4アドレス | (xxx.xxx.xxx.1)/29 |
| IPv6アドレス | なし |
| IPv4アドレス | (xxx.xxx.xxx.2-6)/29 |
| デフォルトゲートウェイ | (xxx.xxx.xxx.1) |
| DNSサーバー | (xxx.xxx.xxx.1) |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address 192.168.100.1/24
ip lan3 address (xxx.xxx.xxx.1)/29
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 prefix 1 ra-prefix@lan2::/64
ipv6 lan1 address ra-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client ir=on
【BRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address (固定IPトンネル終端装置のIPv6アドレス)
ip tunnel tcp mss limit auto
ip tunnel nat descriptor 1
tunnel enable 1
【NAT設定】
nat descriptor type 1 masquerade
nat descriptor address outer 1 (xxx.xxx.xxx.2)
nat descriptor address inner 1 192.168.100.1-192.168.100.254
【DHCPの設定】
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
【DNSの設定】
dns server dhcp lan2
【IPv4フィルター関連設定】
# LAN1のグローバルIPv4アドレスへのアクセスを許可する必要がある場合は、inフィルターを適宜追加してください
tunnel select 1
ip tunnel secure filter in 200030 200031 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200031 pass * (xxx.xxx.xxx.0)/29 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
【IPv6アドレスの通知設定】
ipv6 lan1 prefix change log on
lan linkup send-wait-time lan2 5
schedule at 1 startup * lua emfs:/xpass_ra.lua
embedded file xpass_ra.lua <<EOF
--[[
■ クロスパス(Xpass) IPv6アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.02 ヤマハ株式会社
本スクリプトは、クロスパス(Xpass) の 固定IP1/8/16契約の RAプロキシ において
指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、
アップデートサーバーにIPv6アドレスの更新通知を行うLuaスクリプト
のサンプルです。
新しいIPv6プレフィックスが付与されたことは、ルーターのSYSLOGを監視し、以下
のログが出力された場合に検知しています。
(IPv6アドレスがLAN1に設定されている場合の例)
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by RA
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[注意事項]
・本スクリプトは、schedule atコマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[更新履歴]
2021.03.02 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- DDNSアップデート先URL
DDNS_SV = "DDNSアップデート先URL"
-- FQDN
FQDN = "FQDN"
-- DDNS ID
DDNS_ID = "DDNS ID"
-- DDNS パスワード
DDNS_PASS = "DDNS パスワード"
-- Basic認証ID
BASIC_ID = "Basic認証ID"
-- Basic認証パスワード
BASIC_PASS = "Basic認証パスワード"
-- IPv6アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- WANインターフェース名
WAN_IF = "LAN2"
-- IPv6プレフィックスが追加されたときのSYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- 新しい動的IPv6アドレスを確認するコマンド
SHOW_IP6_CMD = "show ipv6 address " .. string.lower(IPv6_IF)
-- ステートレスDHCPv6でDNS情報を取得するコマンド
DHCPv6_IR_CMD = "ipv6 " .. string.lower(WAN_IF) .. " dhcp service client ir=on"
-- 新しい動的IPv6アドレスを確認する最大回数
GET_IP6_MAX = 5
-- エラー時のリトライの間隔 (秒)
RETRY_INTVL = 5
-- エラー時のリトライ回数
RETRY_NUM = 3
-- 定期実行間隔 最少値(秒)
AUTO_INTVL_MIN = 480
-- 定期実行間隔 最大値(秒)
AUTO_INTVL_MAX = 600
-- SYSLOGのレベル
LOG_LEVEL = "info"
-- SYSLOGのプレフィックス
LOG_PFX = "[Xpass]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- 新しい動的IPv6アドレスを取得する関数-
----------------------------------------
function get_addr(pfx)
local rtn, str, i, t, id, addr
for i = 1, GET_IP6_MAX do
-- 新しい動的IPv6アドレスを確認
rtn, str = rt.command(SHOW_IP6_CMD .. " | grep " .. pfx)
-- tentativeの場合、待機後に再確認
if rtn then
if str then
t = str:match("tentative")
if t == nil then
-- 有効の場合、新しい動的IPv6アドレスを生成されているためループを抜ける
break
end
end
end
-- 確認回数の上限を迎えた場合、終了
if i >= GET_IP6_MAX then
return
end
-- 2秒待機
rt.sleep(2)
end
-- インターフェースID部を取得
id = str:match(pfx .. "(.-)/(%d+)")
-- 新しい動的IPv6アドレスを生成
addr = pfx .. id
return addr
end
----------------------------------------
-- SYSLOGを出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, str, count, log, result, sleep_time, pfx, addr, return_watch
local req_t = {}
local res_t
--------------------
-- 初期化
math.randomseed(os.time())
--------------------
-- 監視
while true do
addr = nil
return_watch = 0
-- SYSLOGを監視する
rtn, str = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr ~= nil then
while true do
-- リトライ回数をリセット
count = RETRY_NUM
while true do
req_t = {
url = string.format("%s\?d=%s&p=%s&a=%s&u=%s", DDNS_SV, FQDN, DDNS_PASS, addr, DDNS_ID),
method = "GET",
auth_type = "basic",
auth_name = BASIC_ID,
auth_pass = BASIC_PASS
}
-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)
log = string.format("アップデートサーバーへの通知を実行しました。(addr=%s)", addr)
logger(log)
-- リクエストに成功
if res_t.rtn1 then
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d)",
result, res_t.code)
logger(log)
-- ループを抜け、定期実行を行う
if res_t.code == 200 then
break
end
else
-- リクエストの応答がない場合、DNS情報が取得できていない可能性があるため
-- DNS情報を再取得する
rt.command(DHCPv6_IR_CMD)
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- (RETRY_INTVL)秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
return_watch = 1
break
end
end
if return_watch == 1 then
break
end
-- 定期的に通知する
sleep_time = math.random(AUTO_INTVL_MIN, AUTO_INTVL_MAX)
rtn, str = rt.syslogwatch(LOG_PTN, 1, sleep_time)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr == nil then
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
break
end
end
end
else
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
end
end
end
EOF
# 注意事項
# Luaスクリプトの最終行は EOF を改行した空行としてください。
# 最終行が EOF の場合、Luaスクリプトが最終行を認識できず、Luaスクリプトが動作しません。
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 ra-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server
| DDNS_SV | DDNSアップデート先URL |
| FQDN | FQDN |
| DDNS_ID | DDNS ID |
| DDNS_PASS | DDNS パスワード |
| BASIC_ID | Basic認証ID |
| BASIC_PASS | Basic認証パスワード |
| IPv4アドレス | (xxx.xxx.xxx.0)/29 |
| LAN1 | IPv4アドレス | 192.168.100.1/24 |
| IPv6アドレス | (DHCPv6-PDで取得したプレフィックス)::1/64 | |
| LAN2 | IPv4アドレス | なし |
| IPv6アドレス | なし | |
| LAN3 | IPv4アドレス | (xxx.xxx.xxx.1)/29 |
| IPv6アドレス | なし |
| IPv4アドレス | (xxx.xxx.xxx.2-6)/29 |
| デフォルトゲートウェイ | (xxx.xxx.xxx.1) |
| DNSサーバー | (xxx.xxx.xxx.1) |
【経路設定】
ip route default gateway tunnel 1
【LAN設定】
ip lan1 address 192.168.100.1/24
ip lan3 address (xxx.xxx.xxx.1)/29
【NGNとの接続設定】(※)
ngn type lan2 ntt
ipv6 route default gateway dhcp lan2
ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 rtadv send 1 o_flag=on
ipv6 lan1 dhcp service server
ipv6 lan2 dhcp service client
【BRに対するIPIPの設定】
tunnel select 1
tunnel encapsulation ipip
tunnel endpoint address (固定IPトンネル終端装置のIPv6アドレス)
ip tunnel tcp mss limit auto
ip tunnel nat descriptor 1
tunnel enable 1
【NAT設定】
nat descriptor type 1 masquerade
nat descriptor address outer 1 (xxx.xxx.xxx.2)
nat descriptor address inner 1 192.168.100.1-192.168.100.254
【DHCPの設定】
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.191/24
【DNSの設定】
dns server dhcp lan2
【IPv4フィルター関連設定】
# LAN1のグローバルIPv4アドレスへのアクセスを許可する必要がある場合は、inフィルターを適宜追加してください
tunnel select 1
ip tunnel secure filter in 200030 200031 200039
ip tunnel secure filter out 200097 200098 200099 dynamic 200080 200082 200083 200084 200098 200099
tunnel enable 1
ip filter 200030 pass * 192.168.100.0/24 icmp * *
ip filter 200031 pass * (xxx.xxx.xxx.0)/29 icmp * *
ip filter 200039 reject *
ip filter 200097 pass * * icmp * *
ip filter 200098 pass * * tcp * *
ip filter 200099 pass * * udp * *
ip filter dynamic 200080 * * ftp
ip filter dynamic 200082 * * www
ip filter dynamic 200083 * * smtp
ip filter dynamic 200084 * * pop3
ip filter dynamic 200098 * * tcp
ip filter dynamic 200099 * * udp
【IPv6フィルター関連設定】
ipv6 lan2 secure filter in 200030 200031 200038 200039
ipv6 lan2 secure filter out 200099 dynamic 200080 200081 200082 200083 200084 200098 200099
ipv6 filter 200030 pass * * icmp6 * *
ipv6 filter 200031 pass * * 4
ipv6 filter 200038 pass * * udp * 546
ipv6 filter 200039 reject *
ipv6 filter 200099 pass * * * * *
ipv6 filter dynamic 200080 * * ftp
ipv6 filter dynamic 200081 * * domain
ipv6 filter dynamic 200082 * * www
ipv6 filter dynamic 200083 * * smtp
ipv6 filter dynamic 200084 * * pop3
ipv6 filter dynamic 200098 * * tcp
ipv6 filter dynamic 200099 * * udp
【IPv6アドレスの通知設定】
ipv6 lan1 prefix change log on
lan linkup send-wait-time lan2 5
schedule at 1 startup * lua emfs:/xpass_pd.lua
embedded file xpass_pd.lua <<EOF
--[[
■ クロスパス(Xpass) IPv6アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.02 ヤマハ株式会社
本スクリプトは、クロスパス(Xpass) の 固定IP1/8/16契約の DHCPv6-PD において
指定したインターフェースに新しいIPv6プレフィックスが付与されたとき、
アップデートサーバーにIPv6アドレスの更新通知を行うLuaスクリプト
のサンプルです。
新しいIPv6プレフィックスが付与されたことは、ルーターのSYSLOGを監視し、以下
のログが出力された場合に検知しています。
(IPv6アドレスがLAN1に設定されている場合の例)
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by DHCPv6
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[注意事項]
・本スクリプトは、schedule atコマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[更新履歴]
2021.03.02 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- DDNSアップデート先URL
DDNS_SV = "DDNSアップデート先URL"
-- FQDN
FQDN = "FQDN"
-- DDNS ID
DDNS_ID = "DDNS ID"
-- DDNS パスワード
DDNS_PASS = "DDNS パスワード"
-- Basic認証ID
BASIC_ID = "Basic認証ID"
-- Basic認証パスワード
BASIC_PASS = "Basic認証パスワード"
-- IPv6アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- IPv6プレフィックスが追加されたときのSYSLOGパターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- 新しい動的IPv6アドレスを確認するコマンド
SHOW_IP6_CMD = "show ipv6 address " .. string.lower(IPv6_IF)
-- 新しい動的IPv6アドレスを確認する最大回数
GET_IP6_MAX = 5
-- エラー時のリトライの間隔 (秒)
RETRY_INTVL = 5
-- エラー時のリトライ回数
RETRY_NUM = 3
-- 定期実行間隔 最少値(秒)
AUTO_INTVL_MIN = 480
-- 定期実行間隔 最大値(秒)
AUTO_INTVL_MAX = 600
-- SYSLOGのレベル
LOG_LEVEL = "info"
-- SYSLOGのプレフィックス
LOG_PFX = "[Xpass]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- 新しい動的IPv6アドレスを取得する関数-
----------------------------------------
function get_addr(pfx)
local rtn, str, i, t, id, addr
for i = 1, GET_IP6_MAX do
-- 新しい動的IPv6アドレスを確認
rtn, str = rt.command(SHOW_IP6_CMD .. " | grep " .. pfx)
-- tentativeの場合、待機後に再確認
if rtn then
if str then
t = str:match("tentative")
if t == nil then
-- 有効の場合、新しい動的IPv6アドレスを生成されているためループを抜ける
break
end
end
end
-- 確認回数の上限を迎えた場合、終了
if i >= GET_IP6_MAX then
return
end
-- 2秒待機
rt.sleep(2)
end
-- インターフェースID部を取得
id = str:match(pfx .. "(.-)/(%d+)")
-- 新しい動的IPv6アドレスを生成
addr = pfx .. id
return addr
end
----------------------------------------
-- SYSLOGを出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, str, count, log, result, sleep_time, pfx, addr, return_watch
local req_t = {}
local res_t
--------------------
-- 初期化
math.randomseed(os.time())
--------------------
-- 監視
while true do
addr = nil
return_watch = 0
-- SYSLOGを監視する
rtn, str = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr ~= nil then
while true do
-- リトライ回数をリセット
count = RETRY_NUM
while true do
req_t = {
url = string.format("%s\?d=%s&p=%s&a=%s&u=%s", DDNS_SV, FQDN, DDNS_PASS, addr, DDNS_ID),
method = "GET",
auth_type = "basic",
auth_name = BASIC_ID,
auth_pass = BASIC_PASS
}
-- HTTPリクエストを実行
res_t = rt.httprequest(req_t)
log = string.format("アップデートサーバーへの通知を実行しました。(addr=%s)", addr)
logger(log)
-- リクエストに成功
if res_t.rtn1 then
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d)",
result, res_t.code)
logger(log)
-- ループを抜け、定期実行を行う
if res_t.code == 200 then
break
end
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- (RETRY_INTVL)秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、SYSLOGの監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
return_watch = 1
break
end
end
if return_watch == 1 then
break
end
-- 定期的に通知する
sleep_time = math.random(AUTO_INTVL_MIN, AUTO_INTVL_MAX)
rtn, str = rt.syslogwatch(LOG_PTN, 1, sleep_time)
-- パターンにマッチした
if rtn > 0 then
-- DAD処理中のため、2秒待機
rt.sleep(2)
-- マッチした文字列から新しいプレフィックスを取得
pfx = str[1]:match("Add%s+IPv6%s+prefix%s+(.-)::/(%d+)")
-- 新しい動的IPv6アドレスを取得
addr = get_addr(pfx)
if addr == nil then
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
break
end
end
end
else
logger("新しいIPv6アドレスを取得できなかったため、アップデートサーバーへの通知を中止しました。")
end
end
end
EOF
# 注意事項
# Luaスクリプトの最終行は EOF を改行した空行としてください。
# 最終行が EOF の場合、Luaスクリプトが最終行を認識できず、Luaスクリプトが動作しません。
|
(※) LAN1の接続機器がIPv6を使用せずIPv4通信のみを行う場合、以下は設定しないでください。
・ipv6 prefix 1 dhcp-prefix@lan2::/64
・ipv6 lan1 rtadv send 1 o_flag=on
・ipv6 lan1 dhcp service server