Linuxにおけるマルチキャストルーティング:IGMP Proxyとpimdの実践ガイド

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

マルチキャストのボトルネックを解消する

昨年、私はある放送スタジオのネットワークを再設計しました。そこでは、50台のワークステーションに1080pのライブフィードを配信する必要がありました。最初はユニキャストで始めましたが、計算が合いませんでした。12 Mbpsのストリームが50人分となると、1 Gbpsのバックボーンのうち600 Mbpsを消費してしまうからです。

ネットワークが遅くなるだけでなく、完全に崩壊しました。マルチキャストへの切り替えが明らかな解決策でしたが、すぐにLinuxはデフォルトではマルチキャストをルーティングしないという事実に直面しました。Linuxはストリームを受信することはできますが、特定のソフトウェアなしではインターフェース間で転送してくれません。

IPTVの管理、社内のビデオ研修、あるいはセグメント化された企業ネットワーク内でのmDNSによるデバイス検出など、どのような用途であっても、これらのギャップを埋める方法が必要です。このガイドでは、そのための最適な2つのツールを紹介します。シンプルなゲートウェイ向けの IGMP Proxy と、複雑なマルチルーター構成向けの pimd です。

クイックスタート:IGMP Proxyの設定

構成がシンプルな「ハブ・アンド・スポーク」型(1つのアップストリームソースと複数のダウンストリーム視聴者)であれば、igmpproxy が最適です。これは複雑なルーティングプロトコルを使用しません。その代わりに仲介役として機能し、クライアントからのメンバーシップレポートをソース側に転送します。軽量で、設定には5分もかかりません。

1. インストール

UbuntuやDebianでは、標準リポジトリからパッケージを入手できます。

sudo apt update
sudo apt install igmpproxy

2. カーネル転送の有効化

Linuxはデフォルトで、他のインターフェース宛のパケットを無視します。カーネルに転送を許可するよう指示しなければ、マルチキャストトラフィックは最初のインターフェースで行き止まりになってしまいます。

sudo sysctl -w net.ipv4.ip_forward=1
# 恒久的に設定するには、/etc/sysctl.conf に 'net.ipv4.ip_forward = 1' を追加します

3. プロキシの設定

/etc/igmpproxy.conf を開きます。どのインターフェースがソース側(アップストリーム)で、どれがユーザー側(ダウンストリーム)かを定義する必要があります。また、セキュリティ上の理由から、ソースのサブネットをホワイトリストに登録しないと、プロキシはトラフィックを無視します。

# /etc/igmpproxy.conf

## アップストリーム:配信元(例:eth0)
phyint eth0 upstream ratelimit 0 threshold 1
    altnet 192.168.100.0/24
    altnet 10.0.0.0/8

## ダウンストリーム:視聴者側(例:eth1)
phyint eth1 downstream ratelimit 0 threshold 1

## ループ防止のため、使用しないインターフェースを無効化
phyint lo disabled
phyint eth2 disabled

4. 起動とテスト

初期エラーを把握するために、詳細モードでデーモンを実行します。

sudo igmpproxy -v /etc/igmpproxy.conf

スケールアップ:複雑なネットワークでのpimdの利用

複数のルーターや冗長化されたネットワークパスがある場合、IGMP Proxyでは不十分です。そのようなケースでは、PIM-SM (Protocol Independent Multicast – Sparse Mode) が必要になります。私たちの本番環境では、バックアップルーターを追加した際にプロキシがどのパスを選択すべきか判断できなくなったため、pimd に移行しました。

PIM-SMによるトラフィック管理の仕組み

PIM-SMは「プル(引き出し)」型のシステムだと考えてください。これはランデブーポイント (RP) を中心的な集合場所として利用します。ソースはRPに登録し、受信者はRPにデータを要求します。これにより、20 Mbpsのビデオストリームがネットワークの隅々にまで溢れることを防ぎ、実際にアクティブな視聴者がいるセグメントにのみデータが流れるようになります。

pimdのインストールと設定

sudo apt install pimd

設定ファイル /etc/pimd.conf はプロキシ版よりも強力です。標準的な構成では、メインのLinuxルーター自身をRPとして動作させることができます。

# RPアドレスをこのルーターのIPに設定
rp-address 192.168.1.1

# 指定したインターフェースでPIMを有効化
phyint eth0 enable
phyint eth1 enable

sudo systemctl start pimd でサービスを開始します。ルーターは他のPIM対応デバイスと「Hello」パケットを交換し、マルチキャストトポロジをマッピングし始めます。

すべてを台無しにする2つの「落とし穴」

完璧な設定であっても、特定の2つの問題によってマルチキャストが失敗することがよくあります。私は「完璧」なセットアップのデバッグに3日間費やし、ようやくこれらの犯人を見つけました。

1. TTL (Time To Live) の罠

多くのハードウェアエンコーダーは、TTLを1としてマルチキャストパケットを送信します。この値はネットワークに対して「ルーティングするな」と伝えているのと同じです。パケットがLinuxマシンに到達すると、ルーターはTTLを0に減らし、パケットを破棄します。エンコーダーの設定を変更できない場合は、iptables を使用してルーターに入る際にTTLを増加させます。

sudo iptables -t mangle -A PREROUTING -i eth0 -d 224.0.0.0/4 -j TTL --ttl-inc 1

2. ファイアウォールの障壁

マルチキャストには、実際のデータ(通常はUDP)とシグナリング(IGMP)の2種類のトラフィックが必要です。ほとんどのファイアウォールは、デフォルトでIGMPをブロックします。224.0.0.0/4 の範囲と、特にIGMPプロトコルを許可するルールを設定してください。

# シグナリングプロトコルを許可
sudo iptables -A INPUT -p igmp -j ACCEPT
# 実際のマルチキャストストリームデータを許可
sudo iptables -A FORWARD -d 224.0.0.0/4 -j ACCEPT

メンテナンスとトラブルシューティング

マルチキャストネットワークの運用にはアクティブな監視が必要です。問題が発生した際の私のチェックリストは以下の通りです。

  • カーネルテーブルの確認: ip mroute show を実行します。このテーブルが空の場合、デーモン(pimd または igmpproxy)がLinuxカーネルと正しく通信できていません。
  • Wi-Fiのフラッディングに注意: アクセスポイントでIGMPスヌーピングを有効にせずに、Wi-Fiインターフェースでマルチキャストを有効にしてはいけません。50 Mbpsの4Kストリームが1つあるだけで、すべてのユーザーの2.4GHz帯域が飽和する可能性があります。
  • トラフィックのキャプチャ: tcpdump -i eth1 igmp を使用して、クライアントの「Join Group」リクエストが実際にルーターに届いているか確認します。リクエストは見えているのにビデオが流れてこない場合、問題はアップストリーム側にあります。

Share: