che cosa fa questo script fare?
-
29-09-2019 - |
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!
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
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?