EC2で仮想IPにチャレンジ(現時点では諦め)
http://d.hatena.ne.jp/KNOPP/20140728/1406562348
の続き。
プログラムが異常終了するのは、ARPに対応していなかったようです。
(ARPパケットだとframe.ip_headerがNILになるので、異常終了してた)
そこで、ARPパケットでも対応したのが以下スクリプトになります。
#!/usr/bin/ruby require 'rubygems' require 'packetfu' dev = ARGV[0] mac=`ip link show #{dev} | awk '/ether/ {print $2}'`.chomp ARGV.shift dests = ARGV cap = PacketFu::Capture.new( :timeout => 4000, :iface => dev, :start => true, :filter => "ether src #{mac} and ether[0] & 1 = 1") loop do cap.stream.each do |pkt| frame = PacketFu::IPPacket.parse(pkt) i = 0 dests.each do |dest| frame.eth_daddr = dest if frame.proto[1].to_s == "IP" then frame.ip_header.ip_id = frame.ip_header.ip_id + i frame.ip_header.ip_sum = frame.ip_header.ip_calc_sum() i = i + 1 end frame.to_w(dev) end end end
これで大丈夫。。。。。
と思いきや。残念なことにVPC側ではブロードキャストだけでなく、ARPパケットもいじっているようで、
multi-unicastしたARPパケットは、VPC側でmanageしているIPアドレスの解決要求以外は届きません。
(tcpdumpで確認した結果)
なので、現時点では、multi-unicastを使ってもVIPを使うのは難しいということになります。
諦めてtincで頑張るしかないか。。。。