**ISPアプライアンスを「殺す」―eBPF/XDPによる分散型BNGの実装**

2026/01/24 2:29

**ISPアプライアンスを「殺す」―eBPF/XDPによる分散型BNGの実装**

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

新しいオープンソースのブロードバンドネットワークゲートウェイ(BNG)が構築され、eBPF/XDPで高速化されたデータプレーンを直接光線終端装置(OLT)ハードウェア上で動作させています。これにより、高価な中央機器の必要性が排除され、分散型BNG展開がより安価で耐障害性が高く、管理が容易になります。

  • パフォーマンス:eBPF/XDPデータプレーンは、標準Linux上で10–40 Gbpsのスループットを実現し、tcpdump、bpftool、perfといった従来から馴染み深いデバッグツールが使用できます。
  • DHCP & IP割り当て:2層構造のDHCPシステムは、カーネルXDPパスで約45 kリクエスト/秒(遅延≈10 µs)とユーザースペースで約5 kリクエスト/秒(遅延≈10 ms)を処理し、ウォームアップ後に95 %以上のキャッシュヒット率を達成します。デバイス認証はRADIUS時に決定的なハッシュリングIPを割り当て、アドレス競合を防ぎつつDHCP読み取りのみで済ませます。
  • アーキテクチャ:エッジOLT‑BNGはデータプレーンだけを実行し、中央Kubernetes「Nexus」制御プレーン(CRDT状態同期、IP割り当て、設定配布、メトリクス)がそれらを調整します。キャッシュされたセッション、DHCP更新、NAT変換、およびQoS施行はエッジサイトがオフラインでも継続し、コア障害がサービスに影響するのを防ぎます。
  • 実装:1つのGoバイナリにeBPFプログラム(
    dhcp_fastpath.c
    qos_ratelimit.c
    nat44.c
    antispoof.c
    )が埋め込まれ、Linux 5.10+対応のホワイトボックスOLT(例:Radisys RLT‑1600G、約7,400 USD)上で動作します。これらは1,500–2,000ユーザーをサポートしています。
  • 現在のギャップ:デバイス認証(TPM)、IPv6対応、完全なRADIUS計上、および管理UIがまだ追加されていません。プロジェクトはGitHubでオープンソース化されています。

運用者は各OLTにローカルでBNG機能を展開できるため、資本支出の削減、耐障害性の向上、レイテンシの低減、および従来の専有機器と比べたオペレーションの簡素化が実現します。これにより、ブロードバンドにおけるオープンソースネットワーキングの広範な採用への道が開かれます。

本文

私は以前、次世代インフラを構築していたISPスタートアップで働いていました。
その会社は成長できませんでしたが、私たちが解決しようとしていた問題は残り続けました。
そこで数週間かけて、実際には手に入らなかったもの――eBPF を活用したオープンソース BNG(Broadband Network Gateway)を OLT(光線終端装置)のハードウェア上で直接動作させる仕組み―を構築しました。

この記事では、そのアーキテクチャと、なぜ私はこれが ISP のエッジインフラの未来だと考えるかを説明します。


問題点:集中型 BNG がボトルネックになる

従来の ISP アーキテクチャは次のようになっています。

顧客 → ONT → OLT → [BNG 機器] → インターネット
                            ↑
               単一障害点
               高価な専用ハードウェア
               すべての加入者トラフィックがここを通る

DHCP、認証、NAT、QoS といった加入者トラフィックはすべて中央 BNG 機器に流れ込みます。
その機器は数十万ドル規模で、ベンダーサポート契約が必要ですし、単一障害点となります。ダウンすると全員がダウンします。

業界の対策としては、冗長性を増やしたより大きなボックスを購入することが主流でした。
しかし、もしモデルを完全に逆転させたらどうでしょう?


アイデア:エッジへ BNG を分散させる

すべてのトラフィックを中央機器へ集約する代わりに、各エッジサイトの OLT ハードウェア上で直接 BNG 機能を動かすとしたら?

