SlideShare a Scribd company logo
マルチキャストが出来ないなら
ユニキャストすればいいじゃない
安川 健太
シニアソリューションアーキテクト
Amazon Data Services Japan
自己紹介
名前
• 安川 健太
• アマゾンデータサービスジャパン
ソリューションアーキテクト
好きなAWSのサービス
• CloudFormation
ソーシャル
• @thekentiest
• www.facebook.com/kenta.yasukawa
趣味
• 車いじり
• パケットキャプチャ
本日の発表
EC2の上でレイヤーの低いところでいろいろ試してみた
体験談のうち、マルチキャストに関して皆さんと共有
• せいぜいL3とかL2とかくらいです
• L1までは行きません
(行けません)
VPC使ってますか?
AWSパブリック
クラウド環境
Amazon Virtual Private
Cloud (VPC)環境
ユーザごとの
プライベート領域で
インスタンスを利用
Privateネットワークの為だけじゃないVPC
VPCでは出来て、EC2-Classicでは出来ないこと
• 静的IPアドレス設定
• 複数IPアドレス
• 複数ネットワークインターフェース
• セキュリティグループのメンバーシップの動的変更
• セキュリティグループによるOutboundフィルタリング
• NACL
• Subnetを区切って利用
• …
EC2インスタンスから見たL2の違い
EC2-Classicの場合
• どんなARPリクエストを送ってもいつも同じ答え
EC2-VPCの場合
• 見慣れた出力結果!
VPCならいろいろL2を使ったトリックが使えそう
L2 NAT (ebtablesとか)
L2のアドレッシングに頼るソフトウェア (LVSとか)
DSR (Direct Server Return)なロードバランサ
これは出来そうで出来ませんでした。興味があれば話します
IPブロードキャスト/マルチキャストを擬似的に
これが今日のトピックです
擬似L2ブロードキャストの原理
VPC Subnet
IPマルチキャスト
Dst: Ethernetブロードキャストアドレス
Src: 送信者のMACアドレス
コピー
ユニキャスト化!
注:ENIのSrc/Destチェックは無効化すること
まずはProof of Concept
パケットキャプチャによる実装なら簡単
• 通過パケットの少ないENIで動かせば実用的にもそんなに問題ない
• supervisordなどでデーモンとして動かせばそこそこ使えるかも
https://gist.github.com/kntyskw/5231182
動作確認したのでカーネルで動かす方法を模
索
tc mirred + pedit + csumでできます
Tcをその目的で使うためにコンフィグするシェルスクリプト
https://gist.github.com/kntyskw/5633755
パケットキャプチャベースに比べて高い性能、プロセス監視不要
若干わかりにくい構成に
Tc mirredがパケットループが起こる可能性のある構成を許さないので2つのENI
を用意して、パケットのコピー元とコピー先が異なるような設定が必要
# ec2_multicast.sh 
<interface to grab multicast packets from> 
<interface to send modified packets to> 
[target MAC address 1] [target MAC address 2] ...
# ec2_multicast.sh eth0 eth1 00:11:22:33:44:55 66:77:88:99:aa:bb
Example:
Usage:
同一サブネット内のENIのMACアドレス取得
AWS APIを使えば取得可能
• 例:
https://gist.github.com/kntyskw/5413698
LVS + Keepalivedを動かしてみた
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.0.0/20
Elastic IP
Secondary:
172.31.24.1
Primary:
172.31.24.100
Primary:
172.31.24.101
VRRP
平常時 リクエストの流れ
LVS + Keepalivedを動かしてみた
VPC Subnet
LVS +
keepalived
LVS +
keepalived
WebWebWeb
172.31.0.0/20
Elastic IP
Secondary:
172.31.24.1
Primary:
172.31.24.100
Primary:
172.31.24.101
VRRP
フェイルオーバー時 リクエストの流れ
EC2でIPアドレスを引き継ぐには
VPCはARPベースで動いているわけではない
• 明示的なIPアドレスとENIの対応関係を要プロビジョニング
フェイルオーバ時にAWS APIを叩いてVIPをMasterに要再割当て
https://gist.github.com/kntyskw/5417140
Keepalivedの設定例
Master昇格時に実行するスクリプトを指定
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.31.24.1 dev eth0
}
notify_master /etc/keepalived/assign_vip.sh
}
UPnPを動かしてみた
VPC Subnet
UPnP
Media Server
UPnP
Media Renderer
UPnP Control Point
172.31.0.0/20
Discovery
/ Browse
Media stream
Discovery
/ Play, Stop, Pause, etc
UPnPのDevice DiscoveryはMulticast
Simple Service Discovery Protocol (SSDP)
• ssdp:discover
• ssdp:alive
• ssdp:bybye
UPnP Control Point
UPnP
Device 1
UPnP
Device 2
1. Search (HTTPMU)
2. Response (HTTPU)
2. Response (HTTPU)
HTTPU --- HTTP over UDP
HTTPMU – HTTP over Multicast UDP
UPnPを動かしてみた: デモセットアップ
VPC Subnet
UPnP
Media Server
UPnP
Media Renderer
UPnP Control Point
172.31.0.0/20
Discovery
/ Browse
Media stream
Discovery
/ Play, Stop, Pause, etc
STX protocol
VNC
Virtual Private Living 的な?
まとめ
VPCならL2まで自由が利く
• L2 NAT
• 擬似ブロードキャスト、などなど
擬似マルチキャストを使えばVRRPも動く
• LVS + Keepalivedで検証
• 設定例や注意点など
擬似マルチキャストを使えばUPnPも動く
• Virtual Private Living Roomも
VPCを使ってより柔軟なシステム構築を!
Multicastが出来ないならUnicastすればいいじゃない

More Related Content

Multicastが出来ないならUnicastすればいいじゃない