MAP-E (続)

前回の記事 ( MAP-Eあれこれ - Motoyuki's blog ) の続き。

MAP-EでのIPv4固定アドレスサービス

MAP-Eは複数ユーザで1つのIPv4アドレスの共有を可能にする仕組みですが、 1ユーザで1~8つの固定IPv4アドレスを提供するプロバイダもあります。 この場合、MAP-Eはポート変換を行わない単なるIPv4 over IPv6トンネルとして機能します。

つまり、IPv4 over IPv6トンネルのユーザ側 MAP CE (Customer Edge) と、 プロバイダ側 MAP BR (Border Relay) の2つのIPv6アドレスがわかれば FreeBSDの gif(1) が使えるはずです。

MAP CEのIPv6アドレスはIPv6 prefixなどから計算されますが、 この部分はRFC 7597の非公開のInternet draftに基づいているため、ネットを検索すると https://ipv4.web.fc2.com/map-e.html のサイトを参照しろという記事を多く見かけるわけですが、

OCN光 IPoE 固定IPv4アドレスサービスの場合

筆者はOCN光 IPoE IP8を契約してルータとしてYAMAHA NVR700-Wを利用していますが、 ルータの show status tunnel コマンドで得られるMAP CEのIPv6アドレスと、 https://ipv4.web.fc2.com/map-e.html のサイトで計算されるアドレスが異なるわけです。

ということで前回の記事 ( MAP-Eあれこれ - Motoyuki's blog ) に戻って Internet draft に基づいて MAP CE のアドレスを計算すると(draftの Example 4そのまま)、

IPv6 prefixが xxxx:xxxx:xxxx:xxxx::/56 IPv4固定アドレスが 192.0.2.1 (0xc0000201) の場合、MAP CEのIPv6アドレスは xxxx:xxxx:xxxx:xxxx:00c0:0002:0100:0000 となります。この値はYAMAHAのルータと同じでした。

OCN光IPoE IP8ではプロバイダ側からの説明にMAP BRアドレスの情報があるので、 これでMAP-EのIPv4 over IPv6トンネルの両端のIPv6アドレスがわかったことになります。

アドレス解決システム

NTTのフレッツ網ではIPv6 prefixは固定ではなく、メンテナンスなどの際に変わることがあります。 IPv6 prefixの変更がすぐにOCN側に通知されないという話で、IPv6 prefixが変わったときに 固定IPv4アドレスがしばらく使えなくなるようです(参考: ONU を交換したら MAP-E の固定 IPv4 が固定されなくなってしまった話 #Network - Qiita )。

この問題のために「アドレス解決システム」が用意されていて、

http(s)://[アドレス解決システムのURL]?hostname=[アドレス解決用ホスト名]

にアクセスすることでOCN側が変更を知ることができるということです。 YAMAHAのルータではLuaスクリプトでこの処理を行うようになっています。

アドレス解決システムのURLやアドレス解決用ホスト名、このURLにアクセスするための Basic認証のユーザ名とパスワードはOCN側からの説明に情報があります。

ひかり電話問題

ひかり電話対応については先人の知恵をお借りすることにします。

フレッツ光 ひかり電話を使いながら、IPoEのIPv6を自前ルータで直収する方法 - notokenの覚書

これで、FreeBSDでMAP-Eルータをつくるための情報が揃った、はずです。

MAP-Eあれこれ

NTTフレッツ網のIPoE接続で使われるMAP-Eトンネルのインターフェース識別子、 小川晃通氏らによる「徹底解説v6プラス」 https://www.jpix.ad.jp/files/v6plus-ebook.pdf では

この節で解説しているインターフェース識別子は、MAP-E の RFC である RFC 7597 に書いてある内容です。 v6 プラスでは、RFC になる前の提案文書である Internet Draft (draft-ietf-softwire-map)に記載されているインターフェース識別子を採用しています。 (中略) v6 プラスが採用している Internet Draft のバージョンは非公開であるため、本書では v6 プラスで利用しているインターフェース識別子の具体的なフォーマットを割愛しています。

とある。非公開なせいか、非公開情報をもとに自動的に計算してくれるサイト https://ipv4.web.fc2.com/map-e.html がよく利用されている。

検索してでてくる「IPv6家庭用ルータガイドライン 第3.0版」 https://www.jaipa.or.jp/guideline/pdf/v6hgw_Guideline_3.0.pdf をみると

国内サービスでは、RFC7597 ではなく draft-ietf-softwire-map-03 が使用されている。

とあるので、使用されているdraftの具体的なバージョンもわかった。

IETF自身がdraft-ietf-softwire-map-03を公開しているし、正式版 RFC7597との差分もわかる。 datatracker.ietf.org

IETF自身がdraftを公開しているのだから、 インターフェース識別子の具体的なフォーマットを解説した「徹底解説v6プラス」の改訂版が欲しいところ。

今日のところはここまで。

FreeBSD: setfibで複数の経路表を使う

FreeBSDではsetfib(1)を使って複数の経路を使い分けることができる。 FIBの仕組みについては下記の記事で許さんが解説されているので参照していただくとして、 FreeBSD 14.2ではまったので記録しておく。

FreeBSDにおけるFIB [Share FreeBSD based information]

インターフェースへの経路

net.add_addr_allfibsのデフォルトは0に変わっているので、/boot/loader.confで

net.fibs="2"
net.add_addr_allfibs="1"

と書かないとFIBが0以外の場合にインターフェースへの経路が自動的に追加されない。

net.add_addr_allfibsを1に設定しても、

% netstat -rn4 -F 1
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags         Netif Expire
127.0.0.1          link#3             UH              lo0
172.26.xxx.0/24    link#2             U               re1
192.168.xx.0/24    link#1             U               re0

と自分のアドレスへの経路が追加されない。このため、/etc/rc.confで

static_routes="re0 re1"
route_re0="-host 192.168.xx.x -iface lo0 -fib 1"
route_re1="-host 172.26.xxx.xx -iface lo0 -fib 1"

と明示的に設定する必要がある。

% netstat -rn4 -F 1
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags         Netif Expire
127.0.0.1          link#3             UH              lo0
172.26.xxx.0/24    link#2             U               re1
172.26.xxx.xx      link#3             UHS             lo0
192.168.xx.0/24    link#1             U               re0
192.168.xx.x       link#3             UHS             lo0

default route設定がエラーになる

FIBが0以外の場合のdefault routeは/etc/rc.confで

defaultrouter_fib1="172.26.xxx.1"

とすればいいはずだが、route(8)が Invalid argument のエラーで設定できないことがある。

# route add default 172.26.xxx.1 -fib 1
add net default: gateway 172.26.xxx.1 fib 1: Invalid argument

同様の問題はFreeBSD bugzillaなどでもいくつか報告がある。

私が試した範囲では、 default routeを設定しようとしたインターフェースのstatusがactiveではないときにこの問題が発生した。 適当なswitchなどにつないでactiveにすれば大丈夫らしい。

# route add default 172.26.xxx.1 -fib 1
add net default: gateway 172.26.xxx.1 fib 1

ネットワークに接続しない状態で設定を試していたので、 これに気付くまで無駄な時間をかなり費やしてしまいました...。

FreeBSD: setfibで複数の経路表を使う

FreeBSDではsetfib(1)を使って複数の経路を使い分けることができる。 FIBの仕組みについては下記の記事で許さんが解説されているので参照していただくとして、 FreeBSD 14.2ではまったので記録しておく。

freebsd.seirios.org

インターフェースへの経路

net.add_addr_allfibsのデフォルトは0に変わっているので、/boot/loader.confで

net.fibs="2"
net.add_addr_allfibs="1"

と書かないとFIBが0以外の場合にインターフェースへの経路が自動的に追加されない。

net.add_addr_allfibsを1に設定しても、

% netstat -rn4 -F 1
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags         Netif Expire
127.0.0.1          link#3             UH              lo0
172.26.xxx.0/24    link#2             U               re1
192.168.xx.0/24    link#1             U               re0

と自分のアドレスへの経路が追加されない。このため、/etc/rc.confで

static_routes="re0 re1"
route_re0="-host 192.168.xx.x -iface lo0 -fib 1"
route_re1="-host 172.26.xxx.xx -iface lo0 -fib 1"

と明示的に設定する必要がある。

% netstat -rn4 -F 1
Routing tables (fib: 1)

Internet:
Destination        Gateway            Flags         Netif Expire
127.0.0.1          link#3             UH              lo0
172.26.xxx.0/24    link#2             U               re1
172.26.xxx.xx      link#3             UHS             lo0
192.168.xx.0/24    link#1             U               re0
192.168.xx.x       link#3             UHS             lo0

default route設定がエラーになる

FIBが0以外の場合のdefault routeは/etc/rc.confで

defaultrouter_fib1="172.26.xxx.1"

とすればいいはずだが、route(8)が Invalid argument のエラーで設定できないことがある。

# route add default 172.26.xxx.1 -fib 1
add net default: gateway 172.26.xxx.1 fib 1: Invalid argument

同様の問題はFreeBSD bugzillaなどでもいくつか報告がある。

私が試した範囲では、 default routeを設定しようとしたインターフェースのstatusがactiveではないときにこの問題が発生した。 適当なswitchなどにつないでactiveにすれば大丈夫らしい。

# route add default 172.26.xxx.1 -fib 1
add net default: gateway 172.26.xxx.1 fib 1

ネットワークに接続しない状態で設定を試していたので、 これに気付くまで無駄な時間をかなり費やしてしまいました...。

Aruba Instant On の不具合

不具合

しばらく前に自宅ネットワークのスイッチ (以下 SW) と無線LANアクセスポイント (以下 AP) をHPEの Aruba Instant On に入れ替えた。 スマートホンのアプリを使ってリモートから自宅ネットワークの状況の確認やメンテができるので 便利に使っていたのだけど、先月半ば頃からおかしな挙動がでてきた。

  • 外部への接続が遮断されて復活するときに SW - AP - 別のAP - SW というループが発生することがある。 他のAPを上流とするAPは有線 port が機能しない仕様なので、本来であれば起きるはずがない現象。
  • 1日に数回 SW や AP が offline になって通信できなくなる。数分程度で復活する。

SW や AP が offline になるという現象は他でも起きているようで、 Aruba Instant On offline で検索 するといくつか出てくる。でも「サポートに連絡」だけで解決方法の情報はない。

解決

ふと、家の SW や AP のうち最初に使い始めた AP を別な場所に異動させようと思って一時的に外したところ 問題が解決してしまった。

考察

HPE Aruba の無線 LAN アクセスポイントには Aruba Instant On と仮想コントローラ対応の Aruba Instant AP (unified AP とも言う) という二つの製品ラインがある。 この二つは少なくとも一部の製品についてはハードウェアはほぼ共通で、 Instant On の AP である AP11 をファームウェア書き換えで unified AP として使うことが可能。 システム的にも似通ったものと想像できる。 v2n.hatenablog.com

後者の仮想コントローラ型 AP システムの場合、

  • 最初に 1 つの AP を設定する。この AP が仮想コントローラとして機能する。
  • 仮想コントローラの AP と同一の有線ネットワークに AP を追加すると自動的に無線クラスタに AP が追加される。
  • 仮想コントローラの AP が電源オフなどで offline になった場合、他の AP が自動的に仮想コントローラを引き継ぐ。

という動作になる。 追加した AP は broadcast で仮想コントーラの AP を見つけてそこから情報をもらって自動的に設定していると 考えられる。

Aruba Instant On も同じようなシステムと考えると、

  • 最初に設定した AP がコントローラとして動作していた。
  • 何らかの理由でコントローラの AP の動作がおかしくなった。
  • AP を再起動しても不具合は解消されなかったので、 AP 内部の不揮発性メモリに記録された情報がおかしくなった可能性が考えられる。
  • 不具合の原因となった AP を Instant On のクラスタから外すことで、他の SW か AP がコントローラを引き継いだ。
  • 新しいコントローラには不具合の原因までは引き継がれなかったので問題は解決した。

というシナリオだろうか。あくまでも想像レベルだけど。

ただ、 (不具合が解消した際に) コントローラの役割を引き継いだ AP なり SW を調べる方法がない (Instant AP のシステムであれば仮想コントローラに指定した IP アドレスをどの AP が持っているか調べればいい)。

zfs replace

実家に置いてあるサーバは6TBのハードディスク4台でFreeBSDzfsでraidzを組んでいるのですが、 しばらく前から1台がエラーを出すようになっていたので同容量の新しいディスクを買って入れ替えました。 hot swapには対応していないハードなので電源落として入れ替えてから zpool replace するだけですが、 resilverに3日近くかかるのか…。

AMD Turion II Neo N54L Dual-Core という大昔の遅いCPU(むかし流行したHP Microserver)なのが原因ですかね。

motoyuki% zpool status -v
  pool: zdata
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Tue Nov  1 23:09:18 2022
        1.98T scanned at 62.1M/s, 1.49T issued at 46.7M/s, 9.94T total
        363G resilvered, 14.94% done, 2 days 04:46:54 to go
config:

        NAME                             STATE     READ WRITE CKSUM
        zdata                            DEGRADED     0     0     0
          raidz1-0                       DEGRADED     0     0     0
            diskid/DISK-WD-WX61D68AARTA  ONLINE       0     0     0
            replacing-1                  DEGRADED     0     0     0
              15225623215183088814       UNAVAIL      0     0     0  was /dev/diskid/DISK-WD-WX51D583K0PC
              ada2                       ONLINE       0     0     0  (resilvering)
            diskid/DISK-WD-WX51D68AP748  ONLINE       0     0     0
            diskid/DISK-WD-WX61D686F8F2  ONLINE       0     0     0

errors: No known data errors