はじめに
先日、OCNひかりからenひかり(V6プラス回線)に乗り換えをしました。
RTX830でMAP-Eトンネルと固定IPのIPIPトンネルがYAMAHAに記載のConfig例では共存できませんでしたが、なんとか強引にやることで一応共存できたお話です。
恐らくですが、IPv6周りの設定でうまいことを行く方法が他にもあるのではないかとは思ってはいますが…。
あくまで一例として参考程度にお願い致します。
Config設定条件
- ひかり電話契約回線(DHCPv6-PD)にてONU配下にRTX830を設置しています。
- HGW配下に置く場合やひかり電話未契約の場合はRAプロキシになります。たぶんRAプロキシでも可能だと思います。
- tunnel 1を固定IPのIPIPトンネル、tunnel 2をV6プラスのMAP-Eトンネルを構成します。
- このMAP-EトンネルはIPIPトンネルとして構成します。
- NTT側の都合でIPv6のprefixが変わった場合、V6プラスではアップデートサーバーにIPv6アドレスを通知する必要がありますが、YAMAHA作成のLuaスクリプトが動作するかどうかは確認しておりません。
- VLANは使用せずに、IPフィルターを利用しトンネルの矛先を変えています。
- GUIでV6プラスの設定を行うと、WAN/TUNNELが統合して表示されてしまい、これが原因でGUIの表示がバグったり、正常に通信ができなくなる状態を確認しました。また、GUIでは設定できない項目もあるため、今回はCUIでのConfig例のみとなります。ご了承ください。
- YAMAHAのサポートセンターの見解によると、V6プラスの固定IPとMAP-Eの併用は動作保証をしていないらしいです。なので、自己責任でお願い致します。
設定する項目及び順番
- IPv6アドレスの設定及びフィルター設定
- 固定IPv4アドレス側のIPIPトンネルをトンネル及びフィルター設定
- MAP-E側のIPv6アドレスを設定するためのMAP-EのCEアドレス計算とポートの計算を行う。
- MAP-E側のIPv6アドレスの追加、MAP-E側のIPIPトンネル及びフィルター設定
参考にさせていただいたサイト
今回は以下のサイト及び、YAMAHAの公式文書を参考にさせていただきました。
固定IPv4アドレス側の設定
はじめに、IPv6の設定を行います。
また、固定IPはIPv4 over IPv6 のIPIPトンネルを使用します。
IPv6の設定
固定IPを使用するIPIPトンネルでは通信を行うIPv6アドレスが指定されています。
そのため、LAN2で取得したIPv6プレフィックスにインターフェースIDを設定し、そのIPv6アドレスをLAN1に設定します。その他、通常利用するIPv6アドレスをDHCPで配布する設定を行います。
また、デフォルトゲートウェイは後でMAP-Eアドレスの計算を行うサイトへアクセスするため、tunnel1にしておきます。(後ほどIPフィルターでの設定を入れます。)
ipv6 route default gateway dhcp lan2
ipv6 prefix 1 dhcp-prefix@lan2::/64
ip route default gateway tunnel 1
ip lan1 address [ルーターのアドレス]/24
ip lan1 proxyarp on
#LAN1にLAN2で取得したプレフィックスに固定IPのインターフェースIDを設定
ipv6 lan1 address dhcp-prefix@lan2::[インターフェースID]/64
ipv6 lan1 prefix change log on
ipv6 lan1 rtadv send 1 o_flag=on
#通常利用するIPv6アドレスのDHCP設定
ipv6 lan1 dhcp service server
ipv6 lan2 address dhcp
ipv6 lan2 dhcp service client
#NGNタイプの設定
ngn type lan2 ntt
description lan2 NTT-West
lan linkup send-wait-time lan2 5
#IPフィルターの設定
ip filter 500001 pass 192.168.1.254 * * * *
#IPv6のフィルター設定
ipv6 lan2 secure filter in 1010 1011 1012 1013 1040 1041 1042
ipv6 lan2 secure filter out 3000 dynamic 100 101 102 103 104 105 118 119
ipv6 filter 1010 pass * * icmp6 * *
ipv6 filter 1011 pass * * tcp * ident
ipv6 filter 1012 pass * * udp * 546
ipv6 filter 1013 pass * * 4
ipv6 filter 1040 pass * * udp * 500
ipv6 filter 1041 pass * * esp
ipv6 filter 1042 pass * * udp * 4500
ipv6 filter 3000 pass * * * * *
ipv6 filter dynamic 100 * * ftp
ipv6 filter dynamic 101 * * domain
ipv6 filter dynamic 102 * * www
ipv6 filter dynamic 103 * * smtp
ipv6 filter dynamic 104 * * pop3
ipv6 filter dynamic 105 * * submission
ipv6 filter dynamic 118 * * tcp
ipv6 filter dynamic 119 * * udp
設定が完了したら show ipv6 address を使って、LAN1にIPv6プレフィックスとインターフェースIDを合わせたIPv6アドレスが生成されていたらOKです。また、この生成されたIPv6アドレスは次のIPIPトンネルの設定で利用するため、控えてください。
またこのようにルーターで設定されたIPv6アドレスのことをCEアドレスと呼びます。
※違ってたらごめんなさい。
DNS設定
DNSはIPv4、IPv6それぞれ設定します。DNSサーバーはCloudflareの無料DNSを使用しています。
dns host lan1
dns service recursive
dns server 1.1.1.1 1.0.0.1
dns server select 500000 2606:4700:4700::1111 2606:4700:4700::1001 aaaa .
dns private address spoof on
固定IP用のIPIPトンネルの設定
続いて、固定IP用のIPIPトンネルの設定を行います。
このIPIPトンネルではtunnel endpoint addressをこのように設定します。
tunnel endpoint local address | 先程控えたCEアドレス |
tunnel endpoint remote address | 2404:9200:225:100::65 |
また、tunnel endpoint address [CEアドレス] [BRアドレス] でも同様に設定できます。
tunnel select 1
description tunnel v6plus_fix
tunnel encapsulation ipip
tunnel endpoint local address [CEアドレス]
tunnel endpoint remote address 2404:9200:225:100::65
ip tunnel mtu 1460
ip tunnel nat descriptor 1
tunnel enable 1
NATディスクリプターは指定されている固定IPv4アドレスを対外アドレスを設定します。
IPフィルターは個々の判断でお好みで設定してください。(YAMAHAにあるIPフィルターをベースに入れれればいいと思います。)
nat descriptor type 1 masquerade
nat descriptor address outer 1 [固定IPv4アドレス]
nat descriptor masquerade incoming 1 reject
show status tunnel 1で接続されていることを確認したら、問題なく動作しています。
また、IPIPトンネルの仕様上、接続されるされてない関係なくリンクアップしているため、確認くん等で正常にIPv4アドレスの通信ができるかどうかを確認する必要があります。
次に固定IP用のLuaスクリプトを設定します。これはヤマハ公式のものをそのまま流用します。(そのほうが楽)
アップデートサーバーは「http://fcs.enabler.ne.jp/update」を設定しその他は指定されたユーザ名・パスワードを指定します。
<<EOF
--[[
■ v6プラス IPv6 アドレス通知用 サンプルスクリプト
Ver. 1.00
2021.03.16 ヤマハ株式会社
本スクリプトは、 v6プラスの固定 IP サービス において、
指定したインターフェースに新しい IPv6 プレフィックスが付与されたとき、
アップデートサーバーに IPv6 アドレスの更新通知を行う Lua スクリプト
のサンプルです。
新しい IPv6 プレフィックスが付与されたことは、ルーターの SYSLOG を監視し、以下
のログが出力された場合に検知しています。
( IPv6 アドレスが LAN1 に設定されている場合の例 )
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by DHCPv6
Add IPv6 prefix xxxx:xxxx:xxxx:xxxx::/xx (Lifetime: xxxxxx) via LAN1 by RA
以下のコマンドが設定されていないと、上記ログは出力されないため、
必ず設定するようにしてください。
ipv6 lan1 prefix change log on
[ 注意事項 ]
・本スクリプトは、 schedule at コマンドでルーターの起動時に実行されるようにし
てください。
・スクリプト中の「設定値」の値は、ご使用の環境に応じて変更した上でご使用く
ださい。
[ 更新履歴 ]
2021.03.16 Ver.1.00 初版作成
]]
----------------------------------------
-- 設定値 --
----------------------------------------
-- アップデートサーバーの URL
UPD_SV = "http://fcs.enabler.ne.jp/update"
-- ユーザー名
USERNAME = "ユーザー名"
-- パスワード
PASSWORD = "パスワード"
-- IPv6 アドレスを設定するインターフェース名
IPv6_IF = "LAN1"
-- IPv6 プレフィックスが追加されたときの
-- SYSLOG パターン
LOG_PTN = "Add%s+IPv6%s+prefix.+%(Lifetime%:%s+%d+%)%s+via%s+" .. IPv6_IF .. "%s+by"
-- リトライの間隔 ( s )
RETRY_INTVL = 10
-- リトライ回数
RETRY_NUM = 3
-- SYSLOG のレベル
LOG_LEVEL = "info"
-- SYSLOG のプレフィックス
LOG_PFX = "[v6plus]"
-- 通知失敗時のメッセージ
FAIL_MSG = "アップデートサーバーへの通知に失敗しました。 (リトライ: 残り%d回)"
----------------------------------------
-- SYSLOG を出力する関数 --
----------------------------------------
function logger(msg)
rt.syslog(LOG_LEVEL, string.format("%s %s", LOG_PFX, msg))
end
----------------------------------------
-- メインルーチン --
----------------------------------------
local rtn, count, log, result
local req_t = {}
local res_t
--------------------
-- 初期化
-- HTTP リクエストの準備
req_t.url = string.format("%s?user=%s&pass=%s", UPD_SV,
USERNAME, PASSWORD)
req_t.method = "GET"
--------------------
-- 監視
while true do
-- SYSLOG を監視する
rtn = rt.syslogwatch(LOG_PTN)
-- パターンにマッチした
if rtn then
-- リトライ回数をリセット
count = RETRY_NUM
while true do
-- HTTP リクエストを実行
res_t = rt.httprequest(req_t)
if res_t.rtn1 then
-- リクエストに成功
logger("アップデートサーバーへの通知を実行しました。")
-- アップデートの結果をログに出力する
if res_t.code == 200 then
result = "成功"
else
result = "失敗"
end
log = string.format("アップデートに%sしました。(code=%d, body=%s)",
result, res_t.code, res_t.body)
logger(log)
-- ループを抜け、 SYSLOG の監視を再開する
break
end
-- リクエストに失敗
count = count - 1
if count > 0 then
-- ( RETRY_INTVL ) 秒後、リトライ
logger(string.format(FAIL_MSG, count))
rt.sleep(RETRY_INTVL)
else
-- リトライ上限を超えたので諦め、 SYSLOG の監視を再開する
logger("アップデートサーバーへの通知に失敗しました。")
break
end
end
end
end
EOF
入力が終わったらluaスクリプトをtftp等でルーターに転送しスケジューリングをします。
schedule at 1 startup * lua emfs:/v6plus_address_notification.lua
MAP-E側の設定
続いてMAP-E側の設定を行います。
通常はMAP-Eを使ったIPv4 over IPv6のIPIPトンネルを作るのですが、これが原因で両立することはできません。
YAMAHAが用意してくれたMAP-Eトンネルは使えない
恐らくですが、通信を行うCEアドレスがMAP-Eトンネルの場合自動的に計算をしてくれるため、その何らかの関係で固定IP側のCEアドレスも引っ張られるのではないかと推測します。
MAP-Eトンネルは全自動でIPv4アドレスとポート範囲、CEアドレス、BRアドレスを計算してくれるため、すごく楽でそっちの方がいいのですが、使えないため手動で計算を行ったIPIPトンネルを形成します。
MAP-EのIPv4アドレス、ポート範囲、CEアドレスの計算を行う
IPv6アドレスをベースに計算を行ってくれるとても便利なサイトがあります。
IPv6アドレス確認サイトでIPv6アドレスを確認し、そのアドレスををこのサイトに放り込んだら、自動的にすべて計算してくれます。この結果をベースにMAP-Eトンネルを形成します。
また、もう一つの方法として、一旦MAP-Eトンネルを作ると自動的にIPv4アドレスと、ポートレンジがログに表示されるのでそれを利用するのもありです。
LAN1にMAP-E用のIPv6アドレスを設定する。
上記サイトで生成したCEアドレスになるように、LAN2で取得したIPv6プレフィックスとCEアドレスのインターフェースIDを追加しLAN1に設定します。
#LAN1にLAN2で取得したアドレスにMAP-Eトンネル側のインターフェースIDを設定
ipv6 lan1 address dhcp-prefix@lan2::e:df1:a000:9800/64
設定が完了したら、show ipv6 addressでLAN1にアドレスが設定されていることを確認します。
LAN1に2つ登録されている状態を確認したらMAP-E側のインターフェースIDが乗っているIPv6アドレスを控えます。
MAP-E用のIPIPトンネルの設定
MAP-E用のIPIPトンネルを作成します。
MAP-Eではポート範囲が決められており、先程計算したポートをベースに、NAT ディスクリプターを設定します。
tunnel endpoint local address | 先程計算したCEアドレス |
tunnel endpoint remote address | 2404:9200:225:100::64 |
tunnel select 2
description tunnel v6plus
tunnel encapsulation ipip
tunnel endpoint local address [MAP-Eで計算したCEアドレス]
tunnel endpoint remote address 2404:9200:225:100::64
ip tunnel nat descriptor 2
ip tunnel tcp mss limit 1420
tunnel enable 2
NATディスクリプターでMAP-Eで計算したIPv4アドレスと計算したポートを指定します。
nat descriptor type 2 masquerade
nat descriptor address outer 2 [MAP-Eで計算したIPv4アドレス]
nat descriptor masquerade incoming 2 reject
nat descriptor masquerade port range 2 [PortRange1] [PortRange2] [PortRange3]…[PortRange15]
最後にデフォルトゲートウェイをMAP-E側にし、接続テストを行い正常にアクセスできるのであれば、設定は完了です。
ip route default gateway tunnel 1 filter 500001 gateway tunnel 2
まとめ
今回はMAP-EをIPIPトンネルにて手動で設定することで、MAP-Eと固定IPの両方を併用することができたという方法をお伝えしました。
QiitaでRTX1300でMAP-Eトンネルと固定IPを同時に張れたという記事があったため、それができなかったため今回MAP-Eを手動で張ったという形になります。
懸念点があるとしたら、IPv6のプレフィックスが変更された場合tunnel endpoint local addressが固定されてしまっているため、これは追従してくれないのかな~って感じです。
まぁ、変わったらで変えればいいだけなのですが…。もしかしたら別にいい方法があるかもしれないので一応参考程度までにお願い致します。
誰かの参考になれば幸いです。
コメント