【RTX830】V6プラスで固定IPとMAP-Eを共存させた【令和最新版】

スポンサーリンク

こちらの記事は以前書いた記事のリプレース記事になります。

【RTX830】V6プラスで固定IPとMAP-Eを共存させた(MAP-EをIPIPトンネルで構築)
2023年11月22日追記:固定用IPIPトンネルとMAP-Eトンネルを共存できる記事を投稿いたしました。こちらをご参照ください。 はじめに 先日、OCNひかりからenひかり(V6プラス回線)に乗り換えをしました。 RTX830でMAP-E...

はじめに

先日、書いた記事の修正版になります。

RTX830でMAP-Eトンネルと固定IPのIPIPトンネルがYAMAHAに記載のConfig例では共存できませんでしたが、少し一工夫を行うことで共存することができたお話です。

あくまで一例として参考程度にお願い致します。

Config設定環境

  • ひかり電話契約回線(DHCPv6-PD)にてONU配下にRTX830を設置しています。
    • HGW配下に置く場合やひかり電話未契約の場合はRAプロキシになります。たぶんRAプロキシでも可能だと思います。
  • tunnel 1を固定IPのIPIPトンネル、tunnel 2をV6プラスのMAP-Eトンネルを構成します。
  • NTT側の都合でIPv6のprefixが変わった場合、V6プラスではアップデートサーバーにIPv6アドレスを通知する必要がありますが、YAMAHA作成のLuaスクリプトが動作するかどうかは確認しておりません。
  • VLANは使用せずに、IPフィルターを利用しトンネルの矛先を変えています。
  • GUIでV6プラスの設定を行うと、WAN/TUNNELが統合して表示されてしまい、これが原因でGUIの表示がバグったり、正常に通信ができなくなる状態を確認しました。また、GUIでは設定できない項目もあるため、今回はCUIでのConfig例のみとなります。ご了承ください。
  • YAMAHAのサポートセンターの見解によると、V6プラスの固定IPとMAP-Eの併用は動作保証をしていないらしいです。なので、自己責任でお願い致します。

設定する項目及び順番

  1. IPv6アドレスの設定及びフィルター設定
  2. 固定IPv4アドレス側のIPIPトンネルをトンネル及びフィルター設定
  3. MAP-Eトンネルの設定及びフィルター設定

参考にさせていただいたサイト

今回は、YAMAHAの公式文書を参考にさせていただきました。

v6プラス対応機能
IPIPトンネリング
14.8 自分側トンネルインタフェースの端点 IP アドレスの設定

固定IPv4アドレス側の設定

はじめに、IPv6の設定を行います。

また、固定IPはIPv4 over IPv6 のIPIPトンネルを使用します。

IPv6の設定

固定IPを使用するIPIPトンネルでは通信を行うIPv6アドレスが指定されています。

そのため、LAN2で取得したIPv6プレフィックスにインターフェースIDを設定し、そのIPv6アドレスをLAN1に設定します。その他、通常利用するIPv6アドレスをDHCPで配布する設定を行います。

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にLAN2で取得したプレフィックスにインターフェースIDを合わせたIPv6アドレスが生成されていたらOKです。また、この生成されたIPv6アドレスは次のIPIPトンネルの設定で利用するため、控えてください。

またこのようにルーターで設定されたIPv6アドレスのことをCEアドレスと呼びます。

※違ってたらごめんなさい。

※この画面はすでに設定済みの画面のため、2つのグローバルIPv6アドレスが設定されています。

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 address2404:9200:225:100::65

tunnel endpoint local addressでCEアドレスを指定しないと、後で設定するMAP-Eトンネルを作った際に、通信するIPv6アドレスがMAP-Eトンネル側に引っ張られてしまい、固定IP側のトンネルで正常に通信を行うことができなくなります。

また、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トンネルを作ります。

作成の前にLAN1側にIPv6アドレスをもう1つ設定します。

MAP-Eトンネルでは、MAP-Eトンネル用に自動的にIPv6アドレス計算して設定するため作成する必要はありませんが、なんか気分的に作っておくといいと思います。

#LAN1にLAN2で取得したプレフィックスに1をつけてIPv6を作ります。ここは任意で変更可能の部分になります。
ipv6 lan1 address dhcp-prefix@lan2::1/64

設定が完了したら、show ipv6 addressでLAN1にアドレスが設定されていることを確認します。

MAP-E用のIPIPトンネルの設定

MAP-E用のIPIPトンネルを作成します。

tunnel select 2
 description tunnel v6plus
 tunnel encapsulation map-e
 tunnel map-e type v6plus
 ip tunnel mtu 1460
 ip tunnel nat descriptor 2
tunnel enable 2

MAP-E用のNATディスクリプターを作成します。

nat descriptor type 2 masquerade
nat descriptor address outer 2 map-e

最後にデフォルトゲートウェイをMAP-E側にし、接続テストを行い正常にアクセスできるのであれば、設定は完了です。

ip route default gateway tunnel 1 filter 500001 gateway tunnel 2

まとめ

今回はv6プラスの固定IPとMAP-Eが共存できる設定をお伝えしました。

懸念点があるとしたら、IPv6のプレフィックスが変更された場合tunnel endpoint local addressが固定されてしまっているため、これは追従してくれないのかな~って感じです。

まぁ、変わったらで変えればいいだけなのですが…。もしかしたら別にいい方法があるかもしれないので一応参考程度までにお願い致します。

誰かの参考になれば幸いです。

コメント

タイトルとURLをコピーしました