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で頑張るしかないか。。。。