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

コンシューマーユーザーが取得できるIPv6の実情

IPv6アドレスの利用が日本でも始まって久しいですが、歴史的な経緯など様々な事情が絡み合って、海外のコンシューマー向けISPで採用されている方式ではないものが日本では広まっているように見え、結果として日本でIPv6アドレスでインターネット接続する際に必要なRA(ND) Proxyといった技術についてニーズの差から実装が見送られていることが多々あり、そのままではIPv6とIPv4を同時に使うことはできなくなっていることが多いように思えます。

日本のISPではフレッツ光クロスを除いてユーザー向けのIPv6 プレフィックスレングスとして /64 がエンドユーザーに与えられることが多いと思われるのですが、これはIPv6における基本の単一サブネットであり、ここからサブネットをユーザー側で作ることができないので、ユーザーがISPからもらえるIPv6アドレス間ではルーティングができません。海外のISPでは /56 などで割り当てられることが多いように見えるのですが、 /56 がISPから与えられると256のサブネットが作れるようになるので自由度が増すのですが、基本的にインターネットにつなぎたいだけならこれをエンドユーザーに与える必要は必ずしもない・・・であるとか、運用面での面倒を避けるために、日本では /64 が降ってくるISPが多いように主観では感じます・・・NUROに至ってはHGWまで /56 で流れてくるのに、クライアントには /64 で流してきます。他のサブネットはいったいどこへ行ったのか?もしかして使えるはずのサブネットをかなり浪費しているのではないか?いくら膨大な数があるとはいえ、こんな運用をしていたら、遠い未来の話、またいつか問題になりそうな気がします。

ルーティングができないということはユーザーとISPがそのままL2接続されたような状態になっていて境界がないといえることでもありますが、結果として「意図した”IPフィルタ”が使えない場合がある」ということを意味しており、セキュリティについてはIPv4の時代とは別で改めて考える必要があるということになろうかと思われます。ですので、安全に使うためにはIPv6でも何らかのファイアウォールがネットワークの境界か個々のクライアント側に必要なのですが、このような流れの中でNUROの一部HGWにIPv6フィルタが実装されていなかったことがやり玉に挙げられたこともありました。ただ、フレッツでもONUで開通している場合にはIPv6 IPoEプロバイダと契約した瞬間におなじことになりますが、エンドユーザーが自由にルーターを選択できるのとは違うという点が批判にあたるところかなと思います。

この話に絡んで、「IPv6はそもそもNATを必要としない思想でP2Pで繋がるべきものなんだから個々のクライアントで担保したらいいじゃん」という主張もみられるのですが、クライアント側すべてでIPv6セキュリティを担保しようというのは現実的ではないと思っています。そもそもことセキュリティという点においては絶対的なものはないように思えますし、通信関係者のフォーラムでの発表資料なども見ても運用者自身がどうするべきか悩んでいるというのが実情に見えることから、選択肢が多岐にわたって利用者や開発者に委ねられており、IPv6ファイアウォールを搭載していないIPv6ネットワーク機器が腐るほどあったり、ポリシーが一貫しないので、結局は境界でコントロールしないことには目的を達成することは困難じゃないかと思います。

RouterOSの現状

話を戻しますが、RouterOSも例にもれずRA(ND) Proxyが実装されていません。ISPが /64 しかくれないと、WAN側インターフェースとLAN側インターフェースの間をそのまま転送することができず、RAがLANには流れてこないのでクライアントがIPv6アドレスを生成できないためグローバルIPv6アドレスが設定されない上にインターネットへ通信することができません。RA(ND) Proxyが無ければLayer3はなくてLayer2でパケットは転送する必要があり、そのためBridgeインターフェースを代わりに用いるしかないのが実情じゃないでしょうか。

