OSS による模擬フレッツ光網(IPoE・検討編)

この記事は,『BBSakura Networks Advent Calendar 2023』の 23 日目の記事です……が,遅刻しました! :dogeza:

はじめに

初めましての方は初めまして! そうでない方はこんにちは! BBSakura Networks 株式会社 事業本部の @paina こと佐藤です。

みなさんは,Advent Calendar 12 日目の記事「疑似フレッツ光網内の通信を accel-ppp で再現できるか検証する(検討編)」をご覧になりましたか。 その記事について,ひとつ皆様にお知らせしておきたいことがございます。

「疑似フレッツ光網〜」の記事を書かれた佐藤さんは
私とは別の佐藤さんです!

私の友人や技術者のコミュニティ,時には社内の方からも「paina さんの記事いいね!」というお言葉を頂いており,その度にアナザー佐藤さんに申し訳ない気持ちになっています。(笑)

その後,むしろ佐藤と佐藤をセット販売にしたほうが良いのではないか? という悪乗り……じゃない,共著案が立ち上がるまでに至りました。

Slack のスクリーンキャプチャ t-sato:佐藤あるある対応が大変なので、どっかのタイミングで共著にしましょう! (余力があれば)PPPoE IPv6 編、IPoE 編と続く予定です。 y-kusakabe:余計ややこしくなりそうw t-hayasaka: ばら売り不可セット販売 マスター佐藤
佐藤セット販売のお知らせ

というわけで,今回私は将来の佐藤 & 佐藤の共著を目指して,IPoE を中心にフレッツ光網を模擬する環境を検討してみました。

なぜ模擬フレッツ光網が必要か

弊社および BBIX では,「OCX 光 インターネット」という,フレッツ光を利用した法人向けインターネット接続サービスを提供しています(10 ギガ版プレスリリース1 ギガ版プレスリリース)。 私もこのサービスの開発に少し関わっているのですが,IPoE 版の模擬フレッツ光網はその開発過程で立ち上げたシステムです。

本サービスでは CPE (Customer Premises Equipment) として NTT 東日本・西日本のレンタルのホームゲートウェイ(以下,HGW)をお客様にご利用いただく場合があるのですが, この場合に IPoE と IPv4 over IPv6 の通信を実現するには,事業者が HGW のためのソフトウェアを開発する必要があります。 本番環境では,そのソフトウェアは「フレッツ・ジョイント」という NTT 東西のサービスを用いて各お客様宅の HGW に配信され, 回線からの情報とも連携して IPoE・IPv4 over IPv6 の通信を確立します。

しかし,ソフトウェアの開発時にはまだその回線,つまり自社のサービスがなく,HGW のソフトウェアをデバッグすることが難しい段階もありました。 そのため,私たちは都内某所の検証ラボに IPoE 版の模擬フレッツ光網を構築して HGW のソフトウェア開発を行っていました。 今回この記事で述べる模擬フレッツ光網は,その環境を元に再構成したものです。 この事情から,この模擬フレッツ光網は UNI (User-Network Interface) の視点で本物のフレッツ光網に似た動作をできることを主眼としています。

OSS での再構成

検証ラボに構築した模擬フレッツ光網は,その一部にメーカー製品を使用しています。特にルータ等のネットワーク機器です。 そういったプロプライエタリ製品を利用した環境をそのまま解説するだけでは,気軽に作れるものではなくなってしまいます。 そこで,この記事ではほぼ全ての要素を OSS で実現できるよう,改めて構成を考えました。 しかし,今回はその構成を検討するのみで,十分な動作確認はできていません。 今後,実際に CPE を接続してみたりして,本当に模擬できているか確認し,「実装編」をお送りしたいと思います。

フレッツ光の回線種別について

フレッツ光に必要な要素を考える前に,回線種別について整理します。 フレッツ光では,RA (Router Advertisement) で /64 のプレフィクスを配る回線と, DHCPv6-PD で通常 /56 のプレフィクス*1を配る回線があります。 前者を RA 回線・後者を PD 回線と呼んだりします。どちらの回線になるかは,下記の表に従います。

RA 回線・PD 回線の場合分け

フレッツ光ネクスト フレッツ光クロス
NTT 東日本管内 ひかり電話契約なし RA PD
ひかり電話契約あり PD PD
NTT 西日本管内 PD PD

RA 回線は場合分けの上では NTT 東日本管内・ひかり電話契約あり・フレッツ光ネクストの回線のみのパターンではありますが,そのユーザは多いようです。 今回は RA 回線を模擬するかたちで,構成を検討しました。

ネットワーク構成

まず,ネットワークの全体像を示します。

