この記事は,『BBSakura Networks Advent Calendar 2023』の 23 日目の記事です……が,遅刻しました! :dogeza:
はじめに
初めましての方は初めまして! そうでない方はこんにちは! BBSakura Networks 株式会社 事業本部の @paina こと佐藤です。
みなさんは,Advent Calendar 12 日目の記事「疑似フレッツ光網内の通信を accel-ppp で再現できるか検証する(検討編)」をご覧になりましたか。 その記事について,ひとつ皆様にお知らせしておきたいことがございます。
「疑似フレッツ光網〜」の記事を書かれた佐藤さんは
私とは別の佐藤さんです!
私の友人や技術者のコミュニティ,時には社内の方からも「paina さんの記事いいね!」というお言葉を頂いており,その度にアナザー佐藤さんに申し訳ない気持ちになっています。(笑)
その後,むしろ佐藤と佐藤をセット販売にしたほうが良いのではないか? という悪乗り……じゃない,共著案が立ち上がるまでに至りました。
というわけで,今回私は将来の佐藤 & 佐藤の共著を目指して,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 回線と呼んだりします。どちらの回線になるかは,下記の表に従います。
フレッツ光ネクスト | フレッツ光クロス | ||
---|---|---|---|
NTT 東日本管内 | ひかり電話契約なし | RA | PD |
ひかり電話契約あり | PD | PD | |
NTT 西日本管内 | PD | PD |
RA 回線は場合分けの上では NTT 東日本管内・ひかり電話契約あり・フレッツ光ネクストの回線のみのパターンではありますが,そのユーザは多いようです。 今回は RA 回線を模擬するかたちで,構成を検討しました。
ネットワーク構成
まず,ネットワークの全体像を示します。
ごらんの通りあまり複雑な構成は必要ありません。 今回は 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.conf
で enable
するだけでクエリを受け付けるようになるので 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:一部,もっと短いプレフィクスを配る回線があるそうですが,現存するかは不明です