[libvirt] [PATCH] v2:Support for adding a static route to a bridge

Gene Czarcinski gene at czarc.net
Tue Apr 9 20:28:50 UTC 2013


On 04/04/2013 12:08 PM, Laine Stump wrote:
> On 04/03/2013 04:02 PM, Gene Czarcinski wrote:
>> On 04/02/2013 03:31 PM, Laine Stump wrote:
>>> On 03/15/2013 02:10 PM, Gene Czarcinski wrote:
>>>> This patch adds support for adding a static route for
>>>> a network.  The "via" specifies the gateway's IP
>>>> address.  Both IPv4 and IPv6 static routes are
>>>> supported although it is expected that this
>>>> functionality will have more use with IPv6.
>>> (First I want to make sure I correctly understand what you're wanting to
>>> do, so I'm going to try and explain it in my own words...)
>>>
>>> >From reading your earlier messages, my understanding is that the aim of
>>> this patch is to automatically setup a route to a virtual network whose
>>> bridge device has no IP address assigned, and is therefore reachable
>>> only via one of the guests, is this correct?
>>>
>>> In other words, let's say that I have the following two networks defined
>>> (using IPv4 and all static IPs for brevity, but the entire discussion is
>>> equally applicable to IPv6):
>>>
>>>
>>>      <network>
>>>        <name>netVisibleToHost</name>
>>>        <bridge name='virbr1'/>
>>>        <forward mode='route'/>
>>>        <ip address='192.168.200.1' prefix='24'/>
>>>      </network>
>>>
>>>      <network>
>>>        <name>netHiddenFromHost</name>
>>>        <bridge name='virbr2'/>
>>>      </network>
>>>
>>> and you have a guestDirect that has two interfaces:
>>>
>>>      <interface type='network'>  <!-- 192.168.200.2/24 -->
>>>        <source network='netVisibleToHost'/>
>>>      </interface>
>>>      <interface type='network'>  <!-- 192.168.201.1/24 -->
>>>        <source network='netHiddenFromHost'/>
>>>      </interface>
>>>
>>> and another guestIndirect that has only one interface:
>>>
>>>      <interface type='network'>  <!-- 192.168.201.2/24 -->
>>>        <source network='netHiddenFromHost'/>
>>>      </interface>
>>>
>>> Additionally, the default route on guestDirect points to 192.168.200.1,
>>> and the default route on guestIndirect points to 192.168.201.1.
>>>
>>> (Presumably you don't want to simply add an IP address to
>>> netHiddenFromHost because (while it would solve your routing problems)
>>> it would violate some security policy you've built into your network
>>> topology - namely that all traffic to and from netHiddenFromHost *must*
>>> go through guestDirect.)
>>>
>>> Traffic outbound from guestIndirect would have no problem reaching its
>>> destination - it would go across netHiddenFromHost to guestDirect
>>> (192.168.201.1), which would know to forward it to the host
>>> (192.168.200.1) via netVisibleToHost, and the host presumably knows how
>>> to get to anywhere. The problem comes when trying to route the
>>> *response* destined for 192.168.201.2 (guestIndirect) - the outside
>>> world may know that those packets have to be sent to the host, but the
>>> host doesn't have a route for 192.168.201.0/24 - only guestDirect does.
>>>
>>> So, the solution is to add a route on the *host* that points traffic
>>> destined for 192.168.201.0/24 to guestDirect, a.k.a. 192.168.200.2.
>>>
>>> Since there's no place in /etc/sysconfig/network-scripts/route-* to put
>>> static routes with destinations that are only reachable through a
>>> transient interface such as the bridge devices created by libvirt, the
>>> obvious solution is to cause libvirt to add such a route, and the way
>>> you propose to do that is to add an <ip> element in the network named
>>> "netUnreachable".
>>>
>>> Am I understanding the issue so far?
>> I believe you do understand.
OK, I am back from virt-manager.
> Except that it's obvious from your response that I misunderstood your
> patch, and thought that you were trying to make the route to an
> otherwise unreachable network a part of the unreachable network's config
> :-) (my defense is that the dual usage of the <ip> element to define a
> route confused me)
You were correct to be confused.  At first, I thought your suggestions 
for <route> were just cosmetic but then I realized that, in general, an 
<ip> definition resulted in a specific ".1" or ":1" device address would 
be assigned to an interface (bridge).  The net address looked similar 
but there would be no device address assigned to the interface/bridge 
but there would be an entry for a (static) route.

While the backend will continue to be more or less the same and 
instantiate the static route, the "front" end will add a new element: 
<route>.  I intend to keep "via" for specifying the gateway rather than 
using "gateway.".  This makes it consistent with the ip-route command.  
So, to add a static would, the text would look like:
         <route address='<IPv4-network-addr>'  prefix='24' 
via='<IPv4-gateway-addr>' />
or
         <route family='ipv6' address='<IPv6-net-addr>' prefix='64' 
via='<IPv6-gateway-addr>'  />

More work:  I will need to go back and "fix" the virt-manager code.
>
> Based on my now corrected understanding that the route is added to the
> config of the network which is directly connected to the gateway (rather
> than the network *beyond* the gateway), I have two comments/requests:
>
> 1) I think a separate <route> element is a better idea than trying to
> make <ip> dual purpose. Aside from confusing simple-minded people like
> me, when things are intertwined like that it has the potential to lead
> to an ambiguous situation further down the road. Also, using a separate
> <route> element is closer to the system config files as well as more
> similar to the xml used by the virInterface APIs (aka netcf).
Right on ... see above.
>
> 2) Although /sbin/ip uses the term "via", I do think that "gateway"
> would be the preferred term, since that's been in use for many years
> with the (admittedly now deprecated) /sbin/route command, as well as
> what is used in the system ifcfg-* and route-* files.
OK, how about having it both ways.  If we can have both mask and prefix, 
why not both via and gateway.  I know gateway has some history attached 
to it but the new /sbin/ip uses via.  I am just trying to keep a line of 
text being as close to not exceeding 80 characters as practical.  
Correct me if I am wrong but all of this is suppose to be free-form and 
this should be valid:

         <route ip='ipv6'  address='fd00:dead:beef:472::1' prefix='64'
                     gateway='fd00:dead:beef:10::2'  />

Of course, when it gets written back out by code it will all be on a 
"single" line.

How about one of you other folks chiming in on this.  gateway? ... via? 
... anybody (besides the two of us) care??

>
> 3) I would prefer to eliminate use of /sbin/ip and do this directly via
> netlink/libnl. I would be willing to have this done in a separate patch
> that also re-wrote virNetDev(Set|Clear)IPAddress.
This is going to take some research, etc. to do so, yes, lets do this 
"later" as a separate patch and use what we know works for now (kludgy 
as it is).

At least we are now in agreement as to what the end-point is ;)

Gene




More information about the libvir-list mailing list