在 VRF 中绑定本地应用程序

在 VRF 中绑定本地应用程序

在Linux中,默认情况下有一个环回接口,其loIP地址127.0.0.1/8可以绑定到本地应用程序。

不可能将 VRF 内部的本地应用程序绑定到此环回接口,例如:

ip link add vrf100 type vrf table 100
ip vrf exec vrf100 python3 -m http.server --bind 127.0.0.1
OSError: [Errno 99] 无法分配请求的地址

问题是,如何在 VRF 中创建环回接口,也许使用不同的 IP 地址(例如 127.0.0.2),我可以在其中将本地应用程序绑定到:

ip vrf exec vrf100 python3 -m http.server --bind 127.0.0.2 ???如何进行这项工作

谢谢

答案1

老实说,我自己对 VRF 有点陌生,但我认为 lo 只需要成为会员即可,仅供参考:

如何在 Linux VRF 中分配环回地址?

但这是我的想法:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

该接口是一个环回接口;它不是一个转发接口,它有自己的表local

ip route show table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 
local 192.168.1.12 dev wlp114s0 proto kernel scope host src 192.168.1.12 
broadcast 192.168.1.255 dev wlp114s0 proto kernel scope link src 192.168.1.12 

这是我的两点意见,如果您正在收听,您实际上不需要将其分配给 VRF,127.0.0.1因为无论如何它都不会去任何地方。

另一方面,除非您创建规则来ip rule查找 VRF 表,否则 VRF 将完全隔离,因此您实际上可以将接口分配给 VRF,为其分配地址,并且只要您没有规则路由到其路由表中即可它是孤立的。您分配给 VRF 的任何接口,其路由都会进入其相应的表中,但如果您将主机/默认 gw 接口分配给 VRF,那么这些路由也将位于该表中;另一种方法是使用ip rule在表之间设置路由。

如果我可以向您提供我的观点:

sudo ip netns exec _netcrave ip route show table 130
192.0.0.4/30 dev vma130 proto kernel scope link src 192.0.0.5 
local 192.0.0.5 dev vma130 proto kernel scope host src 192.0.0.5 
broadcast 192.0.0.7 dev vma130 proto kernel scope link src 192.0.0.5 

sudo ip netns exec _netcrave ip route show
10.0.0.0/16 dev docker0 proto kernel scope link src 10.0.0.1 linkdown 
10.254.0.0/30 dev igwsl127 proto kernel scope link src 10.254.0.2 

ip route show
default via 192.168.1.1 dev wlp114s0 proto dhcp src 192.168.1.12 metric 600 
169.254.0.0/16 dev wlp114s0 scope link metric 1000 
192.168.1.0/24 dev wlp114s0 proto kernel scope link src 192.168.1.12 metric 600 

通常,创建规则来查找表的方式如下:

ip netns exec _netcrave ip rule add to 192.0.0.4/30 table 130然后你会得到如下所示的东西:

sudo ip netns exec _netcrave ip rule show
0:      from all lookup local
999:    from all to 192.0.0.4/30 lookup 130
1000:   from all lookup [l3mdev-table]
32766:  from all lookup main
32767:  from all lookup default

通常情况ip vrf exec下,当您想要绑定为源地址时,例如,ip vrf exec red130 ping 192.0.0.6如果 192.0.0.5 的接口实际上已分配给该 VRF,则确保我从 192.0.0.5 执行 ping 操作,否则您不需要要使用 vrf exec,接口可见,但路由表不可见。但是,如果您使用 NetNS,您肯定需要使用ip netns exec,否则它将找不到该接口。

这是我想到的另一件事:

sudo ip netns exec _netcrave ip route show table local
local 10.0.0.1 dev docker0 proto kernel scope host src 10.0.0.1 
broadcast 10.0.255.255 dev docker0 proto kernel scope link src 10.0.0.1 linkdown 
local 10.254.0.2 dev igwsl127 proto kernel scope host src 10.254.0.2 
broadcast 10.254.0.3 dev igwsl127 proto kernel scope link src 10.254.0.2 
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 

你会注意到我的另一个本地表

local 192.168.1.12 dev wlp114s0 proto kernel scope host src 192.168.1.12 
    broadcast 192.168.1.255 dev wlp114s0 

理论上你可以创建一条到自身的环回路由并将其添加到此表中事实上也许我错了但我认为这就是这里的意图:

https://community.cisco.com/t5/switching/vrf-loopback-interface-into-global-table/td-p/3192007

答案2

所以,我最初的要求是我在 VRF 中运行一个应用程序,它有一个管理界面,我想将其绑定到本地主机,例如

ip vrf exec vrf100 myapp --adminif <localhost in vrf100> --userif <physical interface in vrf100>

我找到了一个像这样的工作解决方案:

ip link add vrf100 type vrf table 100 #create vrf with table 100
ip link add lo-vrf100 type dummy      #add dummy interface that will serve as our loopback
ip link set lo-vrf100 master vrf100   #enslave the interface to vrf100
ip addr add 127.0.0.2/8 dev lo-vrf100 #add ip to this interface
ip link set vrf100 up
ip link set lo-vrf100 up

现在,如果我们查看策略路由表,它看起来像这样(规则 0 在 1000 之前处理,依此类推):

ip rule show
0:      from all lookup local
1000:   from all lookup [l3mdev-table]
32766:  from all lookup main
32767:  from all lookup default

如果我们查看本地路由表:

ip route sh table local
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1

然后我们看到这里处理的是ip范围127.0.0.0/8,但是我们的vrf是在特殊表[l3mdev-table]中处理的,这个表稍后会处理。

ip route sh table 100
127.0.0.0/8 dev lo-vrf100 proto kernel scope link src 127.0.0.2
local 127.0.0.2 dev lo-vrf100 proto kernel scope host src 127.0.0.2
broadcast 127.255.255.255 dev lo-vrf100 proto kernel scope link src 127.0.0.2

from all lookup local所以解决方案是在策略路由条目之前创建一条规则来处理我们的 ip 127.0.0.2 。

ip rule add table local priority 100 #have an identical entry but with a higher prio
ip rule add from 127.0.0.2 table 100 prio 50
ip rule add to 127.0.0.2 table 100 prio 51
ip rule del priority 0 #delete the original local rule

最终策略路由表如下所示:

ip rule sh
50:     from 127.0.0.2 lookup 100
51:     from all to 127.0.0.2 lookup 100
100:    from all lookup local
1000:   from all lookup [l3mdev-table]
32766:  from all lookup main
32767:  from all lookup default

我第一篇文章中的示例 python http 服务器工作正常:

ip vrf exec vrf100 python3 -m http.server --bind 127.0.0.2
Serving HTTP on 127.0.0.2 port 8000 (http://127.0.0.2:8000/) 
ip vrf exec vrf100 wget http://127.0.0.2:8000 #downloads file sucessully

相关内容