[libvirt] IPv6: getting it to work

Gene Czarcinski gene at czarc.net
Tue Mar 12 17:34:02 UTC 2013


On 03/12/2013 08:05 AM, Gene Czarcinski wrote:
> On 03/11/2013 03:32 PM, Gene Czarcinski wrote:
>> Before I start creating patches (since it is not only source code but 
>> also documentation, schemas, tests, etc), I thought I would run this 
>> by you folks for comments/suggestions.
>>
>> With IPv4, it is relatively easy to set up working networks: just use 
>> nat/MASQUERADE and things pretty much just work.
>>
>> With IPv6, it is a bit more difficult because IPv6 is route-only with 
>> (theoretically) unique addresses known across the Internet. It took 
>> me a while but once I realized that I needed to define some static 
>> routes on my default router, it because much easier. The default 
>> route(s) on the default router connect the IPv6 guest network used by 
>> a qemu-kvm/libvirt with the virtual host's IPv6 address.
>>
>> My recommendation is to use a /48 or /56 IPv6 network and assign it 
>> to a specific virtual host.  This virtual host needs to have a fixed 
>> IPv6 address either with manual configuration or using a client-id to 
>> pin a specific IPv6 address.  Then make each of the virtual networks 
>> on that host be a /64 network.  So far so good and really not too 
>> much of an administrative burden. NetworkManager can be used to set 
>> this default route.
>>
>> Now lets add some additional virtual network layers/segments to the 
>> mix.  For example:
>>
>>   guest10 <-> net-a <-> guest20 <-> net-b <-> guest30 <-> virbr<n> 
>> host40 <-> router50 <-> host60
>>
>> guest30 can talk to other systems such as host40, router50, and 
>> host60 on the real network since it is covered by the static route on 
>> the default router.
>>
>> guest10, guest20, and guest30 can talk to each other with some 
>> additional static routes (or just default routes).
>>
>> The problem: guest10 cannot talk to other real hosts such as host40 
>> or host60.  The problem is that NetworkManager will not set a static 
>> route for any network on a libvirt bridge device (or any bridge 
>> device which NM does not "own").
>>
>> At first I thought this was a NM problem but I now believe that this 
>> should be fixed by libvirt.
>>
>> I did some manual configuration to figure out what needed to be done 
>> so that guest10 could use IPv6 to talk to another host on the real 
>> network.
>>
>> 1. You have defined a static route on the default router for 
>> fd00:aa:bb::/48 to the virtual host.
>>
>> 2. You have an libvirt network defined with (for example) 
>> fd00:aa:bb:10::/64 and a guest on that network with the address of 
>> fd00:aa:bb:10::2/128.  Lets say it is on virbr4.
>>
>> 3.  Your secondary (isolated) virtual network is fd00:aa:bb:11::/64.
>>
>> 4.  You need to issue firewalld commands so it will pass the 
>> additional network on virbr4.  These are of the form:
>>     firewall-cmd --direct --passthrough ipv6 -I FORWARD -1 -d 
>> fd00:aa:bb:11::/64 -o virbr4 -j ACCEPT
>>     firewall-cmd --direct --passthrough ipv6 -I FORWARD -1 -s 
>> fd00:aa:bb:11::/64 -i virbr4 -j ACCEPT
>>
>> 5. Create the route:
>>   ip  -6  route  fd00:aa:bb:11::/64  via  fd00:aa:bb:10::2 dev 
>> virbr4  proto static  metric  1
>>
>> OK, that is what has to be done but I want libvirt to do all of this 
>> for me after some simple configuration.
>>
>> I propose adding a new optional xml-element to the <ip> element: <via>
>>
>> <via> would be an exclusive alternate to <dhcp> and both <via> and 
>> <dhcp> could not be used under a single <ip> definition.  As implied 
>> by the name, <via> would specify the gateway address which is to 
>> receive the packets on the designated network.
>
> An alternative is to have via specified as pat of the <ip> definition 
> itself.  That is, <ip> would have family=, address=, prefix=, and now 
> via=
Too late.  I have implemented the "alternative"

And it appears to work.  Now for the "fun stuff" of documentation, 
tests, and the schema.

>
>>
>> Right now, if you specify an additional IPv6 address to a network 
>> definition, you get the correct ip6tables rules but you also get a 
>> ip-addr for that additional definition and an ip-route for the 
>> related network.  With <via>, this last part would be replaced with 
>> NO additional ip-addr and a static route for the network to the gateway.
>>
>> Anticipated code changes (besides the tests, schemas, and 
>> documentation) are:
>>
>> network_conf.c to handle the new <via> element.
>>
>> virnetdev.c to create and issue the ip-6-route command.
>>
>> bridge_driver.c to detect when an IPv6 address is a "via" and do the 
>> ip-6-route instead of adding the address.
>>
>> Although this is being done for IPv6, there is no reason not to make 
>> sure it also works with IPv4.
>>
>> Comments, suggestions appreciated.
>>
>> Gene
>>
>




More information about the libvir-list mailing list