JANOG57で構築した拠点間接続 - OCXを使用したバックボーンネットワーク - JANOG57 NOC

こんにちは、segre です。

JANOG57 では NOC チームでバックボーンチームリーダーをしていました。 本記事では、JANOG57 において 3 拠点の会場をどのように接続したのかに焦点を当て、バックボーンネットワークについて解説します。

JANOG57 はコングレコンベンションセンター B2F、JAM BASE 3F(さくらインターネット本社、グラングリーン大阪 3F)、JAM BASE 4F-6F(グラングリーン大阪 4-6F)の 3 会場での分散開催でした。この 3 会場をつなぐバックボーンネットワークの構築にあたり、BBIX/BBSakura が提供する相互接続プラットフォーム「OCX」を全面的に活用しました。

なお、本記事は BBIX/BBSakura とは直接関係のない個人の見解であり、内容は執筆者の経験に基づくものです。JANOG57 のバックボーンネットワーク構築において OCX を利用した際の設計や実装について紹介します。

また、JANOG57 に対しては、OCX をご提供いただき、サービスを自由に利用させていただいています。この場を借りて改めて感謝申し上げます。OCX 提供については BBSakura の川畑さんが JANOG57へOCXを提供しました - BBSakura Networks Blog で紹介されています。

OCX とは

OCX(Open Connectivity eXchange)は、BBIX/BBSakura が提供するクラウド型の相互接続プラットフォームであり、「OCXポータルから必要な機能を要するリソース(コンポーネント)を組み合わせることで、複数の OCX 拠点やパブリッククラウドを接続するなどの要件に応じたネットワーク設計を行い、独自のプライベートネットワークを構築することができ」るサービスです。

On-Demand・Scalable・Inexpensive の 3 つが特長として掲げられており、ポータル操作だけで閉域網を構築でき、帯域や構成の拡張も柔軟に行えます。

OCX には以下のような主要コンポーネントがあります。 詳しくは OCX 公式ドキュメント(OCX ドキュメントサイト | Open Connectivity eXchange)を参照してください。

  • Physical Port
    • 会場と OCX ネットワークの接続ポイントとなる物理ポート
    • 今回はコングレ会場とオプテージ心斎橋 DC をオプテージのダークファイバで接続し、OCX の Physical Port を利用してコングレ会場を OCX ネットワークに接続
  • VCI(Virtual Circuit Interface)
    • 機器と OCX 機器の間で利用する仮想ネットワーク(VLAN)に相当するリソース
    • 今回は Physical Port 上に複数の VCI を設定し、OCX 内の各コンポーネントと論理的に接続
  • VC(Virtual Circuit)
    • 各コンポーネントを相互接続するためのレイヤ 2 の論理回線
    • 今回は VCI や Cloud Connection、Internet Connection などを相互接続するために利用
  • OCX-Router(v1)
    • OCX ネットワークにて IP ルーティングを行う機能。BGP 接続の終端や複数のクラウド間やサイト間をレイヤ 3 接続可能。
    • 今回は各会場間のルーティングとコングレ会場・さくらのクラウドとの BGP 接続に利用
  • Internet Gateway
    • OCX の閉域ネットワークからインターネットへの接続を NAT 機能とともに提供するもの
    • 今回は JAM BASE 会場の IPv4 インターネット接続に利用
  • Internet Connection
    • Internet Gateway と異なり NAT 機能は持たない、IPv6 に対応したインターネット接続
    • 今回はコングレ会場の IPv4/IPv6 インターネット接続に利用
  • Cloud Connection
    • 各クラウドサービスへ接続するための仮想的な接続インターフェース(AWS、Azure、GCP、さくらのクラウドなどに対応)
    • 今回はさくらのクラウドへの接続に利用し、OCX ネットワークとさくらのクラウド側ネットワークをインターネットを介さずに接続
  • Tunnel Gateway
    • OCX のプライベートネットワーク上に設けるトンネル終端機能。IPIP6 トンネルで接続可能
    • 今回は JAM BASE の OCX 光(フレッツ光)回線を OCX ネットワークに接続するために利用

今回の JANOG57 バックボーンでは、これらのコンポーネントをフル活用してネットワークを構築しました。

バックボーンネットワーク

全体構成

今回の要件は主に以下の 3 点でした。 - 3 会場分散開催のため各会場間のマネジメントネットワーク接続 - ユーザーセグメントを繋ぐ必要はありませんが、1 拠点しか置かないサーバーがあるため拠点間接続が必要でした - 各会場からインターネットへの接続 - 当然、各拠点からインターネットへ接続する必要があります - さくらのサーバーと各拠点の接続 - 会場の物理サーバーのほかに、さくらのクラウド上に構築されたサーバーも使用していたため、さくらのサーバーと会場間の接続が必要でした

そこで、今回は OCX を用いた以下の構成でバックボーンを設計しました。

OCX構成概要

メイン会場であるコングレは、コングレとオプテージ心斎橋 DC をオプテージのダークファイバで接続し、Physical Port を利用してコングレ会場を OCX ネットワークに接続しています。VCI を用いて複数の VLAN タグを通すことで、インターネットへの接続と拠点間接続を実現しています。JAM BASE 3F と 4-6F は、OCX 光(フレッツ光回線)を用いて Tunnel Gateway と IPIP6 トンネルを介して OCX ネットワークに接続しています。各拠点は OCX-Router(v1) を介して BGP または Static Route で接続され、各拠点・さくらのクラウドとの接続が可能です。

OCX 接続設計

OCX 上に構築した各リソースの設計について紹介します。 以下の図は先ほどの図に IP アドレスや AS 番号などの情報を加えたものです(一部省略しています)。

OCX構成概要(IPアドレス付き)

Physical Port と VCI

2 つの Physical Port を作成し、コングレと OCX の接続に使用しています。2 つ作成しているのは、OCX は基本的に 2 つのリソースを作成し冗長化する設計になっているためで、2 つの OCX-Router(v1) に接続するためです。 Physical Port 上には複数の VCI を接続し、インターネット接続用と拠点間接続用で分けています。VCI は VLAN タグに相当するリソースで、OCX-Router(v1) と Internet Connection への接続を分けるために 4 つの VCI を作成して利用しています。

今回会場で使用した YAMAHA RTX3510 におけるコンフィグ例は以下に公開されています。

RT-C-01

RT-C-02

Internet Connection

コングレ構成

コングレのインターネット接続に使用しています。Internet Connection を作成すると Primary と Secondary Address、および VRRP VIP が払い出され、Static Route を設定することでインターネット接続が可能になります。 そのため、IPv4 もルーターまでグローバルアドレスを持ってくることができるため、コングレでは会場のルーターで NAT を行っています。

今回は IPv6 マルチホーム+マルチルーターは難しいという話 - JANOG57 NOC - segreの日記 にもある通り、IPv6 はマルティプレフィックスで冗長化と負荷分散を行う設計にしていたため、追加のプレフィックスを払い出し、合計 8 つのプレフィックスを使用させていただきました。 本リソースを用いることで NAT を介さず直接インターネットに抜けることができ、ネットワーク構成に合わせた柔軟な設計が可能だと感じました。

Tunnel Gateway

JAM BASE

JAM BASE 3F は OCX 光 10G(フレッツ光クロス)、JAM BASE 4-6F は OCX 光 1G(フレッツ光ネクスト)で OCX ネットワークに接続しているため、Tunnel Gateway を利用して IPIP6 トンネル(IPv4 over IPv6)を張っています。なお、Tunnel Gateway は IPv4 のみの対応であり、IPv6 を OCX に接続することはできないため、IPv6 に関してはフレッツから直接インターネットへ接続しています。

今回会場で使用した YAMAHA RTX1300 におけるコンフィグ例は以下に公開されています。

JAM BASE 3F

JAM BASE 4-6F

Cloud Connection

さくらのクラウドとの接続に使用しています。さくらのクラウドとはプライベートリンク for BBIX を通じてレイヤ 3 で接続し、ルータや L3 スイッチとの Static Routing または BGP によって、インターネットを介さずに OCX ネットワークと通信することができます。今回はさくらのクラウドのルーターと BGP で接続しています。 OCX 上のリソースとさくらのクラウド側ネットワークを閉域で接続できるため、セキュアな通信が可能になると感じました。

OCX-Router(v1)

これらのリソースをすべてまとめ、3 拠点とさくらのクラウドを接続しているのが OCX-Router(v1) です。本リソースを作成すると Primary と Secondary の 2 台構成で冗長化されたリソースが提供され、それぞれのルーター間を iBGP で接続しています。

OCX-Router(v1) には JAM BASE 宛ての Static Route、Internet Gateway 宛ての Default Route を追加し、コングレとさくらのクラウドとは eBGP で接続しています。コングレ側では 2 台の RTX3510 間で iBGP を張ることで、それぞれ 2 台で冗長化されています。

まとめ

JANOG57 のバックボーンネットワークでは、OCX の各コンポーネントを組み合わせることで、3 会場分散開催という特殊な要件に対応したネットワークを構築しました。今回、OCX のほぼすべての機能をフル活用し、まさに OCX の得意とするユースケースにマッチした構成を実現できたのではないかと思います。

クラウド型のネットワークサービスであるため、構築の手軽さも感じました。検証を通して構成を変更したくなったときに、OCX のポータルからリソースの追加や削除、接続の変更などを簡単に行うことができ、柔軟に設計を変更できる点が非常に便利でした。

JANOG57のネットワーク利用統計 - JANOG57 NOC

こんにちは、segre です。

JANOG57 では NOC チームでバックボーンチームリーダーをしていました。本記事では JANOG57 ネットワーク全体の統計を紹介します。L2・L3 ネットワークの設計については JANOG57 L1~L3ネットワーク解説 - JANOG57 NOC - segreの日記 で解説しています。

利用統計

接続クライアント数

まずは会場全体の接続クライアント数の推移です。本番3日間(2/11〜2/13)の推移を示しています。各エリアごとの接続クライアント数をスタックで表示しています。

会場全体のクライアント数

ピーク時の接続クライアント数は2,098台(Day 2 14時頃)でした。事前の見積もりではピーク時に参加者5,000人・スマホとPCの2台持ちを想定して10,000台としていたため、想定よりもかなり少ない数字になりました。また、2日目の参加者は3,775人でしたので実際に来場数に対しても少ない数字であることがわかります。

JANOG56 ではピーク時に2,659人の来場に対して2,962台のクライアントが接続されていたことを考慮すると、JANOG57 では会場が分散されていたことにより会場外に出ている参加者も多数おり、同時に会場 Wi-Fi に接続しているクライアントはかなり抑えられたのではないかと考えています。

