IIJmioひかりへ事業者変更 RouterOSでDS-Lite

引っ越し先でのネットワーク環境整備: MAP-E という記事で、DTI光に契約したことを書きましたが、MAP-E接続にハマりMikroTik RB4011iGS+RMを有効活用できないまま半年が経過してしまいました。

RouterOSでMAP-E接続の試み

MAP-E(OCNバーチャルコネクト)で通信できるように、例の計算機の力を借りながら、下のようなスクリプトでマッピングルールに従ったNAPTを設定してIPIP6トンネルへ流し込むなどあれこれ試してみたのですが、どうにもうまくいかず。 パケットキャプチャして見ていると、BRに向けて正しそうなパケットを投げているはずなのですが、何も返ってこない……。

/interface ipipv6
add name=ipipv6-ocnvc mtu=1460 local-address=<CE IPv6 address> remote-address=2001:380:a120::9

:global addNatRules do={
  # Args: $PSID $v4Addr $outInterface
  :for i from=1 to=63 do={
    :local portStart ((i << 10) | ([:tonum $PSID] << 4))
    :local portEnd   ($portStart + 15)
    :local portRange "$portStart-$portEnd"

    /ip firewall nat add chain="srcnat" action=masquerade protocol=tcp nth=63,$i \
      to-address=$v4Addr to-ports=$portRange out-interface=$outInterface
    /ip firewall nat add chain="srcnat" action=masquerade protocol=udp nth=63,$i \
      to-address=$v4Addr to-ports=$portRange out-interface=$outInterface
  }
}

$addNatRules PSID=<assigned PSID> v4Addr=<assigned IPv4 address> outInterface=ipipv6-ocnvc

結局諦めて、BUFFALO WSR-2533DHP2をルータにして運用していました。

しばらくはこれで使っていたのですが、5〜6月にOCNバーチャルコネクトでの通信速度の低下が目立つようになり、在宅勤務に若干支障が出始めていました。DTI光の「IPv6(IPoE)接続サービス」は、契約時期によってVNE(OCNバーチャルコネクト or v6プラス)が異なるのですが、各所での報告を見るとOCNバーチャルコネクトのみ速度低下が顕著に現れているようでした。PPPoEは言わずもがななので、もう人権がありません。

成功したとの報告あり

2021/06/18追記

Qiita: RouterOSでフレッツのv6プラス(MAP-E)を利用する

こちらの記事を参考にしていただいたようで、うまく動いたとの報告です。私の環境との違いは主に以下あたりでしょうか。

  • RouterOS 6.46.x (当時のstable最新を使っていたはず)
  • change-mss のmangle設定なし
  • 設定変更後、再起動して検証してなかったかも

指摘いただいた nth の指定について、完全に誤解していたのでスクリプトを修正しました。

IIJmioひかりへ

DTI光のキャッシュバックも振り込まれたし、他のISPに移るには良い時期だと思いまして、RouterOSで動作実績のあるDS-Lite(transix)採用のIIJmioひかりに事業者変更することにしました。

コラボ光での事業者変更は初めてのことでしたし、VNEの切り替えも伴うため、少し手間取ってしまいました。

申し込みから時系列に整理すると以下の通り。

2020/07/06 DTI光 事業者変更承諾番号発行
2020/07/07 IIJmioひかり 事業者変更申し込み
2020/07/11 ひかりプロビジョニングセンターから電話
2020/07/14 IIJmioひかり 回線開通日
2020/07/15 「回線開通のお知らせ」メール受信
2020/07/16 IIJmioひかり IPoEオプション申し込み
DTI「退会手続き受け付けのお知らせ」メール受信
2020/07/17 DTIサポートへ「IPv6(IPoE)接続サービス」の即時廃止を依頼
2020/07/20 昼過ぎ頃にOCNバーチャルコネクトから切断されたことを確認
IIJサポートへその旨を連絡
2020/07/21 「IPv6 IPoEオプションご利用開始日確定のお知らせ」メール受信
2020/07/22 transix接続確立確認

DTI光が月末解約扱いということに7/16のメールで気づき、「IPv6(IPoE)接続サービス」をすぐに廃止してほしい旨を連絡したのですが、もっと早く連絡していればIIJ側でより早くVNE切り替え・transix開通できたと思います。このあたりの仕組みをよく理解していなかったのが反省点です。

RouterOSでDS-Lite

ひかり電話なしの環境なので、RAで/64のプレフィックスが払い出されることを理解していれば、設定自体は難しくありませんでした。

以下のブログ記事の内容そのままです。

ねころくぶろぐ: RouterBoardでDS-LITE

PPPoEとの併用

DS-LiteはISP側のルータ(AFTR; Address Family Transition Router)でNAPTされるため、自由にポート開放ができません。MAP-Eではマッピングされたポートについては自由に扱えるため、自宅サーバへのアクセスを実現できていたのですが、今回は別の方法を考えなければいけません。
(もちろんグローバルIPv6アドレスで公開することはできるが、出先ではIPv4のみの環境も多いため、IPv4アドレスでのアクセス手段を考える)

どこかのVPSを踏み台にして自宅とVPNを張っておく、という手段もありますが、IIJmioひかりはIPv4 PPPoE接続も併用できるので、こちらを使うことに。DTI光では「IPv6(IPoE)接続サービス」が開通すると、IPv4 PPPoE接続は自動的に廃止され併用できない仕様だったので……。

PPPoEとの併用にあたって、以下のような設定を行いました。(PPPoE接続のセットアップ自体は特に悩むところはないので割愛)