顧客 → ONT → OLT(+BNG) → インターネット
                    ↑
       加入者トラフィックはローカルに留まる
       中央のボトルネックがない
       各サイトは独立して動作する

これは新しいアイデアではありません。ハイパースケーラーがエッジインフラで実践していることと同じです。
しかし ISP が遅れた理由は次の通りです。

  • 従来の BNG ソフトウェアは中央配置を前提に設計されている
  • 状態管理(IP 割り当て、セッション)は分散が難しい
  • パフォーマンス要件が専用ハードウェアを必要とするように見えた

鍵となる洞察は、モダンな Linux と eBPF/XDP が商用ハードウェア上で ISP スケールのパケット処理を実現できるということです。


なぜ eBPF/XDP なのか、VPP ではないのか?

プロジェクト開始時に 2 つの手法を評価しました。

eBPF/XDPVPP
パフォーマンス10–40 Gbps ✓100+ Gbps(オーバーキル)
デプロイメント標準 Linux カーネルDPDK、HugePages、専用 NIC
運用systemd サービス、簡単セットアップ複雑な専用セットアップ
デバッグtcpdump, bpftool, perf など学習曲線が急だが文書化済み

VPP はコア集約に適しています。
しかしエッジサイトでは eBPF/XDP の方がシンプルで十分です。


アーキテクチャ

構築したものは次のようになります。

┌─────────────────────────────────────────────────────────────┐
│  CENTRAL (Kubernetes)                                        │
│  Nexus: CRDT 状態同期、ハッシュリング IP 割り当て           │
│  (制御プレーンのみ – 加入者トラフィックは通らない)          │
└──────────────────────────┬──────────────────────────────────┘
                           │ 設定同期、メトリクス
         ┌─────────────────┼─────────────────┐
         ▼                 ▼                 ▼
   ┌───────────┐     ┌───────────┐     ┌───────────┐
   │ OLT‑BNG 1 │     │ OLT‑BNG 2 │     │ OLT‑BNG N │
   │ eBPF/XDP  │     │ eBPF/XDP  │     │ eBPF/XDP  │
   │ 1500 サブ │     │ 2000 サブ │     │ 1800 サブ │
   └─────┬─────┘     └─────┬─────┘     └─────┬─────┘
         │                 │                 │
    トラフィック ローカル  トラフィック ローカル  トラフィック ローカル
         ↓                 ↓                 ↓
       ISP PE           ISP PE           ISP PE

核心原則:加入者トラフィックは中央インフラを通らない。
中央の Nexus サーバーは制御プレーンだけ(設定配布、IP 割り当て調整、監視)を担当します。


二段階 DHCP:高速パス + 低速パス

性能上重要なのは、多くの DHCP 操作が既知加入者からの更新である点です。これらをカーネル内だけで処理できます。

DHCP リクエスト到着
        │
        ▼
┌───────────────────────────────────────────────────────┐
│               XDP 高速パス (カーネル)                   │
│                                                        │
│ 1. Ethernet → IP → UDP → DHCP を解析                    │
│ 2. クライアント MAC を抽出                            │
│ 3. eBPF subscriber_pools マップで MAC を検索          │
│                                                        │
│ CACHE HIT?                                            │
│ ├─ YES: カーネル内で DHCP ACK を生成                │
│ │     XDP_TX (~10 µs の遅延)                          │
│ └─ NO:  XDP_PASS → ユーザースペースへ                  │
└───────────────────────────────────────────────────────┘
        │ XDP_PASS (キャッシュミス)
        ▼
┌───────────────────────────────────────────────────────┐
│            Go Slow Path (ユーザースペース)             │
│                                                        │
│ 1. Nexus キャッシュで加入者を検索                      │
│ 2. 事前割り当てられた IP を取得                        │
│ 3. 将来の高速パスヒット用に eBPF キャッシュを更新      │
│ 4. DHCP レスポンス送信                                 │
└───────────────────────────────────────────────────────┘

結果

パス遅延スループット
高速~10 µs45,000+ req/sec
低速~10 ms5,000 req/sec

ウォームアップ後のキャッシュヒット率は >95%