SSID 別では以下の通りです。

SSID別クライアント数

  • JANOG57(一般): ピーク1,818台
  • JANOG57_OpenRoaming: ピーク272台
  • eduroam: ピーク82台

割合としては 8 : 1.7 : 0.3 程度です。今回は OpenRoaming プロファイルの配布も行ったため、比較的多くの方に OpenRoaming に接続いただけたのではないかと思います。

WAN帯域

次にコングレ B2F の上流帯域の推移です。RT-C-01 と RT-C-02 にそれぞれ Optage ダークファイバー 10GbE を1本ずつ引き込んでいます。

コングレB2F トラフィック

コングレ B2F のピーク帯域は800 Mbpsほどでした。2台のルーター間でトラフィックがある程度均一に分散されており、VRRP と IPv6 マルチプレフィックスによる負荷分散が意図通りに機能していたことが確認できます。

RT-C-01,02 渡りトラフィック

なお、RT-C-01 と RT-C-02 のわたりのトラフィックは以上のようになっています。すべて IPv6 のトラフィックであることが予想されます。思ったよりはトラフィックがねじれていなかったという感想です。

全会場合計のトラフィック

全会場合わせたピーク帯域は950 Mbpsほどでした(Day 1 の大きく跳ねている箇所は NOC メンバーによってスピードテストが実施されたものなので除外しています)。クライアント数はコングレと JAMBASE で6:4程度で分散されていたのに対してトラフィックは大きくコングレに偏っていることがわかります。

NAT セッション数

コングレ B2F では RTX3510 2台で NAT を行っています。1台あたりの上限は500,000セッションです。

コングレB2F NATセッション数

ピークは RT-C-01 が約9,000セッション、RT-C-02 が約8,500セッションでした。NAT セッションは RTX に Lua スクリプト を仕込んでいます。RT-C-01 が2日目よりデータが取れていないのは、ルーターが会期中に再起動することがあり、この Lua スクリプト起因であることが疑われたためです。

JAMBASE 3F と 4-6F では OCX で 5 IP を使用して NAT を行っています。1 IP あたりの上限は約6万セッションです。

JAMBASE NATセッション数

ピークは15,000セッションほどでした。概ね各 IP に分散されていることがわかります。

DHCP

DHCP は dhcp-1 と dhcp-2 の2台で冗長構成をとっています。クライアントへは両方からレスポンスを返し、クライアントに選択してもらう構成です。 詳細は JANOG57 NOC サーバー構成紹介(DNS・DHCP編) - crashRT のブログ を参照ください。

DHCP リース数

DNS

各会場に DNS フルリゾルバを設置し、レイテンシの低い順に DHCP で配布する設計にしています。

JAMBASE 3F DNS qps

JAMBASE 3F において、ピーク時の qps は約130 qpsで、事前に resperf を用いた負荷試験での目標値3,000 qpsに対して余裕がありました。UDP/TCP/DoH の比率はおおよそ 8 : 1.5 : 0.5 でした。

コングレ B2F DNS qps

なお、コングレ B2F では、DNS サーバーに対するクエリ数が突発的に急増するスパイクを7回観測しました。通常はピーク30 qps程度でしたが、スパイクでは最大10,000 qpsを超え、その時間帯のキャッシュヒット率はほぼ100%でした。プライバシーポリシーに基づき DNS クエリログは保存していないため具体的なクエリ内容の特定はできませんが、異様に高いキャッシュヒット率であることから通常のランダムなドメインではなく同一/少数のドメインに対する大量のクエリであり、単一のクライアントによる大量のクエリ送信であったと推定されます。

なお、ホットステージ期間の検証で完全にランダムなドメインのクエリ送信では最低でも3,000 qpsまで耐えることを確認しており、ランダムなドメインへの大量のクエリ以外では平常時と変わらないドロップ率であったことから全体的な障害にはならなかったと考えられます。

まとめ

項目 見積もり 実績
ピーク接続クライアント数 10,000台 2,098台
コングレ ピーク帯域(合計) 2.3 Gbps 950 Mbps
NAT ピークセッション数(合計) 150,000 32,500
DNS ピーク qps 3,000 qps 650 qps

見積もりをかなり余裕をもって設計したことにより、実績値では見積もりと比べて大幅に少ない値となりました。一方でネットワーク的には余裕を持って運用できたため、障害らしい障害は発生せず安定した3日間になりました。

なお、Grafana Dashboard は後日パブリックに公開する予定です。知りたい数値はそちらからご確認ください。

NOC Live

なお、会期中は NOC Live という試みを行い、ネットワークのダッシュボードを配信していました。アーカイブは以下の URL から確認できます。 人が増えるにつれてトラフィックが伸びているのも見ることができます。 noc.janog57.ishikari-dc.jp

JANOG57 L1~L3ネットワーク解説 - JANOG57 NOC

こんにちは、segre です。

JANOG57 が終わり 1 ヶ月ほどが経ちました。私は離島に籠りアジやイカを釣っていてブログを書くのをすっかりサボっていました。

JANOG57 では NOC チームでバックボーン(BB)チームのリーダーをやりました。本記事では JANOG57 の L2・L3 ネットワークを解説します。

ネットワーク機材

JANOG57 ではルーターをヤマハさん、L2・L3 スイッチと AP を HPE Juniper Networking さん、コンソールサーバーをセイコーソリューションズさんに提供していただいています。また、メンバーで持ち寄った NEC IX や光トランシーバー等を使用しています。

ルーター

機種 台数 主な役割
YAMAHA RTX3510 2 台 コングレ B2F 対外接続・NAT
YAMAHA RTX1300 4 台 JAMBASE 各拠点 WAN 終端
NEC IX2215 7 台 EtherIP トンネル終端

スイッチ (Juniper EX)

機種 台数 1G ポート SFP+ PoE 容量 主な用途
EX4400-48F 2 台 12 コアスイッチ (Virtual Chassis)
EX4400-24MP 2 台 24 4(拡張) 1,776 W
EX4100-24MP 6 台 16 6 1,620 W
EX4000-24MP 6 台 24 6 480 W
EX4000-12MP 11 台 12 8 240 W
EX4000-12P 1 台 12 0 240 W

AP (Juniper Mist)

機種 台数 規格
AP47D 15 台 Wi-Fi 7
AP47 18 台 Wi-Fi 7
AP37 21 台 Wi-Fi 7
AP36 11 台 Wi-Fi 7
AP34 12 台 Wi-Fi 6E
AP45 3 台 Wi-Fi 6E

コンソールサーバー

機種 台数
SEIKO SmartCS NS-2250-48 1 台

物理構成と論理構成

3 拠点それぞれの物理構成と論理構成を紹介します。

コングレコンベンションセンター B2F(コングレ)

コングレ 物理構成

コングレ 論理構成

コングレでは上記のようにルーター・スイッチを配置しています。対外接続はオプテージさんに OCX と接続を行えるデータセンターから会場までダークファイバーを引いていただき、10GbE を 2 回線 OCX ノードに直収しています(経緯は BBSakura Networks Blog で語られています)。そのため、対外接続を行う 2 台のルーター RTX3510 は図右下のスペースにラックを配置し、スイッチ 3 台と合わせてラックにマウントしました。その他サーバーや NTP Clock も配置し JANOG 会場の 1 つの名物スポットになっていたようです。

コングレサーバーラック

論理構成をご覧いただければ分かる通り、対外回線を 2 台のルーターで受けて冗長・負荷分散を行い、2 台のスイッチをコアスイッチとして Virtual Chassis を有効化し、比較的配線距離の長い各フロアごとのスイッチに各スイッチ 2 本ずつ LAG で 10GBase-SR/LR を用いて接続しています。実際期間中も片方だけなかなかリンクが上がらないということがあり 2 本配線するメリットを感じました(原因は LR/SR モジュールの装着間違いや端面清掃の不足でしたが……)。

各フロア以下のスイッチでは UTP またはファイバを用いて配線しています。今回は会場がかなり広いこともあり配線距離が 100 m を超える可能性がある場合には惜しみなくファイバを使用しています。

また、随所に会場の壁コンセントを使用しなければどうしても配線できない区間があり、その区間では VLAN Tag を通せないという制約がありました。その区間には NEC IX2215 を用いて各区間ごとに EtherIP トンネルを張ることで Tag を通しています。

JAMBASE 3F

JAMBASE 3F 物理構成

JAMBASE 3F 論理構成

JAMBASE 3F はさくらインターネット本社があり、当日は NETCON や発表のライブ配信、受付として利用されました。OCX 光プライベート 10G 回線(NTT 光クロス)をさくらインターネットさんのサーバーラックまで引き込み、RTX1300 に収容しています。その他サーバーラックには他拠点からのトラフィックを収集して分析するようなコアとなるサーバーや他拠点から参照される NTP サーバーも配置されていました。また、JANOG56 では許容可能電力を超過し機器の電源が落ちたという話を聞いていたため、想定電力を計算し超過しないように設計しています。JAMBASE 3F のラックは特に電力量が大きく、最大で 2,600 W ほど使用される可能性があったため、2 系統に分けて接続しています。

JAMBASE 3F のサーバーラックは多くの人の目に見えることも意識してきれいに配線しています。特にケーブルは JANOG57 に向けて特注されたさくらインターネットカラーの LAN ケーブルを使用し、ロゴに合わせてベルクロもグレーのものを使用しています。また、ラックには製品名が書かれたカードを掲示し、何の製品が使われているか一目で分かるようになっています(どこかで見たことありますね)。

JAMBASE 3F サーバーラック

JAMBASE 4-6F

JAMBASE 4-6F 物理構成

JAMBASE 4-6F 論理構成

JAMBASE 4-6F は本会議場 2,3 や BoF 会場として利用されました。こちらは複数の企業が共同で借りているフロアであり自由に回線引き込みをするのが難しく、ギリギリまで交渉していただき OCX 光プライベート 1G 回線(NTT 光ネクスト)を引き込めることになりました。各階に 1〜3 部屋あり廊下は敷設不可という条件だったので回線を各部屋へは壁コンを利用して接続し、こちらはいくつか VLAN Tag を切っていただけたので壁コン経由で Tag を通しています。コングレの壁コン区間とは異なり VLAN Tag が通せる設定にしてもらっています。

このフロアにも対外接続には RTX1300 を使用し、スイッチやサーバーと合わせて 8U のサーバーラックにマウントしています。MDF から受けた線を JAMBASE 5F のスイッチ (SW-J5-01) に収容し、そこからルーター (RT-J5-01) へ接続することで、ルーターでルーティングを行っています。各部屋へはこのルーターを折り返して壁コン経由で接続します。戻りも同様にこのルーターまで戻してからインターネットへ接続します。

JAMBASE 4-6F サーバーラック

論理設計

各拠点共通・各拠点個別の論理設計を紹介します。

VLAN/IP アドレス設計

会場内のネットワークはトラフィックの用途ごとに以下の 4 つの VLAN に分離しています。一般参加者を Visitor VLAN に収容し、ルーターやスイッチの管理用 IP へのアクセスを遮断しています。また、参加者同士のクライアント間通信も禁止することでセキュリティを確保しています。

  • Visitor VLAN(tag:10)
  • Management VLAN(tag:20)
  • Server 用 VLAN(tag:30)
  • 受付・中継用 VLAN(tag:40)

IP アドレス設計

IP アドレスは参加者がスマートフォンとノート PC の 2 台持ちをすることを想定して設計しています。また、冗長化のため DHCP サーバーを 2 台配置しており、各サーバーの DHCP プールは想定接続台数分をそれぞれ確保しています。コングレ B2F は最大 5,000 人の参加者を見込み 10.57.0.0/18 という広いアドレス空間を割り当てています。アドレスやラック配置、ポート構成、配線はすべて NetBox を用いて管理されています。

ルーティング設計

コングレ

コングレの WAN 側では、2 台の RTX3510(RT-C-01/02)がそれぞれ OCX ノードと接続し、さくらのクラウド向けには BGP で経路を交換しています。2 台のルーター間でも iBGP を張ることで互いに 1 ホップで到達可能な構成にしています。インターネット接続向けのトラフィックは NAT 後に OCX のインターネット接続用のリソースへ流し、専用線のアドレス向けにはリソースでスタティックルートを設定して各プレフィックスを RT-C-01/02 に戻す構成になっています。

LAN 側では、送信元と宛先のプレフィックスが異なる場合(例えば RT-C-01 配下から RT-C-02 配下への通信)は Stateful Firewall を通じてもう一方のルーターへ流す設計になっています。また VLAN 間ルーティングもルーター上で行っています。

JAMBASE 3F/JAMBASE 4-6F

JAMBASE 側の拠点では IPv6 は NGN アドレスからそのままインターネットへ出ますが、IPv4 は OCX のトンネル接続用リソースと IPIP6 トンネルを通じて接続します。そこから OCX 内のルーターを経由することで各拠点間の通信も可能になっています。

EtherIP 設計

コングレ B2F では会場の構造上、壁コンセントを経由しなければ物理的に配線できない区間が複数存在しました。この壁コン区間は VLAN Tag を通過させることができないため、そのまま接続すると 1 つの VLAN しか使用できなくなってしまいます。

この問題を解決するため、その区間に NEC IX2215 を設置し、EtherIP トンネルで L2 フレームを IP でカプセル化して VLAN Tag ごと送り抜けるようにしています。

EtherIP を採用するにあたって考慮が必要だったのが MTU と MSS です。EtherIP は IP ヘッダに加えて EtherIP ヘッダと Ethernet フレームをまるごと包むため、カプセル化によるオーバーヘッドが生じます。MSS clamping の設定値は以下のように計算しています。

IPv4 の場合:

1500(リンクMTU)
  - 20(外側IPv4ヘッダ)
  -  2(EtherIPヘッダ)
  - 14(内側Ethernetヘッダ)
  -  4(VLANタグ)
  - 20(内側IPv4ヘッダ)
  - 20(TCPヘッダ)
= 1420

IPv6 の場合:

1500(リンクMTU)
  - 20(外側IPv4ヘッダ)
  -  2(EtherIPヘッダ)
  - 14(内側Ethernetヘッダ)
  -  4(VLANタグ)
  - 40(内側IPv6ヘッダ)
  - 20(TCPヘッダ)
= 1400

また NEC IX では BVI (Bridge Virtual Interface) を設定する必要があるため、VLAN 20 (Management VLAN) だけは untagged で通し、VLAN 10・30・40 は tagged で通す構成にしています。

準備期間では VXLAN や GRE も候補として挙がりましたが、VXLAN は Juniper EX シリーズでの設定検証コストが高く、GRE は MTU のオーバーヘッドがさらに大きくなること、そして大会本番に向けてなるべくトラブルの種を少なくしたいという判断から EtherIP を選択しました。

NAT 設計

コングレ B2F では RTX3510 2 台で NAT を行います。参加者数のピーク見積もりは以下のとおりです。

  • ピーク参加者:5,000 人
  • 1 人あたりのセッション数:30 セッション(スマホ・PC 合計)
  • 最大セッション数:150,000 セッション

RTX3510 は 1 台あたり 500,000 セッションを扱えるため、2 台 Active/Active で運用しても十分な余裕があります。セッションテーブルの枯渇を防ぐため TCP タイムアウト・UDP タイムアウトはともに 120 秒に短縮しており、また per-host のセッション数上限も 500 セッションに制限しています。

JAMBASE 側の NAT は OCX の NAT 機能を利用します。1 IP あたり 62,000 セッションを処理でき、デフォルトで 5 IP まで追加可能なため、JAM 側の規模(最大 1,400 台程度)であれば問題なくスケールします。

IPv6 設計

IPv6 設計については別記事「IPv6 マルチホーム+マルチルーターは難しいという話」で詳しく書いていますが、本記事でも概要を紹介します。

コングレ

コングレでは 2 台のルーター(RT-C-01/02)が各 VLAN ごとにそれぞれ異なる IPv6 プレフィックスの RA を広告しています。具体的には VLAN 10 では RT-C-01 が 2400:c320:101:2000::/64 を、RT-C-02 が 2400:c320:101:2031::/64 を担当しています。

クライアントはこの 2 つの RA を受け取り、両方のプレフィックスから Global Unicast Address (GUA) を生成します。送信時にどちらの GUA を使うかはクライアントが選択するため、自然な形でトラフィックが 2 台のルーターに分散されます。

冗長化の仕組みも巧妙で、片方のルーターが上流 (OCX) との接続を失った場合、そのルーターは RA 内の lifetime を 0 秒に設定した RA を送出します。クライアントは lifetime=0 のプレフィックスを使用停止と判断するため、自動的にもう一方のルーター経由に切り替わります。単に shutdown させるだけだと lifetime が 0 秒になるまでクライアントは同じ GUA を使用し続けるため通信不能になります。

JAMBASE 3F

JAMBASE 3F では OCX 光 10G により DHCPv6-PD で /56 プレフィックスが割り当てられます。これを /64 に分割して各 VLAN に配布しています。

JAMBASE 4-6F

JAMBASE 4-6F は OCX 光 1G 回線のため、割り当てられるのは /64 のみです。この /64 を ND Proxy を使って Visitor VLAN に配布し、その他の VLAN(Management、Server 等)には ULA (Unique Local Address) を使用しています。各 VLAN 間のルーティングは RTX1300(RT-J5-01)が Router-on-a-stick として担当しています。

MTU 設計

会場内の MTU 設計は EtherIP や IPIP6 トンネルの存在によって複数の値が混在する構成になっています。

LAN の基本 MTU:1500

各スイッチ間・ルーター間のリンクは基本的に MTU 1500 で統一しています。ただし EtherIP 区間では前述のカプセル化オーバーヘッドにより実効 MTU が 1460 まで低下します。

WAN 側:

コングレは Optage 専用線(ダークファイバー)のため MTU 1500 を維持できますが、EtherIP を使用するため MSS clamping を v4 で 1420、v6 で 1400 に設定しています。

JAMBASE 3F/JAMBASE 4-6F は IPIP6 トンネルを経由するため MTU が 1460 に制限されます。こちらも MSS clamping を v4 で 1420、v6 で 1400 に設定しています。

冗長・高可用性設計

設計方針として「コア層およびゲートウェイ層では単一機器・単一回線の障害でサービスが停止しない構成にする、エッジ層以下は機材交換で対応する」という考え方を採っています。過剰な冗長化はコストと複雑さを増やすだけであり、トラブル時には直接現地に出向いて直すことを許容することでシンプルさを保っています。

コアスイッチ:Virtual Chassis

コアスイッチは Juniper EX4400-48F 2 台を Virtual Chassis (VC) として構成しています。VC は複数の物理スイッチを論理的に 1 台のスイッチとして扱う技術で、Master スイッチがダウンした際は Backup スイッチが即座に Master に昇格しルーティングエンジン機能を引き継ぎます。

下位スイッチへのアップリンクには LACP を使用しており、VC の異なるメンバー筐体にまたがってケーブルを接続しています。これにより片方のケーブル・ポート・筐体が故障しても残りのリンクで通信を継続できます。

ゲートウェイ:VRRP

コングレのゲートウェイは RTX3510 2 台で VRRP を構成しています。IPv4 では 2 つの仮想 IP を用意し、DHCP サーバーが異なるゲートウェイのプールを交互に配布することで冗長化と負荷分散を同時に実現しています。IPv6 については前述の RA マルチプレフィックス方式で対応しています。

ループ対策

全スイッチで RSTP (Rapid Spanning Tree Protocol) を有効化し、コアスイッチを Root Bridge に固定しています。ユーザー収容ポートには BPDUGuard を設定し BPDU を受信した瞬間にポートを Disable にします。また有線ポートにはブロードキャスト・マルチキャストストームを 30 Mbps でレート制限する Storm Control を設定しています。

障害検知・切り替え時間目標

検証環境では以下の時間で切り替えられることを確認しています。

レイヤ 区間 目標時間
L2 LACP 区間 1 秒未満
L3 IPv4 GW (VRRP) 3 秒未満
L3 IPv6 GW(RA 失効) 18 秒未満

監視・管理設計

コンフィグ管理

機器の設定変更は Configpush を用いて管理しています。機器でコンフィグを保存した際に自動的に GitHub へプッシュされる仕組みで、Juniper は archival configuration 機能、YAMAHA は Lua スクリプトを使って実現しています。これにより常に最新のコンフィグが GitHub 上にバックアップされている状態を維持し、万一の際も迷わず復旧できる体制を整えています(使用したツール類については別で記事が出る予定です)。

監視

監視には Zabbix と Grafana を組み合わせて使用しています。Zabbix は SNMP でルーター・スイッチのメトリクスを収集しアラートを発報します。発報は Webhook を介して Slack のチャンネルへ通知される設定で、各拠点に Zabbix Proxy を置くことでポーリングの負荷と遅延を分散させています。Grafana は正常性確認のためのダッシュボードとして活用しました。