PPPoE経由のpolicy-based routing

PPPoEから入ってきた接続にmangleでrouting-markを付け、デフォルトのtransix向けIPIP6トンネルではなく、PPPoEへルーティングするように設定します。

以下は、PPPoEから入ってきたtcp/10022ポート宛を自宅鯖192.168.88.100のtcp/22へdst-natする想定での例です。

/ip firewall mangle
add action=mark-connection chain=prerouting connection-mark=no-mark connection-state=new in-interface=pppoe-iijmio new-connection-mark=pppoe-iijmio passthrough=yes
add action=mark-routing chain=prerouting connection-mark=pppoe-iijmio dst-address-type=!local in-interface-list=LAN new-routing-mark=ppoe-iijmio passthrough=no
/ip firewall nat
add action=masquerade chain=srcnat out-interface=pppoe-iijmio
add action=dst-nat chain=dstnat dst-port=10022 in-interface=pppoe-iijmio protocol=tcp to-addresses=192.168.88.100 to-ports=22
/ip route
add comment="PPPoE-IIJmio connection" distance=1 gateway=pppoe-iijmio routing-mark=ppoe-iijmio
add comment=transix distance=2 gateway=ipipv6-transix

これでイケる!と思って、試しに外からSSH接続してみると、接続は確立するものの、ブラジルのサーバと通信しているのかってくらいパケロスの大きい回線を使っているような状態でした。

あれこれ原因調査をしていると、redditで以下の質問を見つけました。これを読むと、どうやらpolicy-based routingしようとしているパケットをfasttrackしてしまうとマズイっぽい。

reddit: My routing mangle rules dont work.

デフォルトではfilterルールに以下のようなルールが入っているけど、

/ip firewall filter
add chain=forward action=fasttrack-connection connection-state=established,related

connection-mark=no-markに限定して適用するように修正すればOK

/ip firewall filter
add action=fasttrack-connection chain=forward connection-mark=no-mark connection-state=established,related

このルールがどの程度パフォーマンス的に影響があるか評価してないですが、上限100MbpsのVDSLである我が家で問題になることはないでしょう。

DDNSのIPアドレス

RouterOSにはCloudサービスとしてDDNS機能が提供されています。*.sn.mynetname.netというホスト名が与えられて参照解決できるようになるのですが、複数のPublic IPアドレスを持つことを想定していません。

とりあえずDDNSの更新サーバへ通信する時のIPアドレスが登録されるっぽいので、そのままだとデフォルトゲートウェイのtransix側のIPアドレスが登録されてしまいます。外部から自宅へアクセスする目的なので、PPPoEのIPアドレスが登録されるようにします。

MikroTIkのDDNS更新用サーバはcloud2.mikrotik.comと書いてあるので、こいつへのアクセスはPPPoE経由になるようスタティックルートを設定してあげます。
(今後、更新用サーバのIPアドレスが変わるかもしれない点は要注意)

/ip route
add comment=DDNS distance=1 dst-address=159.148.147.201/32 gateway=pppoe-iijmio
add comment=DDNS distance=1 dst-address=159.148.172.251/32 gateway=pppoe-iijmio

IPv6 IPoEのブリッジ設定

そして最後は、ひかり電話なしの環境でLAN側にIPv6をどう流してやるか。RouterOSはいわゆるND Proxyは実装されていないので、もうブリッジしてやるくらいしか無いですね??

Routerboardユーザグループさんのブログに以下のような記事がありましたので、ほぼ同じような構成にしました。

Routerboard User Group JP Portal Site: IPoE(IPv6)環境でのRouterOSの設定方法について

とりあえずbridge filterでNGNとはPPPoEとIPv6しか通れないようにします。

記事ではether1(WAN)・ether2(LAN)の想定ですが、RB4011で全インタフェースブリッジしてether1がONUに接続されているという想定だと、以下のようなルールになります。
(完全に雰囲気で書いているので、これで良いのか自信は無い)

/interface bridge filter
add action=jump chain=input comment="INPUT from WAN" in-interface=ether1 jump-target=input-wan
add action=accept chain=input-wan comment="accept input IPv6" mac-protocol=ipv6
add action=accept chain=input-wan comment="accept input PPPoE" mac-protocol=pppoe-discovery
add action=accept chain=input-wan mac-protocol=pppoe
add action=drop chain=input-wan
add action=jump chain=output comment="OUTPUT to WAN" jump-target=output-wan out-interface=ether1
add action=accept chain=output-wan comment="accept output IPv6" mac-protocol=ipv6
add action=accept chain=output-wan comment="accept output PPPoE" mac-protocol=pppoe-discovery
add action=accept chain=output-wan mac-protocol=pppoe
add action=drop chain=output-wan

このbridge filterによってbrigdeのhardware offloadingは無効になってしまうので、NASなどは別のスイッチを接続してその下にぶら下げたほうが良いと思います。

ipv6-test.com result

追記

以下のブログ記事を見て気がついたのですが、bridgeの設定で use-ip-firewall というオプションがあり、なんと、これを有効にすることでブリッジされるパケットについてもIPレベルのフィルタが適用できました。

Knowledgeloc: [RouterOS] 日本のISPにおける一般的なIPv4/IPv6 Dual Stack構築方法

Mikrotik: Building Your First Firewall

今思えば、パケットのフローダイアグラムで、ブリッジのところからUSE-IP-FIREWALLの分岐が示されていたけど、こういうことだったのか……。


ということで、以上。せっかく買ったRB4011を有効活用できる環境がひとまず整ったのでヨシ!

comments powered by Disqus