「収容ルータ VyOS」を中心にユーザネットワークが 2001:db8:817:1::/64・2001:db8:817:2::/64・link-local only でつながっている。前者 2 つが USER1・USER2 の UNI (RA) で,後者は USER3 UNI (PD) で今後検討となっている。収容ルータにはさらに IPv6 Internet と,2001:db8:817::/64 のリンクを介して「各サービス用 FreeBSD ホスト」がつながっている。ホストには「VNE DNS キャッシュサーバ : Unbound」・「SNTP サーバ : ntpd」・「DHCPv6 サーバ : isc-dhcp」・「HTTP 経路サーバ : Nginx 」がインストールされている。
模擬フレッツ光 ネットワーク構成

ごらんの通りあまり複雑な構成は必要ありません。 今回は UNI の視点でフレッツ光網を模擬しているので,CPE に対して適切なプロトコルで情報を与えて通信を確立できればよいからです。 必要なものは,何かしらの IPv6 インターネットへのリーチャビリティと,VyOS のホスト,FreeBSD のホストで,それらは仮想基盤の上に構築してもベアメタル PC を組み合わせてもよいです。

ソフトウェア構成・設定例

次に,使用するソフトウェアとそれが担う機能,設定例などを示します。

サービスホスト : FreeBSD

各ソフトウェアを提供するために,Unix 系 OS のホストが必要です。 Linux でもよいのですが,私はちょっとした検証にはネットワークに関する設定が簡単にできる FreeBSD を利用することも多いです。 rc.conf を下記のように設定し,アドレスやサービスの立ち上げを行います。

/etc/rc.conf

hostname="EXP-FLETS-SV01"
ifconfig_vmx0="up"  # vmx0: 検証ネットワークへ接続するインターフェイス
ifconfig_vmx0_ipv6="inet6 2001:db8:817::3/64"  # vmx0 に設定する IPv6 アドレス

ifconfig_vmx1="DHCP"  # マネジメント等へのアクセスは別のインターフェイスで設定

ifconfig_lo0_alias0="inet6 2404:1a8:7f01:b::3/128"  # 模擬 DNS キャッシュサーバのアドレス #1
ifconfig_lo0_alias1="inet6 2404:1a8:7f01:a::3/128"  # 模擬 DNS キャッシュサーバのアドレス #2
ifconfig_lo0_alias2="inet6 2404:1a8:1102::b/128"  # 模擬 SNTP サーバのアドレス #1
ifconfig_lo0_alias3="inet6 2404:1a8:1102::a/128"  # 模擬 SNTP サーバのアドレス #2
ifconfig_lo0_alias4="inet6 2404:1a8:c023:3201::15/128"  # 模擬 HTTP 経路サーバのアドレス

ipv6_route_0="-inet6 2001:db8:817::/48 2001:db8:817::2"  # ユーザ向けのスタティックルート

ntpd_enable="YES"  # ntpd を起動 (模擬 SNTP キャッシュサーバ)
unbound_enable="YES"  # Unbound を起動 (模擬 DNS キャッシュサーバ)
dhcpd6_enable="YES"  # isc-dhcp-server を起動 (DHCPv6 サーバ)

収容ルータ : VyOS

収容ルータは VyOS で模擬します。 まず,IPv6 インターネットへの到達性を RA を受けるなどして確保します。 模擬のユーザに割り当てるアドレスがグローバルなものでない場合は,NAT66 でインターネットに到達できるようにしておくと良いでしょう。

set interfaces ethernet eth0 ipv6 address autoconf
set nat66 source rule 1000 source prefix '2001:db8:817::/48'
set nat66 source rule 1000 translation address 'masquerade'

サービスホストとのリンクのアドレスを設定し,サービスのアドレスへのスタティックルートを設定します。

set interfaces ethernet eth1 address '2001:db8:817::2/64'
set protocols static route6 2404:1a8:7f01:a::3/128 next-hop 2001:db8:817::3
set protocols static route6 2404:1a8:7f01:b::3/128 next-hop 2001:db8:817::3
set protocols static route6 2404:1a8:1102::a/128 next-hop 2001:db8:817::3
set protocols static route6 2404:1a8:1102::b/128 next-hop 2001:db8:817::3
set protocols static route6 2404:1a8:c023:3201::15/128 next-hop 2001:db8:817::3

ユーザ向けのインターフェイスにアドレスをつけ,RA と DHCPv6 でアドレス等の情報を配布するようにします。

set interfaces ethernet eth2 address '2001:db8:817:1::fffe/64'
set interfaces ethernet eth3 address '2001:db8:817:2::fffe/64'
set service dhcpv6-relay listen-interface eth2
set service dhcpv6-relay listen-interface eth3
set service dhcpv6-relay upstream-interface eth1 address '2001:db8:817::3'
set service router-advert interface eth2 prefix 2001:db8:817:1::/64
set service router-advert interface eth3 prefix 2001:db8:817:2::/64