IP 割り当て:RADIUS 時点でハッシュリング

設計上の決断として、IP 割り当てを DHCP のタイミングではなく RADIUS 認証時に行いました。

  1. 加入者が RADIUS で認証される
  2. 成功 → Nexus がハッシュリング(決定論的)から IP を割り当て
  3. IP は加入者レコードに保存
  4. DHCP は単なる READ 操作

これにより:

  • 分散 BNG ノード間で IP 衝突が起きない
  • DHCP 高速パスは eBPF 内で完結(ユーザースペースの割り当て判断不要)
  • 加入者は常に同じ IP を取得できる(ハッシュリングの決定論性)

オフライン優先エッジ運用

エッジサイトが中央 Nexus への接続を失った場合、次のようになります。

状況効果
既存加入者セッションeBPF マップにキャッシュされているので継続
DHCP リース更新ローカルで処理
NAT 翻訳維持
QoS 制御継続

低下状態

  • 新規加入者認証(RADIUS が無い) → ローカルフォールバックプール
  • 新規 IP 割り当てはローカルプールへ戻る
  • 設定更新は再接続までキューに入れる

エッジサイトは自律的に動作するよう設計されており、中央の協調は「あると便利」だけです。


実装概要

BNG は Go で書かれた単一バイナリで、埋め込み eBPF プログラムを含みます。

bng/
├── cmd/bng/              # メインバイナリ
├── pkg/
│   ├── ebpf/             # eBPF ローダーとマップ管理
│   ├── dhcp/             # DHCP スロー パスサーバ
│   ├── nexus/            # 中央協調クライアント
│   ├── radius/           # RADIUS クライアント
│   ├── qos/              # QoS / レートリミット
│   ├── nat/              # NAT44 / CGNAT
│   ├── pppoe/            # PPPoE サーバ
│   ├── routing/          # BGP/FRR 統合
│   └── metrics/          # Prometheus メトリクス
├── bpf/
│   ├── dhcp_fastpath.c   # XDP DHCP 高速パス
│   ├── qos_ratelimit.c   # TC QoS eBPF
│   ├── nat44.c           # TC NAT eBPF
│   └── antispoof.c       # TC アンチスポーフィング

実行方法

# 独立モード(ローカル IP プール)
sudo ./bng run \
  --interface eth1 \
  --pool-network 10.0.1.0/24 \
  --pool-gateway 10.0.1.1

# 本番モード(Nexus と協調)
sudo ./bng run \
  --interface eth1 \
  --nexus-url http://nexus.internal:9000 \
  --radius-enabled \
  --radius-servers radius.isp.com:1812

ハードウェア

任意の Linux ボックス(5.10+ カーネル)で動作します。
対象は Radisys RLT‑1600G のようなホワイトボックス OLT:

  • 16 ポート GPON / XGS‑PON
  • Debian Linux が稼働し、価格は約 $7,400(従来の BNG は数十万ドル)
  • 1,500–2,000 サブスクライバーを処理可能

Linux を実行しネットワークインターフェースが OS に露出されている任意の OLT で同じ手法が使えます。


今後やるべきこと

コードは動作しますが、本番向けにはまだ足りません。
不足している機能:

  • デバイス認証(TPM アテステーションなど)で不正 OLT‑BNG の防止
  • IPv6 サポート(DHCPv6、SLAAC)
  • 完全な RADIUS 計上(現状は簡易的)
  • 管理 UI(CLI と Prometheus メトリクスだけ)

オープンソース化を検討しています。
BNG 市場は高価な専用ソリューションが支配しており、良いオープンソース代替品は存在しません。もしかしたら、そこに市場のニーズがあるかもしれません。


大局的視点

従来の ISP インフラは、コンピューティングコストが高くネットワーク速度が遅い時代に設計されました。
中央機器はパケット処理に専用ハードウェアを必要としていました。

しかし今はコンピュータが安価で、eBPF により Linux カーネル内でラインレートのパケット処理が可能です。
経済性も変わり、数百個のエッジサイトへ BNG を分散させる方が、数台の巨大中央ボックスを構築するよりも安価になります。