しかしBridgeインターフェースはL2インターフェースであるがゆえに「IPフィルタ」が使用できません。ここが問題でした。MAC Addressベースのコントロールはできるが、IPアドレスベースでのコントロールができないので実用的なフィルタが書けない。一方でNEC IXシリーズではBridgeインターフェースにIPアドレスを持たせたりフィルタリングする機能があり、機能としては持っているルーターが世の中には他にもあるので、RouterOSはできんのかいな?とずっと悩んでいたのですが、設定が存在することを知りました。

  • 該当コマンドは interface bridge settings set use-ip-firewall yes
  • Winboxの場合はBridgeメニューの[Settings] – [Use IP Firewall]
  • デフォルト値は no なので yes にしないと動作しない。
  • 7.1beta1の時点では yes にしても動作しない。実装されていないと思われるためv6系を使用する必要がある。
  • interface list に同一Bridge内に WAN と LAN に属するインターフェースを作成することにより、IPフィルタが適用される。

IPv6用設定例

公式ドキュメントの設定例をアレンジします。

https://help.mikrotik.com/docs/display/ROS/Building+Your+First+Firewall

CLIからBridgeでIPフィルタを有効にする。

interface bridge settings set use-ip-firewall yes

自身に割り当てられるIPv6サブネット番号/プレフィックスレングスを許可IPに設定し、ローカルIPアドレスを許可するアドレスリストを作成する。

/ipv6 firewall address-list
add address=fe80::/16 list=allowed
add address={HGW等からRAされた自身のサブネット番号}/64 list=allowed
add address=ff02::/16 comment=multicast list=allowed

※プレフィックスレングスが /64 の場合。

interface listでEthernetポートをWANとLANでそれぞれ事前に設定する。ここでは例としてCCR2004を対象とし以下とする。

LAN:bridge1

WAN:sfp-sfpplus12

既存のBridgeを使っても良いし、新たにBridgeインターフェースを作成しても良いが、とにかくBridgeインターフェースを一つ用意する。そして、WANとLANのインターフェースを2つとも同じBridgeへ追加する。

例の場合、sfp-sfpplus12をbridge1に加える。

IPv6用のファイアウォールルールを書く。

/ipv6 firewall filter
add action=accept chain=input comment=”allow established and related” connection-state=established,related
add chain=input action=accept protocol=icmpv6 comment=”accept ICMPv6″
add chain=input action=accept protocol=udp port=33434-33534 comment=”defconf: accept UDP traceroute”
add chain=input action=accept protocol=udp dst-port=546 src-address=fe80::/16 comment=”accept DHCPv6-Client prefix delegation.”
add action=drop chain=input in-interface=WAN log=yes log-prefix=dropLL_from_public src-address=fe80::/16
add action=accept chain=input comment=”allow allowed addresses” src-address-list=allowed
add action=drop chain=input

/ipv6 firewall filter
add action=accept chain=forward comment=established,related connection-state=established,related
add action=drop chain=forward comment=invalid connection-state=invalid log=yes log-prefix=ipv6,invalid
add action=accept chain=forward comment=icmpv6 protocol=icmpv6 src-address-list=allowed
add action=accept chain=forward comment=”local network” in-bridge-port-list=!WAN
add action=drop chain=forward log-prefix=IPV6

  • DHCPv6-PDの項目はRAだけで必要な情報が受けとれる場合は必ずしも必要ない。フレッツ光クロスの場合は必要だと思われる。ISPや上流の機材に依存する。

以上でWANインターフェースに指定したポートにONUやHGWからのLANケーブルを接続し、bridge1になっているポートにクライアントを接続すればRAでIPアドレス等の情報を受け取ることができ、IPv6でインターネットへ接続可能になり、かつ不要な通信はフィルタされる状況が作れます。

デュアルスタック構成にする場合

基本的にIPv4でIPマスカレードを使う設定を入れるだけです。

物理的にポートを分けることも、先に設定したIPv6用のWANポートを兼用させることも、どちらも可能であり、ポートを分けたいなら Interface List のWANにポートを追加した上で、ip firewall rulesやNATで目的のポートを選択するだけです。例えば、私の場合はCCR2004のether1をIPv4通信用に設定しています。

NUROの場合、スマートホーム契約だと2.5Gbpsポートが付いたHGWがレンタルされますが、それ以外は1Gbpsの機器がレンタルされるため、物理的にポートを分けるとオトクです。IPv4とIPv6ラインでそれぞれダウンストリームで1Gbps使えるようになります。