From: David Ahern <dsahern@gmail.com>
To: George Wilkie <gwilkie@vyatta.att-mail.com>
Cc: Shrijeet Mukherjee <shrijeet@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>,
Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>,
netdev@vger.kernel.org
Subject: Re: [PATCH net-next] vrf: local route leaking
Date: Wed, 29 May 2019 21:29:22 -0600 [thread overview]
Message-ID: <1f761acd-80eb-0e80-1cf4-181f8b327bd5@gmail.com> (raw)
In-Reply-To: <20190527083402.GA7269@gwilkie-Precision-7520>
On 5/27/19 2:34 AM, George Wilkie wrote:
> On Sat, May 25, 2019 at 09:13:13AM -0600, David Ahern wrote:
>>> Using a loopback doesn't work, e.g. if 10.1.1.0/24 was on a global interface:
>>> ip ro add vrf vrf-a 10.1.1.0/24 dev lo
>>
>> That works for MPLS when you exit the LSP and deliver locally, so it
>> should work here as well. I'll take a look early next week.
>
> OK, thanks.
>
>> I would prefer to avoid it if possible. VRF route leaking for forwarding
>> does not have the second lookup and that is the primary use case. VRL
>> with local delivery is a 1-off use case and you could just easily argue
>> that the connection should not rely on the leaked route. ie., the
>> control plane is aware of both VRFs, and the userspace process could use
>> the VRF-B path.
>>
>
> Although it isn't always possible to change the userspace process -
> may be running in a specific vrf by 'ip vrf exec'
>
sure, but that is a design choice for the control plane. Effectively,
you have this setup:
{ process }
|
| packet
|
+--------------+ +--------------+
| VRF A | | VRF B |
| | | |
| | <------ route to A |
| +------+ | | +------+ |
+---| ens1 |---+ +---| ens2 |---+
+------+ +------+
^
|
|
packet
ie., the process is potentially bound to VRF-A, and you want it handle
packets from VRF-B and without binding to VRF-B.
I already mentioned one solution that works well if the route is only
used for forwarding (add a route to VRF-B using ens1 as the egress
device) and a solution that works for local delivery (add route to VRF-B
using vrf-A device to do a second lookup).
you are correct that use of loopback here for default VRF does not work
-- the lookup code gets confused because it is a forward path (as
opposed to MPLS which is a local input). I found a couple of solutions
that work for default VRF.
Again, using namespaces to demonstrate within a single node. This is the
base setup:
ip li add vrf-b up type vrf table 2
ip route add vrf vrf-b unreachable default
ip ru add pref 32765 from all lookup local
ip ru del pref 0
ip netns add foo
ip li add veth1 type veth peer name veth11 netns foo
ip addr add dev veth1 10.200.1.1/24
ip li set veth1 vrf vrf-b up
ip -netns foo li set veth11 up
ip -netns foo addr add dev veth11 10.200.1.11/24
ip -netns foo ro add 10.200.2.0/24 via 10.200.1.1
ip netns add bar
ip li add veth2 type veth peer name veth12 netns bar
ip li set veth2 up
ip addr add dev veth2 10.200.2.1/24
ip -netns bar li set veth12 up
ip -netns bar addr add dev veth12 10.200.2.12/24
Cross VRF routing can be done with a veth pair, without addresses:
ip li add xvrf1 type veth peer name xvrf2
ip li set xvrf1 up
ip li set xvrf2 master vrf-b up
ip ro add vrf vrf-b 10.200.2.0/24 dev xvrf2
ip ro add 10.200.1.0/24 dev vrf-b
or with addresses:
ip li add xvrf1 type veth peer name xvrf2
ip li set xvrf1 up
ip addr add dev xvrf1 10.200.3.1/30
ip li set xvrf2 master vrf-b up
ip addr add dev xvrf2 10.200.3.2/30
ip ro add vrf vrf-b 10.200.2.0/24 via 10.200.3.1 dev xvrf2
ip ro add 10.200.1.0/24 via 10.200.3.2 dev xvrf1
Yes, this does have a double FIB lookup - one in VRF-B and again in
VRF-A, but I contend this is a design choice. Bind the process to VRF-B
and it works with 1 lookup.
next prev parent reply other threads:[~2019-05-30 3:32 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-24 8:05 [PATCH net-next] vrf: local route leaking George Wilkie
2019-05-24 20:19 ` David Ahern
2019-05-25 7:09 ` George Wilkie
2019-05-25 15:13 ` David Ahern
2019-05-27 8:34 ` George Wilkie
2019-05-30 3:29 ` David Ahern [this message]
2019-05-30 20:52 ` George Wilkie
2019-05-30 21:50 ` David Ahern
2019-05-31 10:38 ` George Wilkie
2019-05-31 14:54 ` David Ahern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1f761acd-80eb-0e80-1cf4-181f8b327bd5@gmail.com \
--to=dsahern@gmail.com \
--cc=davem@davemloft.net \
--cc=gwilkie@vyatta.att-mail.com \
--cc=kuznet@ms2.inr.ac.ru \
--cc=netdev@vger.kernel.org \
--cc=shrijeet@gmail.com \
--cc=yoshfuji@linux-ipv6.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).