コスト削減だけではありません。 分散アーキテクチャは単一障害点がなく、トラフィックがローカルに留まるためレイテンシが低く、運用も簡潔です(Linux そのものを使うだけ)。

ハイパースケーラーはこのモデルを数年前に実装しました。 ISP は徐々に追随しています。


興味のある方へ

コードは次のリポジトリにあります:

ISP/オルタネットワーク領域で同様の課題に取り組んでいる方、eBPF や分散システム、ベンダー BNG が不合理だと感じる方はぜひご連絡ください。 交流を楽しみにしています。

同じ日のほかのニュース

一覧に戻る →

2026/01/24 10:00

**27ブランドから325車種へ対応したオープンソース自動運転**

## Japanese Translation: 提供された要約は正確で網羅的かつ明瞭であるため、変更の必要はありません。 --- **元の要約:** Comma Four は、オープンパイロットプラットフォームを利用した高度なドライバーアシスタンス機能を車両に提供する AI 主導型アップグレードです。トヨタ・ヒュンダイ・フォードなど 27 社の 325 台以上の車に追加でき、広範なモデルでテストされ、人間の入力を最小限に抑えて数時間動作可能であることが示されています。オープンパイロットの実証済み自律走行機能を基盤とし、Comma Four は自動運転技術の業界全体への普及へ向けた一歩を表します。同社はユーザーにコミュニティ参加と将来の自律システム形成への貢献を呼びかけつつ、プロダクト開発・自律工学・運用部門での採用も積極的に行っています。広く展開されれば、このアップグレードは多ブランドのドライバーアシスト機能の導入を加速し、自動車技術分野で新たなキャリアパスを創出する可能性があります。

2026/01/19 17:03

**現代のプログラミングで実践しているC++習慣** 1. **説明的な変数名を使う** - 単一文字の識別子は避け、意図が伝わる名前を選ぶ。 2. **不変データには `const` と `static const` を優先する** - 変更されないことを保証し、コンパイラ最適化を促進する。 3. **RAII(Resource Acquisition Is Initialization)パターンを採用する** - リソースの取得と解放をオブジェクトに閉じ込めることでリークを防止。 4. **必要に応じてヘッダーオンリ―ライブラリを利用する** - コンパイル依存性が減り、ビルド時間が短縮される。 5. **型推論には `auto` を使う** - 複雑なイテレータ型を簡潔にしつつ可読性を保つ。 6. **モダンなコンテナ初期化子を活用する** - `std::vector<int> v{1, 2, 3};` は手動の `push_back` よりも明確で簡潔。 7. **Catch2 や Google Test のようなフレームワークで単体テストを書く** - コードの正しさを保証し、リファクタリングを容易にする。 8. **関数は短く、目的を絞る** - 単一責任原則を目指すことで保守性が向上する。 9. **Doxygen コメントでドキュメント化する** - クリーンで検索可能な API ドキュメントを自動生成できる。 10. **最適化はプロファイル後に行う** - ホットスポットを測定し、実際のパフォーマンスボトルネックに対処する。

