EC2-VPCでIPマルチキャスト/ブロードキャストを実現する(前編)
AWSやMicrosoft Azure, Googleなどのクラウド上ではIPマルチキャスト/ブロードキャストの通信が使えないのは有名な話です。
自分としては、Corosyncでマルチキャストを使いたい、というのがきっかけでマルチキャストについて考えはじめました。
(もちろんユニキャストも使えるのですが、マルチキャストにすると設定が簡単になったり、いろいろと便利なのです。)
今回はAWS EC2-VPCでIPマルチキャスト/ブロードキャストを実現することを考えてみます。
なんでマルチキャストを使いたいの?
今日、インターネットのトラフィックのほとんどはユニキャストによって行われていますが、用途によってはマルチキャストが望ましい通信もあります。
まずは、High Availabilityの分野で、代表的なソフトウェアとしてはCorosyncやKeepalived、uCarp、JGroupなどが挙げられます。
また、High Performance Computingの分野でも、マルチキャストが広く使われているようです。
他にも、Apple BonjourやZeroconf、Hazelcastなど、いろんなところでマルチキャストが使われています。
IPv4におけるマルチキャスト/ブロードキャストのおさらい
まずは、IPv4の3つの通信について復習をば。
- IPユニキャスト
- IPブロードキャスト
- IPマルチキャスト
IPユニキャスト
IPユニキャストは単一のホストへの通信です。
宛先MACアドレスには、宛先IPアドレス対応するMACアドレスをARPで取得して使用します。
IPブロードキャスト
IPブロードキャストは同一ネットワーク内のすべてのホストへの通信です。
宛先MACアドレスには、予約されたMACアドレスであるFF:FF:FF:FF:FF:FFを使用します。
このとき、ARPは使用されません。
IPマルチキャスト
IPマルチキャストは同一ネットワーク内で対象のマルチキャストグループに所属するすべてのホストへの通信です。
宛先MACアドレスには、宛先IPアドレス(マルチキャストアドレス)からRFC1112をもとに算出したMACアドレスを使用します。
例えば、224.0.0.5は01:00:5E:00:00:05となります。
このとき、ARPは使用されません。
EC2-VPCでマルチキャストを使えない理由
IPブロードキャスト、IPマルチキャストの宛先MACアドレスは、I/Gビットが1のマルチキャスト用のMACアドレスになります。
このような宛先MACアドレスをもつパケットは、フィルタリングされ消失してしまいます。
(ネットワーク負荷等の観点から、クラウドでは特にレイヤー2の通信が限定されるのが一般的です。)
つまり、マルチキャスト用のMACアドレスが使えないということになり、結果的にそれに依存するIPマルチキャスト, IPブロードキャストが使えないということになります。
これが、AWS EC2-VPCでマルチキャストを使えない技術的な背景です。
EC2でMulticastを実現するワークアラウンド
以上にて、AWS EC2でもMulticastは許可されていないことについて見てきました。
この制約を回避してMulticastを実現するためには、下記のワークアラウンドが考えられます。
- Multi-unicasting
- GRE tunnel
- L2 Peer-to-Peer VPN
Multi-unicasting
@thekentiest さんが考案された、マルチキャストパケットを宛先分コピーして、宛先MACアドレスをユニキャストに書き換えて送信する方法です。
詳しくは後程。
GRE tunnel
GRE tunnelを使って、EC2-VPCでマルチキャストを実現する方法が考えられます。
AWS上でのトンネリングについてはこちらが参考になります。
L2 Peer-to-Peer VPN
L2 Peer-to-Peer VPNソフトウェアであるn2nを使ってEC2-VPCでマルチキャストを実現する方法があります。
Multi-unicasting
宛先MACアドレスにマルチキャスト用のMACアドレスを使うとフィルタリングされるのであれば、そのMACアドレスを書き換えてしまえばいい、というアイデアから、パケットを宛先の数だけコピーしてMulticast用MACアドレスをUnicast用MACアドレスに書き換えて送信する方法です。
IPブロードキャストの場合
インスタンスが送出するパケットのうち、宛先MACアドレスのI/Gビットが1のものをキャプチャし、ネットワーク内のすべてのホスト分複製し、宛先MACアドレスをFF:FF:FF:FF:FF:FFからそれぞれのMACアドレスに書き換えます。
IPマルチキャストの場合
インスタンスが送出するパケットのうち、宛先MACアドレスのI/Gビットが1のものをキャプチャし、ネットワーク内の送信対象のマルチキャストグループに所属するすべてのホスト分複製し、宛先MACアドレスをそれぞれのMACアドレスに書き換えます。
次回は、Multi-unicastingで、実際にEC2上でマルチキャストを実現してみます。