0

私は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アドレスを抽出し(どれがどれかわからない)、パケットをドロップするか、どこかに転送しますか?

あなたの助けをどうもありがとう!

4

1 に答える 1

1

virsh -c qemu:///system dumpxml #{VM_NAME}VM_NAME がスクリプトの最初のパラメータであるスクリプトが実行されます。

実際には2回実行されますが、間違いなく間違いです。最初の実行

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

次に、もう一度実行し、XML 出力を変数に配置します。doc

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

次に、インターフェースをループして、要素 <target の属性 dev から値を取得します。その値がbrctl showコマンドの結果にある場合、<mac> 要素のアドレス属性から MAC アドレスを取得します。

MAC は によって配列に分割され、:その配列の最後の要素が「00」に変更さnet_macれ、その配列から が作成されます。

#{net_mac}in_rule 割り当てでは、新しく構築された に置き換えられnet_macます。等々。

次に、in_ruleout_rulesudo ebtables -A #{rule}コマンドで適用されます。

クリア?

于 2010-12-01T13:53:23.033 に答える