また、AP の監視は Juniper Mist Cloud のダッシュボードで行い、Mist 側の Webhook をパースして Slack へアラートを転送する仕組みも構築しています。さらに今回はシスコさんより ThousandEyes と Splunk の提供を受け、外形監視やトラフィック分析にも活用しました。

テスト構成

本番前の検証は主にさくらインターネット本社のラックを使って行いました。本番と同じ機材を使って段階的に構成を積み上げていく方式で、最終的に JAMBASE 3F の本番環境がそのままラックに残る形で完成させました。回線は本番でも使用した OCX 光のほかにラックまで引かれた BIGLOBE 光も使用し、3 会場の検証を同時に進めていきました。

検証環境

検証は大きく 5 フェーズに分けて進めました。

〜1/6:コングレ+JAMBASE 4-6F 検証 最初にコングレ向けの RTX3510×2 と EX4000 の VC 構成を立ち上げ、VRRP・DHCP の動作確認を行いました。同時に JAMBASE 4-6F 向けの RTX1300 や BIGLOBE 光を使ったインターネット接続確認もこのフェーズで実施しています。

1/6〜1/9:JAMBASE 3F 本番構成追加 コングレ検証と並行して JAMBASE 3F の本番環境を構築しました。OCX 光の接続と Zabbix による監視構成が動作することを確認しています。

1/10〜1/19:AP 追加・SSID 検証 Raspberry Pi を使った AP 接続の確認と、テスト用 SSID での通信確認を実施しました。Mist Cloud による AP 管理や Rogue AP Detection のアラート動作もこのフェーズで検証しています。

1/19〜1/29:EtherIP 追加 本番で使用する NEC IX2207 を 2 台接続して EtherIP トンネルの検証を実施しました。MSS の値が正しく clamp されているかの確認や、BVI Interface と VLAN 20 の untagged 設定が意図通りに動くかの確認がこのフェーズのメインでした。

1/29〜:本番構成完成 IX-C-01/02/03 の 3 台構成で本番を想定した EtherIP トンネルを張り、実際に壁コン越しに VLAN Tag が通ることを確認して検証を完了としました。

ちなみに検証中のラックはほぼすべてのスペースが使用されており、写真のようなとても綺麗な姿になっています。

検証中のラック

ホットステージ

本番機器が会場に搬入された後、本番 3 日前からホットステージを実施しました。ホットステージでは到着した機材の開梱作業やコンフィグ投入、本番と同じ機器を用いて再び本番同様の構成を組み上げ検証を行ったほか、チーム横断でのカオステストも行いました。

まず BB チーム内では本番機器を使って VC の再構成と動作確認を実施しました。事前検証では別の機器で代用していた部分も多く、実際の EX4400-48F 同士で VC を組んだ際の昇格挙動や LACP の挙動を改めて確認しています。RTX3510 についても 2 台での VRRP 切り替えを実測し、IPv4 で 3 秒以内・IPv6 の RA 失効経由で 18 秒以内という目標を満たすことを確かめました。

続いて AP チームおよびサーバーチームと協力し、チーム横断での動作・冗長性確認を実施しました。具体的にはルーターのトンネルや AP を意図的にシャットダウンし、AP 接続・DHCP 払い出し・インターネット疎通がそれぞれどのような挙動をし、障害時の対応を確認しました。

ホットステージでは本番機器に使用する VC ポートが 40G での接続になることの確認が漏れていたため急遽手配したことや、スイッチの SFP+ と SFP ポートの配置確認が漏れていたため 10G でリンクアップしない事象があり、本番同様の機器を用いて再度検証を行った意味を感じました。

振り返り

本題とはそれますがチーム振り返りで出た良かった点・改善点から今後にも活かせそうな内容を軽く紹介します。

良かった点

  • タスク管理

    • 何のタスクが残っているのか、いつまでに終わらせるべきか、そのタスク同士がかかわりがあるのかが GitHub を使ってちゃんと管理できていたのはよかった
    • → 今回は GitHub Project を用いて issue でタスク管理を行っていました。誰が何をやっているのかがパッとわかり、お互いを助け合いながら進められたと思います。
      GitHub Project の様子
  • 検証

    • 全会場の検証を事前に完了させられた
    • チーム関係なく来れる人がさくら本社に来て作業できていた
    • → さくらインターネットに検証環境があったのは今回の NOC の特徴でもある「準備を頑張る」の根幹でした。チームメンバーから大好評でした。もしなかったらどうなっていたことやら……
  • チーム編成

    • チーム全体を俯瞰的にみて支えてくれる人の存在が大きかった
    • みんなタスクに夢中になると自分達が今何をやっていて何を目標にしているのかがだんだん分からなくなってくる
    • → 今回はタスク消化というよりもマネジメントを重点的に担ってくれる人がいました
  • ツール類

    • ネットワークの一次情報が NetBox に集約されていた
    • NetBox を信頼できる情報源として使用し、API を使用して様々なツールが自作された
    • → 必ず NetBox にデータを入力するようになったので、一次情報を集約したのは良かったです。NetBox に入力するのが非常に大変という課題は残っています……

改善点

  • チーム編成

    • 今回はチームを組んでから 1 ヶ月後にチームメンバー全員が集まるケーブル講習会が実施された
    • ここまではオンラインで作業するしかなく、チームとしての意識が希薄だったこともあり作業を進めるのが難しかった
    • 住んでいる場所が離れているという問題はあるが、なるべく早めにオフライン作業会を設けるべきだった
    • → 非常に難しい問題ですが、このような即席のチームではまずチームを作ることが重要であると感じました。
  • リモートでの作業

    • 特に作業にあまり慣れていないメンバーは 1 人で作業を進めるのが難しかった。
    • ボイスチャットや画面共有等をもっと活用し、チームメンバーと今何をしているかをリアルタイムに共有できたかもしれない
    • → ミーティングは計 7 回行ったものの、もっと各メンバーに寄り添って作業が進められると良かったと思いました。特に共同作業のような時間は積極的に取れば良かったです。
  • 物品管理

    • 付属品を含めて借用物の管理を徹底するべき
    • 最終日のスイッチ類の梱包作業に膨大な労力と時間を費やした
    • 原因は開梱時の写真撮影漏れ・付属品不足がほとんど。ラベルのはがし忘れや箱と中身のシリアル番号の一致不一致も見られた。
    • → 開梱時及び付属品の細かい管理についてマニュアル化・チェックリスト化するべきでした(付属品は別の場所で使いまわしている・もともと入っていなかったのかなど)。また、借用品は大切に扱うことの認識合わせを改めてやるべきでした。

まとめ

本記事では JANOG57 の L2・L3 ネットワーク全体を、物理構成から論理設計、検証・ホットステージまで一通り紹介しました。

今回一番大切にしたことは「つながるネットワークをつくる」ことです。そのために設計は可能な限りシンプルにし、コアは冗長化しつつエッジは切り捨てる、QoS は入れない、プロトコルは実績のある枯れた技術を選ぶといった判断を行い、当日の安定稼働につながったと思っています。

IPv6 については別記事で詳しく書いていますが、マルチプレフィックスを使った負荷分散・冗長化はうまく機能した一方で、クライアント側の実装差異によってアドレス選択の挙動がばらつくという難しさも体験しました。IPv6 がより広く使われる環境に向けてノウハウを積み上げていけたと感じています。

NOC チームのメンバーや機材・回線を提供してくださったスポンサー各社のおかげで今回のネットワークを作り上げることができました。この場を借りてお礼申し上げます。

IPv6 マルチホーム+マルチルーターは難しいという話 - JANOG57 NOC

こんにちは、segreです。

JANOG57 NOC(会場WiFiを提供するチーム)でバックボーンチームのリーダーをやっていて、せっせとバックボーンを作っています。 そんなJANOG57 NOCでの挑戦の一つとして冗長化・負荷分散というものがあります。

NOC構築中にIPv6でマルチホーム+マルチルーターの構成を取ると困ったことになる事がわかったので共有します。解決策があるのなら助けてほしい。

今回の構成

ざっくり今回構想している構成です。

  • 上位回線: IC-01は上位プロバイダーのルーターです。そこからダークを2回線会場に引き込んで接続しています。
  • ルーター: 2台のYAMAHA RTX3510で、RT-C-01とRT-C-02です。SFP+が2つあるのでアップリンク、ダウンリンクそれぞれに10Gで接続しています。
  • コアスイッチ: Juniper EX4400で、SW-C-01とSW-C-02です。Virtual Chassisを組んでいます。まとめてSW-C-COREと呼びます。
  • エッジスイッチ: 可能なものに関してはコアスイッチとLACPで接続しています。実際にはエッジスイッチ配下のスイッチも存在します。ここからAPと接続します。

上位からはそれぞれ異なるPrefix(/64)が払い出されており、この2台のルーターを用いて負荷分散と冗長化を実現するのが今回の目標です。

論理構成

IPv4

IPv4の構成です。 IPv4DHCPVRRPを組み合わせることで冗長・負荷分散を達成しています。

負荷分散は、DHCPスコープを半分に分割し、それぞれのGatewayをRT-C-01とRT-C-02に設定して配布しています。クライアントはリース時間等条件が同じ場合はDHCP Offerを早く返した方のIP/Gatewayを採用するため、自然とトラフィックが分散されます。

DHCPはSW-C-COREでDHCP Relayを設定して、Kea DHCPさくらのクラウドで構築しています。 DHCPサーバーは2つ用意してそれぞれで別のDHCPプールを設定しています。

冗長化は、各ルーターGatewayアドレスにVRRPを設定しています。 以下の記事が参考になります。Active-Standbyで2つのVRRPを組み、VIPを各ルーターに用意しています。片系障害時にはVIPがもう片系に移動することで通信を維持します。

WAN回線障害時に備える(VRRPの 2つのグループで負荷を分散 + フレキシブルLAN/WANポートを使用) : コマンド設定

IPv4論理構成

DHCPプール

実際にチューニング無しでどのくらいGatewayが分散されるのか試してみたところ、大体7:3くらいでした。思ったより偏りますね。

そこで、Kea DHCPのclient-classを使用して、MACアドレスベースで配るDHCPプールを変化させることにしました。

16. Client Classification — Kea 3.0.2 documentation が参考になります。MACアドレスの末尾が偶数か奇数かによって配るGatewayを変化させています。

    "client-classes": [
            {
                "name": "Class-MAC-Odd",
                "test": "match('[13579bdfBDF]', substring(hexstring(pkt4.mac, ''), -1, 1))"
            },
            {
                "name": "Class-MAC-Even",
                "test": "match('[02468aceACE]', substring(hexstring(pkt4.mac, ''), -1, 1))"
            }
        ],

を用いて

    "subnet4": [
        {
            "id": 1,
            "subnet": "10.57.0.0/18",
            "pools": [ { "pool": "10.57.32.1 - 10.57.63.254" } ],
            "option-data": [
                {
                    "name": "routers",
                    "data": "10.57.0.4"
                },
                {
                    "name": "routers",
                    "data": "10.57.0.5",
                    "client-class": "Class-MAC-Even"
                }
            ],

のように設定してやればGatewayが完全に半分に分散されます。やったね。

IPv6

本題のIPv6です。

回線のアドレスとしてIC-01は3fff:1:1:3011::3/64(図中で3011::3)、RT-C-01は3011::11, RT-C-02は3011::12を持っています(これをND Proxyすればいいじゃないかという話なんですが、RTXではRA以外で設定したアドレスはND Proxyできない仕様でした)。

IC-01では以下のstatic routeが入っており各Prefixが各ルーターに分散されています(StaticのNext-Hopのみ変更可能です)。

3fff:1:1:2000::/64 via 3011::11
3fff:1:1:2006::/64 via 3011::12

ルーターはVLAN20としてそれぞれPrefix: 2000::/64、Gateway: 2000::1(正確にはRT-C-01のLink-Local Unicast)Prefix: 2006::/64、Gateway: 2006::1 を下位にRouter Advertiseします。

RT-C-01と02はそれぞれ別のRAを返すためWiFiクライアントには2つのPrefixが割り当てられます。 この構成を取ることによって、クライアントが自律的にSource AddressとGatewayを選択することでルーターの負荷分散を図ること、片系が落ちても別のPrefixを用いることでもう片系に切り替わる冗長性を担保することを目的としています。

IPv6論理構成

実際にWiFiに接続されたRaspberry Piの様子です。想定通り2つのPrefixのアドレスがついていることがわかります。

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether dc:a6:32:91:cd:75 brd ff:ff:ff:ff:ff:ff
    inet6 3fff:1:1:2006::cd75/64 scope global dynamic mngtmpaddr proto kernel_ra
       valid_lft 2591860sec preferred_lft 604660sec
    inet6 3fff:1:1:2003::cd75/64 scope global dynamic mngtmpaddr proto kernel_ra
       valid_lft 2591547sec preferred_lft 604347sec
    inet6 fe80::cd75/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever

また、想定通りGatewayが2つ設定されています。

3fff:1:1:2003::/64 dev wlan0 proto kernel metric 256 expires 2591976sec pref medium
3fff:1:1:2006::/64 dev wlan0 proto kernel metric 256 expires 2591819sec pref medium
fe80::/64 dev wlan0 proto kernel metric 256 pref medium
default via fe80::34ef dev wlan0 proto ra metric 1024 expires 1776sec hoplimit 64 pref medium
default via fe80:34e7 dev wlan0 proto ra metric 1024 expires 1619sec hoplimit 64 pref medium

ルーターでIC-01向けに疎通を確認して(RTXでは ip keepalive)、ICMP Replyが3回連続返ってこなかった場合にdefault-lifetimeとpreferred_lifetimeを0としたRAを広告することにより(RTXではLuaスクリプトにより実現)正常に片系にトラフィックが寄ることを確認しました。これにより冗長性は確保されています。

各クライアントは例えば図中のphone1は

2000::10/64 via 2000::1
2006::10/64 via 2006::1

というアドレスを付けているので、Source Addressとして 2000::10/64 を選択した場合には 2000::1 であるRT-C-1をGatewayとして出ていけば負荷分散も実現できるはずでした。

発生した問題

この設計の致命的な問題は、PrefixとGatewayが紐づいているという勘違いです。

2000::10/64 via 2000::1

のように記述しましたが、実際にRAにより取得される情報はPrefixが2000::/64であることとGatewayとして2000::1を設定することです(その様子は先程のRaspberry Piでも見て取れます)。 そのため、Source Addressに2000::10/64を選択した場合に2006::1であるRT-C-02をGatewayとする可能性もあるということです。

実際にRaspberry Piでインターネット向けにpingを実行するとSource Addressは 3fff:1:1:2006::cd75Gateway3fff:1:1:2003::1 (RT-C-01, 正確にはLink-Local Unicast) を選択していることがわかりました。今回上流はPrefix FilterやuPRF等を実装していないため、このようなねじれが発生しても即座に通信不能になることはないのですが、各ルーターでStateful Firewallをかけた場合に通信不能になることが想定されます。

なお、Source Addressの選択についてはRFC6724 Default Address Selection for Internet Protocol Version 6 (IPv6) の5. Source Address Selectionに言及がありますが、Gatewayに紐づいたPrefixを使用するといったルールは存在しません。

また、この問題はRFC8028 First-Hop Router Selection by Hosts in a Multi-Prefix Networkの3.2で言及されています。

A host SHOULD select default routers for each prefix it is assigned an address in.

しかしどのOSも実装が進んでいないのが現状のようです。

調べてみたところ、本事象の解決を試みるInternet-Draftは複数提出されていますがいずれも進展はないようです。

draft-gont-6man-rfc8028-update-00

draft-link-6man-gulla-01

解決策

根本的な解決策はルーター側からクライアントが例えばRT-C-01から割り当てられたPrefixをSource Addressに使用するときにGatewayをRT-C-01とするように強制するといった挙動をすることです。ただし、現在そのような実装はないようです。

そのため、現実的なラインとしてはStateful Firewallを未実装にする、もしくはRT-C-01, 02間を接続して正しいGatewayを通るようにルーティングするといった対応が必要になります。

もっと良い解決策をお持ちの方はぜひ教えて下さい。

最後に

IPv6マルチホームは難しいですね。

最終的にどのような実装を行ったか、どのくらいトラフィックが分散されたか等はJANOG57の以下の登壇プログラムにてお話する予定です。事の顛末が気になる方はぜひ議論に参加しに来てください。Day3の最後のプログラムです。

イベントネットワークの最前線を語ろう ― JANOG57会場ネットワークの知見とこれから - JANOG57 Meeting in Osaka

ちなみにこれはコングレB2Fという本会議場がある会場のネットワークですが、今回のJANOG57では3会場を使うので、各会場に別の回線が引かれています。そのため、同時に3つのNOCをこなしているようなもんです。大変!覚悟を持って頑張っていますが、優しくしてください。

当日は慌ただしくしているかもしれませんが、お暇なときにNOCルームにも遊びに来てくださいね。NOCツアーもあります。

2025年振り返り - 海外進出と離島進出

2025年振り返り

例によってコミケ帰りの電車の中で迎えた2025年。
今までで一番時間があって一番あくせく働いていた1年だった。 いっぱい海外へ行っていっぱい離島へ行った。 色々な経験をした一年だった。

1月

卒論。 2024年にほとんど何もやってこなかったツケが回ってきた。 とは言えあまり修士から研究室が変わることが決まっていたのであまりやる気が出ずとりあえずの成果で提出してしまった。 人と比べるとかけた時間は少なかったんだろうな。

1月末にはJANO55が京都で開催されたので一般参加した。 BoFを1つ主催していたので軽く話した。

釣りには高島と丹後と武庫川に行っていた。

2月

APRICOTに参加した。場所はマレーシアのペタリンジャヤ。 今後の活動の1つの転機だった気がする。
これまでちょこちょこ海外のインターネットコミュニティには参加していたけど、ピアリングミーティングばっかりだった。 APRICOTではそれに加えてLTで登壇してHomeNOCの活動について紹介した。海外のインターネットな皆さんは暖かく迎え入れてくれていっぱい話しかけてくれた。自分の今後の活動の方向性が定まるとともに団体メンバーとしての自覚が明確に芽生えた気がする。

2月中旬に初離島の屋久島で8泊車中泊してイカ釣りをした。2.2kgのイカが釣れた。 最終日は飛行機が欠航して千年杉の年輪の数数えチャレンジを1時間以上かけてやった。

3月

ICTSCの決勝。 去年が5位だったので今年もそのくらいかなと思っていたけど調子よく解けて2位になった。 今年も参加しているけどどうかなあ。

あと卒業した。

この月は一度も釣りに行っていない。すごい。

4月

大学院に入学した。 アルゴリズム系からネットワーク/セキュリティ系の研究室に移った。

台湾のNOGであるTWNOGへ参加した。 台湾の人とたくさん交流できた。来年の目標はHomeNOC台湾進出。 台湾は若手のエンジニアがいっぱいいて活気のあるコミュニティだった。

今年はサークルの新歓にあまり顔を出さなくなった。もう自分がやらなくてもいいくらい新しいサークルになった気がする。今後は技術やりたい人と一緒にのんびり技術やっていこう。

釣りには丹後と上五島に行った。化け物がかかったけど取れなかった。

5月

月の頭に誘ってもらって甲子園へ阪神戦へ。 テレビではずっと見ていたけど甲子園へはあまり行っていたかった。これを機に頻繁に行くようになった(今年は7回くらい?)。

あとは万博行ったりインターンの面接したり。

釣りは初離島のトカラ列島悪石島。 悪のマークのTシャツをその直後にテレビでいっぱい見るようになった。買っておけばよかった。

6月

頭にQUNOG行った後にHomeNOCと繋がりのある麻生情報ビジネス専門学校へ行って軽く講義をしたりした。

BBIXでバイトを始めた。

釣りはいつもの対馬へ5泊車中泊

7月

Internet Week ショーケース in 奈良でNOCリーダーをやった。 大したことはしてないけど障害なく終えられたので目標は達成。

そしてフィリピンのNOGであるPhNOGへ参加した。フィリピンは運用レベルが高くなくHomeNOCの拠点でも良く障害が起きている。そのため多くのゲストを呼んで基礎レベルからインターネット技術の勉強が行われていた。

あとはInternet Weekのプログラム委員へ参加するために東京に行ったり、IETFハッカソンに参加したり。

最後にJANOG56の島根へ弾丸夜行バス旅。 かっちょいいこと言ってるけど多少収穫のある回になった気がする。

釣りは琵琶湖に流れる川へ鮎釣りに。

8月

インターンが始まった。 1ヶ月x2を間なしでやったので結構大変だった。 1社目は8月3週目から9月2週目までLINEヤフーさんでネットワークとソフトウェア開発を行った。技術ブログも書いたんだけどまだ出ていない。

釣りは初離島の奄美大島&加計呂麻島で7泊。あとは鮎釣りや大阪湾。

9月

2社目は9月3週目からサイバーエージェントさんでネットワークにまつわるソフトウェア開発を中心に東京で1ヶ月。 東京にいる人と会って博物館巡ったりBBQしたりと結構幸せだった。 記事も書いた。 https://developers.cyberagent.co.jp/blog/archives/59362/

10月

東京にいるついでに南極観測船しらせを見に行った。よりもいを見てからずっと行きたいと思ってたので目標達成。

長かったインターンも終わり、一息つくまもなくInternet WeekとJANOG57のNOCがほぼ同時に始動して大変だった。

10月末には香港のNOGのHKNOGとマニラのPeering Asiaへ合計1週間ほど。HomeNOCとして香港拠点設立を見据えた交渉をたくさんした。最終的には香港拠点は難しそうだったけど、調達交渉のさわりを経験できて勉強になった。香港の人たちはホスタビリティが高くHKNOGの翌日には香港市街を1日案内してくれた。

釣りは大阪湾に2回行ってたくさんサゴシ釣ったのと5泊車中泊上五島へ。

11月

就活が始まって就活が終わった。

Internet Weekでまるっと1週間ほど。NOCをやった。安定してたけどあまり時間を割けなくて自分としてやりたかったことが全部できたわけではなかった。勿体無い。プログラム委員も掛け持ちでQUICのプログラムを担当した。

釣りは3泊対馬と丹後へ。3泊とは思えないいい釣果だった。

12月

RubyKaigiの下見で函館に行っていたら地震に直撃した。

CKP九州連携研究会2025で発表した。

JANOG NOCでめちゃめちゃ働いている。

今はスリランカにいる。

釣りは12月頭に初離島トカラ列島口之島へ3泊。

まとめ

今年は大小合わせて19のイベントに参加し、そのうち海外イベントが5つだった。発表の機会をもらえることも増えたし、何より海外を含めたインターネットに関わりたいと思うようになった。

NOCはIWSCとIWと今やっているJANOG57。J57でやり切って一旦終わりにしたいな。

釣りは合計で8回九州へ遠征に行ったらしい。行きすぎ。 いつも行ってる対馬・五島は程々にして新しい離島を回れたのは新鮮で楽しかった。自分の足で歩くことに意味がある。

来年

来年はひとまずJANOG57に照準を合わせて覚悟を持ってやり切りたい。NOCもプログラム委員もプログラム発表もBoFも控えてる。倒れないかが心配。

それが終われば今年はじっくり技術をやりたい。引き続き海外へはコミットしていきたいけどNOCなどは控えめにしようかな。自宅ネットワークもアイデアが溜まってるし、ネットワークばかりやってきたのでソフトウェアを書きたくなったきた。英語ももっと磨こう。

あとは釣り。今年も散々行ったけど来年は最後の一年。今年以上に色々行くかもしれない。後悔しないよう結果が欲しい。

Shirankedo NOCで見えてきたeduroam/OpenRoaming運用ノウハウと課題

お久しぶりです。id: segre です。

10/8に開催された BAKUCHIKU BANBAN #2 というイベントで「Shirankedo NOCで見えてきたeduroam/OpenRoaming運用ノウハウと課題」というタイトルで発表しました。 主に会場NOCにおいて eduroam/OpenRoaming を提供するための知見と困りごとの共有のためにお話しさせていただきました。 本記事ではスライドの補足と参加者の方とのディスカッション等をレポートしようと思います。

Team ShirankedoのNOC活動

Team Shirankedoとは関西を中心として、イベントやカンファレンスにて会場WiFiを提供するNOC(Network Operations' Center)を起点としたネットワーク・インフラエンジニアのコミュニティです。 関西の学生の育成を目標の1つとしており、これまで25名ほどの学生と大人のサポートによって以下3度の会場NOCを提供してきました。 「失敗してもOK。なんか上手く行ったわ、知らんけど。」を合言葉に、誰でも気軽に参加できるコミュニティを目指しています。 Facebookのページもあるのでよろしければ(リンク)。

Team ShirankedoのNOC活動

eduroam/OpenRoamingとは

eduroam

eduroamとは教育・研究機関の間でキャンパス無線LANの相互利用を実現する世界規模のローミングサービスです。基本的なコンセプトは共通SSID “eduroam” によって同一IDで自動的に認証・接続できるというもので、1つのアカウント情報だけでeduroam提供下であれば世界どこでも接続することが可能です。 eduroamは欧州TERENA(現GÉANT)が開発・運用しており、2002年に開始され、現在世界106か国で運用されています。 日本では2006年から国立情報学研究所(NII)が「eduroam JP」として運用 を開始しており、現在450以上の大学・機関が参加しています(発表では900と言っていましたが数え間違いでした。ごめんね)

技術的にはIEEE802.1X/EAP/RADIUSを用いたシンプルなものとなっています。技術要素及び運用に関してはRFC7593 - The eduroam Architecture for Network Roaming に記載があるのでご覧ください。基本的な流れは、まず利用者がアクセスポイント(AP)に接続するとIEEE 802.1Xの仕組みで認証が開始されます。次に、利用者の端末と所属機関の認証サーバー間でEAPを用いた認証情報のやり取りが行われ、その通信はRADIUSプロトコルによって安全に中継されます。最終的に認証が成功すると、APが通信を許可し、利用者はネットワークに接続できるようになります。

eduroamの認証は図1のようにRADIUS Proxyingによって支えられています。eduroam参加団体であるIdentity Provider(以下IdP)はRADISU Serverをeduroamネットワーク接続することができます。そして、会場NOCを含むAPを設置してeduroamを提供する立場であるService Provider(以下SP)は、IdPを介してeduroamネットワークへ接続します。

eduroamユーザーはある1つの機関で認証情報を登録しておけば、他のIdPと接続しているSPに接続(ローミング)しても、eduroamネットワークを経由して認証情報の登録されているRADIUS ServerまでProxyされます。例えば、kyoto-u.ac.jpのアカウントを持っている yoshikawa@kyoto-u.ac.jp のアカウントがオーストラリアの大学UnivAに接続したことを考えると、UnivAのRADIUS Serverは@以降のドメイン(realm)であるkyoto-u.ac.jpを見て、AU→APAC→JP→kyoto-u.ac.jpへとルーティングしていき、最終的にkyoto-u.ac.jpで認証されます。このように1つのアカウントでeduroam加盟ネットワークに接続することができます。

余談ですが、.jpや.auのようなccTLDの場合はTLDを見てルーティングすることができますが、.comや.netのようなgTLDの場合は国を特定することができないため、静的にルートを設定する必要があり、管理コストがかかっているようです。

図1: RADIUS Proxying - eduroam

OpenRoaming

OpenRoamingは安全でシームレスなグローバルWi-Fiローミングを実現するための国際的な枠組みです。基本的なコンセプトとしてはeduroamと同様、1つの認証情報でどこでも接続できるというものですが、eduroamが主に学術・研究機関向けであったのに対してOpenRoamingは一般企業が多く参加しており誰でも使える枠組みを目指していることが伺えます。

2020年3月にWBA(Wireless Broadband Alliance)が主導して開始され、日本ではCityroamが2020年11月にImplementorとして参加し、国内初のOpenRoamingサービスを開始しています。技術要素としてはeduroamと同様のIEEE802.1X/EAP/RADIUSに加えてシームレスな自動接続のための技術であるPasspointを使用しています。Passpoint(Hotspot 2.0)は、Wi-Fi Allianceによって策定された技術規格で、対応するデバイスWi-Fiネットワークを自動的に発見し、ユーザーの操作を介さずに接続するための仕組みです。

具体的には、一度プロファイルをインストールしておけば、デバイスはPasspoint対応のアクセスポイントに近づくと、そのネットワークが自分の利用資格情報(IdPとの契約情報など)と互換性があるかを照会します。互換性があれば、ユーザーがSSIDを選択したりパスワードを入力したりすることなく、バックグラウンドで認証(EAP)が行われ、暗号化された安全な接続が確立されます。これにより、Wi-Fiエリアに入るとシームレスにインターネットに接続される体験が実現します。

OpenRoamingへの接続方法はF@Lさんの 「OpenRoaming (Passpoint) の眺め方。」 にて複数挙げられていますが、例えば TOKYO FREE Wi-Fi (OpenRoaming) のプロファイルをインストールすることができます。実際に使ってみると大阪駅、万博、東京駅等意外と繋がることが分かるかと思います。

会場NOCでeduroam/OpenRoamingを吹くまで

会場NOCでeduroam/OpenRoamingを提供するには、大きく「機器を探す」「IdPを探す」「機器を設定する」の3つの手順が必要です。

機器を探す

eduroamを提供するためにはIEEE802.1XとWPA2/3-Enterpriseに対応したAPが必要です。こちらは多くのAPが対応しておりハードルは高くないかと思います。

OpenRoamingはこれに加えPasspoint (Hotspot 2.0) Release 1の実装が必要となります。具体的な機種名は後章で紹介します。

IdPを探す

IdPを見つけるのが最大の障害となってきます。eduroamはeduroam JP加盟機関である大学や研究機関が提供可能です。加盟機関は こちらのサイト からリストを見ることができますが、研究機関であることもあり会場NOCへ提供してくれる所は多くないように思います。Cityroam加入団体も提供可能であるためこちらにお願いするのが現実的です。

OpenRoamingに関しても、Cityroam加入団体の他、Cisco Spacesを用いることでも提供可能です。

私が知る限りでこれまで会場NOCで使用されたIdPもスライドに記載しています。

提供可能なIdP

京都大学岡部研

私の現在所属する研究室です。Cityroam加盟事業者であるLocal24へのRADIUS Proxyを構築しています。そのため、ここをProxy先に設定することでeduroam+OpenRoamingへの提供が可能となります。 連絡先はX(@_marokiki)またはSlack等でお願いします。なお、会場-岡部研はRadSec、岡部研-Local24はRADIUSとなっています。

株式会社輝日

私が関わったNOCでは利用したことはありませんが、SRE Nextを例として積極的に提供していただけるようです。輝日さんは個人へも提供を行なっており、自宅でeduroam/OpenRoamingを吹いている方は大体ここにお世話になっていると思います。RadSec提供可能とお聞きしましたが詳しくはお問い合わせください。

Cisco Spaces

Cisco Spacesは、Ciscoが提供するクラウドプラットフォームを利用してOpenRoamingのIdP機能を実現する選択肢です。この方法では、自身でRADIUSサーバーを用意する必要やIdPとの調整が必要ないため、手軽に導入できるという利点があります。

ただし、注意点として、Cisco Spacesで提供できるのはOpenRoamingのみとなります。多くの利用者の利便性を考慮し、CityroamではeduroamとOpenRoamingの併用提供を推奨しているため、この点は会場NOCの要件と照らし合わせて検討が必要です。もう一つの特徴として、認証トラフィックが国外のAWSシンガポールリージョンを経由するため、国内のIdPを利用する場合と比較して接続までの時間が長くなる傾向にあります。具体的な初回接続時間を比較すると、Cisco Spacesでは約10秒を要するのに対し、岡部研のような国内プロキシを利用した場合は約5秒となります。

2回目以降の再接続時には、PMKSAキャッシングという技術により認証が高速化されます。これはAPと端末が一度確立した暗号化キーを一定期間キャッシュし、認証プロセスの一部を省略する仕組みです。このPMKSAキャッシングが有効な場合でも、Cisco Spacesでは約5秒、岡部研経由では約2秒と、依然として速度差は見られます。

機器を設定する

機器によって異なるため、詳しくはドキュメントを参照してください。 私の研究室で利用しているCisco Meraki MR44の場合は、RADIUS Clientの機能が備わっているため、自前でRADIUS Proxyの構築をしなくともダッシュボードでIdPのアドレスを指定するだけで設定ができます。

なお、以下の「Passpoint によるWi-Fi 環境の構築と運⽤- 2023 - 」は大変おすすめです(ステマではない)。2023年時点でのほぼ全てのPasspoint対応ベンダの設定例が書かれています。

booth.pm

Passpoint設定

構築例

eduroam/OpenRoamingの構築例としてInternet Week ショーケース(IWSC) in 奈良の例を紹介します。IWSC会場、京都大学岡部研、Local24の3拠点が存在し、RADIUSトラフィックはRadSecにより会場のMeraki MR44からインターネットを経由して京都大学岡部研へ運ばれます。そこからLocal24へRADIUSで接続され、eduroam/OpenRoamingのネットワークへと抜けていきます。 認証完了後、ユーザートラフィックは通常通りISPを経由して抜けていきます。

構築例

その他注意事項

その他にeduroam/OpenRoamingを吹く際に気を付けるべきことを紹介します。まず、RADIUSに関してですが、CityroamではRadSec(RADIUS over TLS)の使用が推奨されています。RadSecは、RADIUSTLSで暗号化して通信する仕組みです。従来のRADIUSUDP上で共有秘密鍵のみに頼って通信を保護していたのに対し、RadSecはTCP上で動作し、サーバー証明書を用いて通信経路全体を暗号化します。これにより、ユーザーの認証情報などが含まれるRADIUSメッセージがネットワーク上で盗聴されたり改ざんされたりするのを防ぎます。RadSecの利用にはAPとRADIUS Proxyで相互に証明書を検証する必要があるため、互いにCAの証明書を登録する必要があります。そのため、IdPとのやり取りも必要となりますが、RADIUSの欠点を補う強力なソリューションです(RADIUSの問題については後述します)。CityroamではRADIUSは段階的に廃止していく方針が示されています。

また、認証ログ、DHCPログ、NAPTログなどのログを最低3ヶ月保持する必要があります。これは誰でも接続可能という特徴から、何か問題が起こっても特定可能とするためと考えられます。詳しくは Cityroamサービス技術・運用基準 をお読みください。

運用上の課題

RADIUS Timeout

NaniwaNOG3ではRADIUSの成功率が77%となり、ほとんどのエラーがRADIUS Timeoutとなりました。対して、IWSC奈良ではRADIUSの成功率は93%であり、同じIdPを使用しているのにも関わらず大きく差が生じました。

詳細な原因を特定するまでには至っていませんが、おそらくEAP-TLSを用いることでクライアント証明書を含むパケットがMTU(1500Bytes)を超え、フラグメンテーションが発生しているのではないかと考えています。 RADIUSUDPを使用するため、フラグメンテーションが発生するとMTU の不一致などによる認証パケットドロップや経路上でのパケットドロップ、RADIUSサーバーでの再構成の失敗などからRADIUS Timeoutが発生する可能性があります。実際、こちらMerakiコミュニティでも同様の事象が報告されている他、RFC7593にも同様の言及があります。

RADIUS Timeoutの例

この事象への対策としてはRadSecの使用が考えられます。RadSecはUDPではなくTCPを使用するため、UDPで発生するようなフラグメンテーションを抑え、通信の信頼性を向上させることが期待できます。 ただし、OpenRoamingにおいては認証先はプロファイル配布元のIdPとなるため、APから提供元IdP、Cityroamネットワークを経由して配布元IdPまで全てRadSecで接続されている必要があります。

また、IdP側でもRSAではなくECDSAのクライアント証明書を使用してパケットサイズを抑えることができます。IdPのドキュメントとして、 GÉANTのwiki が参考になります。そこに以下のような記載があります。

RSA certificates (so named after the key algorithm of the key material in the certificate) have long been the standard for certificates across the world. However, as key sizes (below) grow, so does the certificate size. As the certificate sizes increases, the chances of RADIUS packets being fragmented increase, which in turn causes issues with some firewalls performing packet or SSL/TLS inspection and UDP fragment DDoS protection (Microsoft Azure cloud services for example will throw away UDP packets when packet fragments do not arrive in the specific order that they should be reassembled in).

The vast majority of modern devices and operating systems support ECC certificates (also known as ECDSA certificates). ECC certificates are based on elliptic curve cryptography (hence the name), which uses maths behind defining specific curves to generate keys, which in turn are a lot smaller (but not less secure than large RSA keys) and are less likely to suffer from fragmentation. If your users are all using modern devices (Android 8, Windows 8, iOS 9 and above), you probably can/should change your server certificate to one using ECC, even if the root certificate is an RSA certificate.

日本語訳するとこんな感じ

RSA証明書(証明書内の鍵素材に使用される鍵アルゴリズムにちなんで命名)は、長年にわたり世界中の証明書の標準規格として用いられてきました。しかし、鍵サイズが増大するにつれて(後述)、証明書のサイズも比例して大きくなります。証明書サイズが増加すると、RADIUSパケットが断片化される可能性が高まり、これが原因で、パケット検査やSSL/TLS検査、UDP断片化DDoS保護機能を備えたファイアウォールで問題が発生する場合があります(例えばMicrosoft Azureクラウドサービスでは、パケット断片が本来再構築されるべき特定の順序で揃わない場合、UDPパケットを破棄します)。

現代のほとんどのデバイスおよびオペレーティングシステムは、ECC証明書(ECDSA証明書とも呼ばれる)をサポートしています。ECC証明書は楕円曲線暗号技術を基盤としており(これが名称の由来です)、特定の曲線を定義する数学的原理を利用して鍵を生成します。この鍵はRSAの大規模鍵に比べてはるかに小さいサイズでありながら(ただしセキュリティ強度は劣りません)、断片化の影響を受けにくいという特徴があります。もしユーザー全員が最新デバイス(Android 8、Windows 8、iOS 9以降)を使用しており、ルート証明書がRSA形式であっても、サーバー証明書をECC形式に変更することを検討すべきです。

運用上困ったこと

その他、eduroam/OpenRoamingを運用する上で困ったことをいくつか挙げておきます。良いアイディアを募集しています。

第一に、トラブルシューティングの難しさが挙げられます。eduroam/OpenRoamingの認証は、多くの場合、複数の組織のRADIUSサーバーをプロキシとして多段に経由します。そのため、認証失敗などの問題が発生した際に、どの区間で問題が起きているのかを特定する切り分けが非常に困難になります。さらに、参加する組織によって使用されるrealm名や対応するEAPの方式、配布されるプロファイルの内容が異なるため、原因の特定を一層複雑にしています。

次に、IdPとの事前の接続調整が必須である点です。会場NOCのように一時的にネットワークを構築する場合、その都度、利用するIdPとの間でRADIUS/RadSecの接続設定や疎通確認といった調整作業が必要となり、これが運用上の負担となります。

最後に、不正利用時の追跡などを目的として、Cityroamでは認証ログを3ヶ月以上保持することが求められます。しかし、数日で設営・撤去される短期間の会場NOCにおいて、この長期間のログ保持はやや面倒です。

疑問点

事前にいくつか想定質問を考えていたのでそれに触れたのち、会場からいただいた質問も記載しておきます。

セグメント,VLANを分ける必要はある?

eduroamやOpenRoamingを提供するために、必ずしも専用のセグメントやVLANを分ける必要はありません。もちろん、ネットワーク設計として分離すること自体は問題ありません。例えば、eduroam/OpenRoamingのトラフィックに対して固有のACLQoSを適用したい場合には、VLANを分けることが有効な手段となります。

ただし、これらのネットワークはイベントの参加者とは無関係な eduroam/OpenRoaming ユーザーも接続できる可能性がある、という点には注意が必要です。

SSIDはどうしたらいい?

設定すべきSSIDは以下の通りです。

  • eduroam: eduroam
  • Cityroamを利用する場合: cityroam
  • OpenRoaming: 特に決まりはありませんが、Event-WiFi_OpenRoamingのようにOpenRoamingという文字列を含んだSSIDが多いように思います。

ユーザー名がRADIUSパケットに乗って、訪問先の機関に知られてしまうのはプライバシー的に問題ないのでしょうか?

Anonymous Outer Identityという仕組みによってプライバシーを保護することができます。 認証パケットが訪問先のネットワーク(会場NOCなど)を通過する際には、anonymous@kyoto-u.ac.jp のようなrealmのみが記載された匿名のOuter Identityが使用されます。実際のユーザーIDであるInner Identityは、暗号化されたEAPトンネルの内部で扱われ、ユーザーが所属する本来のIdPにしか通知されません。 これにより、訪問先の機関は利用者のrealmを知ることはできますが、個人のユーザー名を特定することはできず、プライバシーが守られます。

Anonymous Outer Identity

OpenRoamingでつないでくる人で、困ったことはありますか?(会場より)

基本的にカンファレンス参加者が接続することを想定しているため、特段気になったことはないです。

中間者攻撃がされる可能性はありますか?(会場より)

例えば kyoto-u.ac.jp の認証リクエストに対して全て許可する偽物がつくられることはないのか?という意図の質問でした。

結論から言うと、クライアントが適切に設定されていれば中間者攻撃を防ぐことができます。 eduroam/OpenRoamingの認証の仕組みはサーバー証明書の検証に基づいています。IdPのRADIUS Serverは信頼されたCAによって発行された自身のドメイン名が記載されたサーバー証明書を提示する必要があります。それに対してクライアントでは、eduroam/OpenRoamingに接続しようとすると、まずIdPのRADIUSサーバーからこのサーバー証明書を受け取ります。クライアント側が適切に設定されていれば、この証明書が「信頼できるCAから発行されているか」そして「認証先のサーバー名が想定通りか」を厳密に検証します。攻撃者が偽のRADIUSサーバーを立てたとしても、kyoto-u.ac.jp のドメインに対する正規のサーバー証明書を用意することはできません。そのため、クライアントは証明書の検証に失敗し、認証情報を送信する前に接続を中断します。

私に代わり会場から上記の趣旨の回答をいただきました。ありがとうございました。

おわりに

本記事では、「BAKUCHIKU BANBAN #2」での発表内容をもとに、会場NOCにおけるeduroam/OpenRoamingの導入ノウハウと、実際に運用して見えてきた課題について共有させていただきました。

今回の発表が、これから会場NOCでeduroam/OpenRoamingを導入しようと考えている方々にとって、少しでも参考になれば大変嬉しく思います。また、運用上の課題については、私たちもまだ模索の最中です。もし同様の課題に直面した方や、より良い解決策をご存知の方がいらっしゃいましたら、ぜひ情報交換させていただけますと幸いです。

最後に、本発表はNOCメンバーや岡部研の方々に大変助けられました。ありがとうございました。

KVMでsystemd-networkdを用いてブリッジ構築をする方法

これはKMC Advent Calendar 2022 - Adventar の9日目の記事です。

昨日はcrashRTさんの「After Effects おすすめチュートリアル」でした。

はじめに

こんにちはこんにちは。KMC2回生のsegreです。昨日まで第45代の副会長をしていました。今年からは副代表としてもう1年仕事をします(何をするのか全くわかっていませんが...)。最近は趣味の釣りもオフシーズンに入り、サーバーの環境構築をしたりLinuCの勉強をしたりとLinuxに浸かった生活をしています。

さて、この記事ではLinuxKVM仮想マシンをsystemd-networkd環境でブリッジを構築し外部と接続する方法についてお話します。

KVMについて

KVM (Kernel-based Virtual Machine) とはLinuxに組み込まれたオープンソースの仮想化ソフトウェアと一般的に説明されます。KVMLinuxカーネルをハイパーバイザーに変換させ、仮想ネットワークカード、グラフィックアダプター、CPU、メモリー、ディスクなどを備えています。

ただし、KVMは仮想化ソフトウェアではなくカーネルモジュールとしてLinuxに組み込まれているものであり、QEMUによるエミュレーションを支援するという説明がより正確なものとなります。この部分の説明は本記事の趣旨とは外れるため詳しくは

QEMU、KVM、libvirtの基礎知識まとめ - えんでぃの技術ブログ などを参照してください。

KVM仮想マシンを作成

今回はこちらのコマンドでUbuntu Server 22.04.1 仮想マシンtest_vmを作成しました。

# virt-install \ 
        --connect=qemu:///system \
        -n test_vm \
        -r 2048 \
        --disk path=/var/lib/libvirt/images/test_vm/root.img,size=20 \
        --check path_in_use=off \
        --vcpus=2 \
        --os-variant=ubuntu22.04 \
        --network network=default  \
        --location /home/segre/Documents/iso/ubuntu-22.04.1-live-server-amd64.iso,kernel=casper/vmlinuz,initrd=casper/initrd \
        --console pty,target_type=serial\
        --nographics \
        --extra-args 'console=ttyS0 115200n8 serial' 

ここでnetwork network=defaultと指定していることに注意して下さい。

networkにdefaultを指定するとどうなるか

network network=defaultと指定すると、仮想マシンが外部ネットワークと通信する際にiptablesのNAT(IPマスカレード)機能が用いられます。

IPマスカレード

IPマスカレード機能を用いると、仮想ブリッジvirbr0を作成し、virbr0に到達したパケットは、送信元IPアドレスを物理NICIPアドレスに変換して外部ネットワークに送信します。

ここでNIC、eth、vnet、brについて説明します。

  • NIC : ネットワークインターフェースカードの略でネットワーク通信に必要なカード型の機器であり、イーサネットを挿すためのコネクタなどが付いています。
  • eth : イーサネットの略でネットワークインターフェースを指します。IPアドレスが割り当てられ、NIC内でのネットワーク通信を担っています。仮想ネットワークインターフェースの場合はveth0/veth1などと表されることが多いです。
  • vnet : タップデバイスを表しています。KVMにおいてホストマシンが仮想マシンに接続するために用いられるデバイスです。
  • br : 仮想ブリッジを表しています。virbrは仮想環境でIP変換を行うためのスイッチ、brは仮想ブリッジを接続するためのスイッチです(後述)。

図からも分かる通り、仮想マシンから外部へ通信することはできますが、外部から仮想マシンに通信することはできません。そのため、外部から通信したい場合はbr0を作成し、仮想ブリッジを構築する必要があります。続いての章ではその方法を説明します。

物理NICを仮想スイッチに接続する

物理NICを仮想スイッチに接続する仮想ブリッジを作成することにより外部と通信することができるようになります。ここではsystemd-networkdによって仮想ブリッジbr0を作成します。なおLinuxでは他にNetworkManagerによって管理する方法もあり、NetworkManagerの場合は設定方法が違うことに注意してください。

仮想ブリッジを作成する

ネットワーク設定の確認をする

まずはネットワークがどのような構成になっているか確認します。 $ brctl show コマンドによりブリッジとそのブリッジに取り付けられたインターフェースを表示することができます。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          XXXX.YYYYYYYYYYYY       yes             vnet3

systemd-networkdによって管理されている場合はvirbr0という仮想ブリッジが表示されていると思います。ここではvnet3というタップデバイスが接続されていることがわかります。インターフェースの詳細を確認するには$ ip link show master virbr0から確認することができます。

続いて仮想マシンのvethがどのタップデバイスに接続されているか確認するためには$ virsh dumpxml VM名を実行して仮想マシンの設定xmlファイルのinterfaceタグを確認します。今回はVMを1つしか作成していないのでtest_vmのveth0がvnet3に接続されているかがわかりますが、VMが複数ある場合はこのコマンドによって確認する必要があります。test_vmxmlを見てみると

<interface type='bridge'>
      <mac address='XX:XX:XX:XX:XX:XX'/>
      <source bridge='virbr0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='vnet3'/>
</interface>

となっていることからvnet3に接続されていることがわかります。

ブリッジを定義する

続いてnetworkファイルを編集していきます。なお、brctlコマンドを用いてブリッジを構築することもできますが、brctlによって作られたブリッジは再起動すると消えてしまうため、今回はnetworkファイルを編集する方法を紹介します。 systemd-networkdではネットワークファイルは/etc/systemd/network/以下に保存されています。

$ ls /etc/systemd/network -l
total 8
-rw-r--r-- 1 root root 223 Aug 23 13:39 eth0.network

eth0の設定ファイルがあることからIPマスカレードが用いられていることがわかります。このファイルの中身を見てみると

$ cat eth0.network
[Match]
Name=eth0

[Network]
Address=XXX.YYY.ZZZ.AA/24
Gateway=XXX.YYY.ZZZ.1

となっています。

ファイル内容を説明します。[Match]セクションにはどのインターフェースを用いているか記述します。Name=とするとデバイス名のリストにマッチします。

[Network]セクションにはDHCHの設定等のネットワークの設定を記述します。Adress=とするとIPアドレスNICに割り当てることができます。また、Gateway=とするとデフォルトゲートウェイを設定できます。

なお、Adress=Gateway=はそれぞれ[Adress]セクションと[Gateway]セクションに入れるのが適切ですが、[Address] が Address キーだけを含み [Route] セクションが Gateway キーだけを含む場合、略式表記として [Network] セクションに Address=Gateway=を記述することができます。

ここからはブリッジbr0を定義していきます。新しいブリッジを定義するためにはnetworkファイルとnetdevファイルを作成する必要があります。ここではbr0.networkbr0.netdevを作成します。

br0.netdevファイルは

$ cat br0.netdev
[NetDev]
Name=br0
Kind=bridge

とするとブリッジbr0を定義できます。

続いてbr0.networkはこれまでeth0.networkに記述されていた内容を書きます。そのため

$ cat br0.network
[Match]
Name=eth0

[Network]
Address=XXX.YYY.ZZZ.AA/24
Gateway=XXX.YYY.ZZZ.1

とするのが適切です。

eth0.networkはブリッジbr0に接続しているため

$ cat eth0.network
[Match]
Name=eth0

[Network]
Bridge=br0

とします。 以上を記述して# sysmctl restart sysytemd-networkdとすると仮想ブリッジを作成することができます。

タップデバイスとブリッジを接続する

最後に先程定義したbr0とタップデバイスvnet0を接続すると通信することができます。VMの設定を変更するためにはxmlファイルを編集します。

# virsh edit test_vmとするとxmlファイルを編集できます。# virsh shutdown test_vmVMをshutdownしてから、ファイル中のinterfaceセクションのに変更します。

<interface type='bridge'>
      <mac address='XX:YY:XX:YY:XX:YY'/>
      <source bridge='br0'/>
      <model type='virtio'/>
 </interface>

以上でブリッジを構築することができます。brctlを確認してみてください。

$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             XXXX.YYYYYYY       no              eth0
                                                                       vnet0
virbr0         XXXX.YYYYYYY       yes

# virsh start test_vmすると、br0がeth0とvnet0をつなぎ、外部から通信できるようになっていると思います。

まとめ

今回はsystemd-networkd環境でKVMで新しくブリッジを作成し外部から通信する方法を紹介しました。

まとめると

  1. NetworkManager/Systemd-Networkd/Netplanかを確認 brctl showip link show master virbr0virsh xmldump [VM] などからネットワーク図作成 systemd-networkd

  2. /etc/systemd/network/ 以下にブリッジ定義 → networkd restart

  3. VM shutdown → # virsh edit [VM] から ... 編集 → VM start

となります。

今後はitamaeを用いたサーバー管理等を勉強していきたいです。 ありとうございました。

明日はtenさんの「『実装意図』を語るために」です。

参考にさせていただいた記事

KVM とは - Linux 仮想化の仕組み | Red Hat

・ QEMU、KVM、libvirtの基礎知識まとめ - えんでぃの技術ブログ

systemd-networkd - ArchWiki