
"Daniel P. Berrange" <berrange@redhat.com> wrote on 03/17/2010 10:40:36 AM:
On Thu, Mar 11, 2010 at 08:06:04AM -0500, Stefan Berger wrote:
Hi!
The following set of patches add network filtering (ACL) extensions to libvirt and enable network traffic filtering for VMs using ebtables
and,
depending on the networking technology being used (tap, but not macvtap), also iptables. Usage of either is optional and controlled through filters that a VM is referencing.
The ebtables-level filtering is based on the XML derived from the CIM network slide 10 (filtering) from the DMTF website (http://www.dmtf.org/standards/cim/cim_schema_v2230/CIM_Network.pdf). The XML we derived from this was discussed on the list before. On the ebtables level we currently handle filtering of IPv4 and ARP traffic.
It is planned to cover IPv6 too, either at ebtables or ip6tables level ?
Well, the code should be able to handle it and we at least thought about it. I am not an IPv6 expert myself ... currently ... yet. :-)
I've not looked at the actual code in detail yet, but the public API, virsh commands, XML etc all looks generally good to me. I'll try and get you a detailed code review friday/monday once I get through my current work items.
Let me post another series later today with the fixes that I have made following your reviews and changes I did make myself.
One comment about the instantiation of the rules: Since the XML allows to create nearly any possible combination of parameters to ebtables or iptables commands, I haven't used the ebtables or iptables wrappers. Instead, I am writing ebtables/iptables command into a buffer, add command line options to each one of them as described in the rule's
XML,
write the buffer into a file and run it as a script. For those commands that are not allowed to fail I am using the following format to run them:
cmd="ebtables <some options>" r=`${cmd}` if [ $? -ne 0 ]; then echo "Failure in command ${cmd}." exit 1 fi
cmd="..." [...]
If one of the command fails in such a batch, the libvirt code is going pick up the error code '1', tear down anything previously established and report an error back. The actual error message shown above is currently not reported back, but can be later on with some changes to the commands running external programs that need to read the script's stdout.
I understand why you can't use the ebtables/iptables APIs we currently have there, but I'm not much of a fan of using the shell script. Isn't it just as easy to directly call virRun() with each set of ARGV to be exec'd ?
I hadn't thought about calling that function... I would want to call a function that can handle something like bash scripts, i.e., multiple concatenated fragments as those shown above just to be more 'efficient'. If virRun() can handle that and $? for example would be treated there as the return value (which I think is bash-dependent), I'd be happy to call it as well. Stefan
Regards, Daniel -- |: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/:|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org:| |: http://autobuild.org -o- http://search.cpan.org/~danberr/:| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|