基礎から学ぶ? ec2マルチキャスト
Post on 13-Jul-2015
273 Views
Preview:
TRANSCRIPT
基礎から学ぶ?EC2マルチキャスト
@moomindani
そもそもなんで
使えないの?
ネットワーク負荷増大を避けるため(たぶん)
おさらい
Multicastってどんなんだっけ?
IP Unicast172.31.3.106:D7:FD:ED:EF:01
172.31.3.206:D7:FD:ED:EF:02
172.31.3.306:D7:FD:ED:EF:03
172.31.3.406:D7:FD:ED:EF:04
172.31.3.506:D7:FD:ED:EF:05
172.31.3.106:D7:FD:ED:EF:06
宛先IPアドレス 宛先MACアドレス
172.31.3.2 06:D7:FD:ED:EF:02
ARP
IP Broadcast172.31.3.106:D7:FD:ED:EF:01
172.31.3.206:D7:FD:ED:EF:02
172.31.3.306:D7:FD:ED:EF:03
172.31.3.406:D7:FD:ED:EF:04
172.31.3.506:D7:FD:ED:EF:05
172.31.3.106:D7:FD:ED:EF:06
宛先IPアドレス 宛先MACアドレス
172.31.15.255 FF:FF:FF:FF:FF:FF
既定
IP Multicast
224.0.0.5
172.31.3.106:D7:FD:ED:EF:01
172.31.3.206:D7:FD:ED:EF:02
172.31.3.306:D7:FD:ED:EF:03
172.31.3.406:D7:FD:ED:EF:04
172.31.3.506:D7:FD:ED:EF:05
172.31.3.106:D7:FD:ED:EF:06
宛先IPアドレス 宛先MACアドレス
224.0.0.5 01:00:5E:00:00:05
RFC1112
Multicast用のMACアドレスを
宛先に持つパケット
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
01:00:5E:00:00:05
I/Gビット
ブラックホール行
クラウドはL2に厳しい
でも使いたい
何とかならないの?
残された希望
• GRE tunnel
• L2 Peer-to-Peer VPN
–n2n
• Multi-Unicasting– MulticastがないならUnicastすればいいじゃない, JAWSDAYS 2014 by SA安川さん
Multi-Unicasting?
パケットを宛先の数だけコピーしてMulticast用MACアドレスをUnicast用MACアドレスに書き換えて送信すればいい
IP Broadcastの場合172.31.3.106:D7:FD:ED:EF:01
172.31.3.206:D7:FD:ED:EF:02
172.31.3.306:D7:FD:ED:EF:03
172.31.3.406:D7:FD:ED:EF:04
172.31.3.506:D7:FD:ED:EF:05
172.31.3.106:D7:FD:ED:EF:06
宛先IPアドレス 宛先MACアドレス
172.31.15.255 FF:FF:FF:FF:FF:FF
宛先IPアドレス 宛先MACアドレス
172.31.15.255 06:D7:FD:ED:EF:02
172.31.15.255 06:D7:FD:ED:EF:03
172.31.15.255 06:D7:FD:ED:EF:04
172.31.15.255 06:D7:FD:ED:EF:05
172.31.15.255 06:D7:FD:ED:EF:06
CAPTURE!
IP Multicastの場合
224.0.0.5
172.31.3.106:D7:FD:ED:EF:01
172.31.3.206:D7:FD:ED:EF:02
172.31.3.306:D7:FD:ED:EF:03
172.31.3.406:D7:FD:ED:EF:04
172.31.3.506:D7:FD:ED:EF:05
172.31.3.106:D7:FD:ED:EF:06
宛先IPアドレス 宛先MACアドレス
224.0.0.5 FF:FF:FF:FF:FF:FF
宛先IPアドレス 宛先MACアドレス
224.0.0.5 06:D7:FD:ED:EF:03
224.0.0.5 06:D7:FD:ED:EF:06
CAPTURE!
Multi-Unicastingを試してみた
環境
送信元インスタンス
宛先インスタンスA 宛先インスタンスB
VPC subnet
OS: Amazon Linux 2014.3
172.31.4.9306:A7:CE:8A:4F:13
172.31.3.13506:01:B8:62:20:C0
172.31.4.10506:52:D3:DC:8A:4A
宛先インスタンスの準備
• Source/Dest. Checkを無効化
• (今回ICMPで試すため)ブロードキャストアドレスに対するICMPへの応答を許可– echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
送信元インスタンスの準備
• 必要なライブラリのインストール
– Ruby 1.9.x, libpcap, libpcap-devel
– Gem: pcaprub, packetfu
• Multi-Unicastingスクリプトを用意
–送信元インスタンスでパケットをキャプチャし、宛先MACアドレスのI/Gビットが1の場合にUnicastに書き換える
–安川さん作のRubyスクリプトを流用
#!/usr/bin/rubyrequire 'rubygems'require 'packetfu'
dev = ARGV[0]mac=`ip link show #{dev} | awk '/ether/ {print $2}'`.chompARGV.shiftdests = ARGV
cap = PacketFu::Capture.new(:timeout => 4000,:iface => dev, :start => true,:filter => "ether src #{mac} and ether[0] & 1 = 1")
loop docap.stream.each do |pkt|frame = PacketFu::IPPacket.parse(pkt)i = 0dests.each do |dest|frame.eth_daddr = destframe.ip_header.ip_id = frame.ip_header.ip_id + iframe.ip_header.ip_sum = frame.ip_header.ip_calc_sum()frame.to_w(dev)i = i + 1
endend
end
DEMO
top related