Domanda

Non so molto di Ruby e ho bisogno di capire che cosa questo script fa. So che chiama ebtables aggiungere regole che le reti di configurazione per le macchine virtuali. Ma io non sono sicuro di come?

Questo è il codice:

#!/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
}

Quindi, apparentemente estrae indirizzi mac (non sono sicuro che quelli) e gocce di pacchetti / o in avanti da qualche parte?

Grazie mille per il vostro aiuto!

È stato utile?

Soluzione

Lo script viene eseguito virsh -c qemu:///system dumpxml #{VM_NAME} dove nome_macchina_virtuale è il primo parametro allo script.

E 'effettivamente eseguito due volte, certamente per errore. La prima esecuzione

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

allora lo esegue una seconda volta e pone l'output XML nella variabile doc

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

E 'loop poi sopra le interfacce, ottenendo il valore dell'attributo dev nell'elemento brctl show ottiene l'indirizzo MAC dall'attributo indirizzo nell'elemento .

Il MAC è diviso ad un array : e l'ultimo elemento di tale array viene modificato in '00' ed il net_mac è creata da tale matrice.

#{net_mac} nell'assegnazione in_rule sarà sostituito dal net_mac di nuova costruzione. E così via.

Poi il in_rule e out_rule vengono applicate con il comando sudo ebtables -A #{rule}.

Cancella?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top