DHCPv6 サーバ : isc-dhcp-server

PD 回線で DHCPv6-PD にてプレフィックスを委譲し,また PD 回線と RA 回線の両方で DNS キャッシュサーバのアドレスなどを配布する,DHCPv6 サーバです。 DHCPv6 サーバには,WIDE Project による実装や,ISC による実装 isc-dhcp,同じく ISC による Kea DHCP Server などがあります。今回は一般によく使われておりシンプルな isc-dhcp を使用しました。 DHCPv6 はユーザ収容を行う VyOS でもサポートしていますが,細かい制御を行うために VyOS は DHCPv6 Relay とし DHCPv6 Server は別途立ち上げました。

今回は RA 回線を模擬しますので,設定は次のようになります。

/usr/local/etc/dhcpd6.conf

option dhcp6.name-servers 2404:1a8:7f01:b::3, 2404:1a8:7f01:a::3;
option dhcp6.domain-search "flets-east.jp", "iptvf.jp";
option dhcp6.sntp-servers 2404:1a8:1102::b, 2404:1a8:1102::a;

subnet6 2001:db8:817:1::/64 {}
subnet6 2001:db8:817:2::/64 {}

模擬 VNE DNS キャッシュサーバ : Unbound

VNE が提供する DNS キャッシュサーバです。キャッシュサーバとして一般的な実装の Unbound を使用しました。 後述する HTTP 経路情報サーバなど,フレッツ光網内のみで利用されるドメイン名を local-data として宣言しておくとよいでしょう。

/usr/local/etc/unbound/local-data.conf

server:
        local-data: "route-info.flets-east.jp 10m AAAA 2404:1a8:c023:3201::15"

SNTP サーバ: ntpd

フレッツ光の DHCPv6 で配布される SNTP サーバです。NTP サーバのリファレンス実装である ntpd の FreeBSD に付属するバージョンを使用しました。 ntpd はフルセットの NTP だけでなく SNTP にも対応しているので,そのまま利用可能です。 FreeBSD の ntpd は rc.confenable するだけでクエリを受け付けるようになるので ntp.conf の設定は不要と思います。

HTTP 経路情報サーバ: Nginx

フレッツ光には,各 VNE が利用しているプレフィックスの一覧を取得する,経路情報サーバが存在します。 実態としては HTTP サーバで,NTT 東日本管内では下記のように curl 等でアクセスできます。

curl -H 'Connection: close' http://route-info.flets-east.jp:49881/v6/route-info

一部の CPE 製品はこれにアクセスして自身に割り当てられたアドレスを検索することがありますので,これも準備しておくとよいです。 模擬 VNE DNS キャッシュサーバに設定した AAAA レコードのアドレスの tcp/49981 で Nginx を立ち上げると模擬できます。

/usr/local/etc/nginx/nginx.conf

http {
    # (snip)
    server {
        listen [::]:49881;
        server_name route-info.flets-east.jp;

        location / {
            root /var/www/route-info.flets-east.jp;
        }
    }
}

あとは curl 等で取得した情報をファイルとして /var/www/route-info.flets-east.jp/v6/route-info に書いて置きます。 デバッグのために適宜編集してもよいでしょう。

まとめ

この記事では,フレッツ光網とその RA 回線を模擬するために,OSS で下記の機能を実現する検討をしました。

  • 回線への RA・DHCPv6 でのアドレス等の配布
  • 模擬 VNE DNS キャッシュサーバ
  • 模擬 SNTP サーバ
  • 模擬 HTTP 経路情報サーバ

今後は下記のようにさらに詳細化を進めて,「実装編」の記事の公開を目指してみます。佐藤 & 佐藤共著で!

  • この環境に実際に CPE を接続して機能不足等なく模擬できているか確認する
  • PD 回線も模擬できる構成を検討する
  • IPv4 over IPv6 も模擬し IPv4 でも通信できるようにする
    • MAP-E や DS-Lite 等のソフトウェアを調査する必要あり

宣伝コーナー

  • 弊社と BBIX では,フレッツ光を利用したインターネット接続サービス「OCX 光 インターネット」を提供しています。ご検討ください。
  • この記事を詳細化したものを,コミックマーケット103で頒布するかもしれません。
    • コミックマーケットへの参加,及び文書の頒布は業務外ですので,詳細は私の X/Twitter アカウントでご確認ください。

参考

*1:一部,もっと短いプレフィクスを配る回線があるそうですが,現存するかは不明です