EC2-VPCでIPマルチキャスト/ブロードキャストを実現する(前編)

AWSやMicrosoft Azure, Googleなどのクラウド上ではIPマルチキャスト/ブロードキャストの通信が使えないのは有名な話です。
自分としては、Corosyncでマルチキャストを使いたい、というのがきっかけでマルチキャストについて考えはじめました。
(もちろんユニキャストも使えるのですが、マルチキャストにすると設定が簡単になったり、いろいろと便利なのです。)
今回はAWS EC2-VPCでIPマルチキャスト/ブロードキャストを実現することを考えてみます。


なんでマルチキャストを使いたいの?

今日、インターネットのトラフィックのほとんどはユニキャストによって行われていますが、用途によってはマルチキャストが望ましい通信もあります。
まずは、High Availabilityの分野で、代表的なソフトウェアとしてはCorosyncKeepaliveduCarpJGroupなどが挙げられます。
また、High Performance Computingの分野でも、マルチキャストが広く使われているようです。
他にも、Apple BonjourZeroconfHazelcastなど、いろんなところでマルチキャストが使われています。


IPv4におけるマルチキャスト/ブロードキャストのおさらい

まずは、IPv4の3つの通信について復習をば。

  • IPユニキャスト
  • IPブロードキャスト
  • IPマルチキャスト

IPユニキャスト

IPユニキャストは単一のホストへの通信です。
宛先MACアドレスには、宛先IPアドレス対応するMACアドレスをARPで取得して使用します。

ip_unicast

IPブロードキャスト

IPブロードキャストは同一ネットワーク内のすべてのホストへの通信です。
宛先MACアドレスには、予約されたMACアドレスであるFF:FF:FF:FF:FF:FFを使用します。
このとき、ARPは使用されません。

ip_broadcast

IPマルチキャスト

IPマルチキャストは同一ネットワーク内で対象のマルチキャストグループに所属するすべてのホストへの通信です。
宛先MACアドレスには、宛先IPアドレス(マルチキャストアドレス)からRFC1112をもとに算出したMACアドレスを使用します。
例えば、224.0.0.5は01:00:5E:00:00:05となります。
このとき、ARPは使用されません。

ip_multicast


EC2-VPCでマルチキャストを使えない理由

IPブロードキャスト、IPマルチキャストの宛先MACアドレスは、I/Gビットが1のマルチキャスト用のMACアドレスになります。

igbit

このような宛先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アドレスに書き換えます。
multi-unicasting-broadcast

IPマルチキャストの場合

インスタンスが送出するパケットのうち、宛先MACアドレスのI/Gビットが1のものをキャプチャし、ネットワーク内の送信対象のマルチキャストグループに所属するすべてのホスト分複製し、宛先MACアドレスをそれぞれのMACアドレスに書き換えます。
multi-unicasting-multicast

次回は、Multi-unicastingで、実際にEC2上でマルチキャストを実現してみます。


参考資料

  1. 2014年 7月 22日

コメントを残す

  • WordPress.com で次のようなサイトをデザイン
    始めてみよう