## Japanese Translation: 作者は主にC#とPythonで作業していますが、バインディングやニッチなタスクのために依然としてC(またはC++)を使用します。これは細粒度の制御を提供するからです。Cには公式のスタイルガイドラインがないため、ブログ、Rust、および完璧主義的マインドセットから引き出した個人的な習慣を構築しています。 新しいプロジェクトでは、GCC/Clang/MSVCサポート付き**C23**を好み、`#if CHAR_BIT != 8 #error` を強制して8ビットの `char` を保証します。彼らは簡潔な typedef のセット(`u8`, `i8`, `i16`, `u16`, `i32`, `u32`, `u64`, `f32`, `f64`, `uptr`, `isize`, `usize`)を採用し、<stdbool.h> からの C23 の `bool` をブール値に使用します。 ヌル終端文字列を避けるために、彼らは **長さ+データ構造**(`String` に `u8 *data; isize len`)を使用します。「parse, don’t validate」に触発されてオープックタイプと信頼できるコンストラクタ(Lelenthran のブログ参照)を作成しています。C23 のタグ互換性により、マクロ (`Tuple2(T1,T2)`) を使って単純なタプルを定義できますが、名前付き構造体は必要です。 エラーハンドリングは **sum types** でモデル化されています:列挙型とそれに伴う構造体(`ErrorCode`, `SafeBuffer`, `MaybeBuffer`)が戻り値に成功または失敗を符号化します。作者は純粋な C では動的メモリ割り当てを意図的に避け、ヒープ重視のコードには Rust または C# を好みます;アレーナアロケータも言及されますが使用されません。 標準ライブラリの使用は最小限です。文字列関数はほとんど使わず、代わりに生の `mem*` 呼び出しを優先します。また、OS API はエルゴノミクスが悪いため再実装されることがよくあります。作者は外部関数のドキュメントを注意深く読むことを強調し、将来的により安全なメモリ取り扱いのために **「slice」タイプ** を追加することを検討しています。 全体として、この記事は読者が自分自身の C スタイルガイドラインを作成するよう奨励しつつ、言語の強みと挫折の両方を認めています。

2026/01/20 0:06

**Go言語が1万5000行を削減** --- ### 概要 Goプログラミング言語は、最近の更新で約 **150万行(LOC)** のコードを削除し、コードベースの大幅な縮小を実現しました。これはコミュニティが言語をシンプルに保ち、保守性を向上させるために継続的に取り組んでいる結果です。 ### 主なポイント - **削減規模** - コアパッケージとツール全体で約1,500,000行が削除されました。 - **動機** - 現在の使用状況に合わなくなった重複コードやレガシーコードを排除する。 - 保守性を簡素化し、コンパイル時間を短縮し、可読性を向上させる。 - **開発者への影響** - 廃止予定の機能に対してわずかなAPI変更が加えられました。 - よりシンプルになったコードベースを反映したドキュメントが更新されました。 - **今後の展望** - ミニマリズムとパフォーマンスへの継続的な注力。 - 言語をさらに洗練させるため、コミュニティからの貢献を奨励しています。 ### 結論 Goプロジェクトが半百万行に及ぶ削減を意図的に実施したことは、世界中の開発者に対して明瞭性・効率性・長期的持続可能性へのコミットメントを示すものです。

## Japanese Translation: ``` ## Summary 著者はQuaminaにUnicode文字プロパティ正規表現の堅牢なサポートを構築し、`[~p{L}~p{Zs}~p{Nd}]`という構文を使用しました。 Goの標準ライブラリが最新のUnicodeバージョン(15.0対17.0)に追いついていないため、Quaminaは独自のデータを維持する必要がありました。著者は `UnicodeData.txt` を取得し、フィールド1と3を解析してすべての37カテゴリとそれらの補集合の範囲をリスト化したコードを生成しました—結果として従来の775K行アプローチに比べ5,122行のGoコードのみで済みました。 初期は、すべてのオートマタを事前計算しコードへ直列化すると約12Mのデータが生成され、起動時に長時間停止したりIDEがクラッシュする問題が発生しました。実行時キャッシュ戦略に切り替えることで、Quaminaは初回使用時にUnicodeプロパティオートマタを計算し保持できるようになりました。この変更で追加速度が135/秒から4,330/秒へ(30倍)向上しました。マッチング性能も高いままであり、UTF‑8の短さと浅いオートマタのおかげで数十万〜百万メッセージ/秒を処理できます。 著者は日常的な作業にGenAIツールを使用することを検討しましたが、ツール不足・時間制約・そのようなサービスのビジネス実現性への懐疑心から控えています。次の主要機能は数値量指定子サポート(例:`a{2-5}`)であり、これによりQuaminaの正規表現機能が完結します。この成功を受けてQuamina 2.0の安定リリースが計画されています。生活上の誘惑が勢いを鈍らせましたが、不確実性があるものの今後の開発は奨励されます。 ```