这个脚本做什么?

时间:2010-12-01 12:14:01

标签: ruby networking virtualization iptables

我对Ruby知之甚少,我需要了解这个脚本的功能。我知道它调用ebtables来添加为虚拟机配置网络的规则。但我不知道怎么样?

这是代码:

#!/usr/bin/env ruby

require 'pp'
require 'rexml/document'

VM_NAME=ARGV[0]

# Uncomment to act only on the listed bridges.
#FILTERED_BRIDGES = ['beth0']

def activate(rule)
    system "sudo ebtables -A #{rule}"
end

def get_bridges
    bridges = Hash.new
    brctl_exit=`brctl show`
    cur_bridge = ""
    brctl_exit.split("\n")[1..-1].each do |l| 
        l = l.split
        if l.length > 1
            cur_bridge = l[0]
            bridges[cur_bridge] = Array.new
            bridges[cur_bridge] << l[3]
        else
            bridges[cur_bridge] << l[0]
        end
    end
    bridges
end

def get_interfaces
    bridges = get_bridges
    if defined? FILTERED_BRIDGES
        FILTERED_BRIDGES.collect {|k,v| bridges[k]}.flatten
    else
        bridges.values.flatten
    end
end

nets=`virsh -c qemu:///system dumpxml #{VM_NAME}`

doc=REXML::Document.new(nets).root

interfaces = get_interfaces()

doc.elements.each('/domain/devices/interface') {|net|
    tap=net.elements['target'].attributes['dev']
    if interfaces.include? tap
        iface_mac=net.elements['mac'].attributes['address']

        mac=iface_mac.split(':')
        mac[-1]='00'
        net_mac=mac.join(':')


        in_rule="FORWARD -s ! #{net_mac}/ff:ff:ff:ff:ff:00 -o #{tap} -j DROP"
        out_rule="FORWARD -s ! #{iface_mac} -i #{tap} -j DROP"

        activate(in_rule)
        activate(out_rule)
    end
}

显然它提取mac地址(不确定哪些)并丢弃数据包/或将它们转发到某个地方?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

脚本运行virsh -c qemu:///system dumpxml #{VM_NAME},其中VM_NAME是脚本的第一个参数。

它实际上运行了两次,但肯定是错误的。第一次运行

nets=`virsh -c qemu:///system dumpxml #{VM_NAME}`

然后它再次运行它并将XML输出放在变量doc

doc=REXML::Document.new(nets).root

然后循环遍历接口,从元素&lt; target中获取属性dev的值。如果该值在brctl show命令的结果中,则从&lt; mac&gt;中的地址属性获取MAC地址。元件。

MAC由:拆分为数组,该数组中的最后一个元素更改为“00”,并从该数组创建net_mac

in_rule赋值中的

#{net_mac}将被新构造的net_mac替换。等等。

然后使用in_rule命令应用out_rulesudo ebtables -A #{rule}

清除?