Linux 上使用网络命名空间的 VRF

Linux 上使用网络命名空间的 VRF

我的最终目标是在 Linux 中实现虚拟路由和转发 (VRF)。似乎最广泛接受的方法是设置不同的网络名称空间(每个单独的路由表一个),并为每个命名空间/路由表运行 Quagga 或 BIRD 守护程序。我并不拘泥于这种方法,所以如果有人有其他建议,请告诉我。

有问题的机器在 VMware 工作站 12 内运行 Debian 7(wheezy)。它一直是一个路由器,在我开始重新配置之前已经成功路由了一段时间,所以我知道一般的路由设置是好的。

直接的问题是我无法通过我的网络命名空间进行通信。也就是说,veth1(位于我的命名空间中,如下所示)只能 ping veth0,而不能 ping 其他任何网络。veth1 与其下方的网络之间没有网络通信 - 甚至没有 ARP。如果我不知道的话,我会说有人从交换机上拔掉了电缆(但在虚拟环境中这样做有点困难)。是的,我检查了 vmnet 是否正确设置。路由器在恢复到旧配置时可以工作。它只是在这个新配置下不起作用。

有人知道如何让 veth1 进行通信吗?或者有完全不同的方法让 VRF 在 Linux 上工作吗?提前致谢。

我设置了新的配置如下:

添加命名空间

ip netns add nsx

添加虚拟接口

ip link add veth0 type veth peer name veth1

建立桥梁

ip link add name vbr0 type bridge

将 eth1 和 veth1 添加到网桥

ip link set dev eth1 master vbr0
ip link set dev veth1 master vbr0

将 veth1 分配给命名空间

ip link set veth1 netns nsx

配置 veth 的 IP

ip addr add 10.0.2.10/24 dev vbr0
ip addr add 10.0.2.1/24 dev veth0
ip netns exec nsx ip addr add 10.0.2.2/24 dev veth1

调高 i/f

ip link set dev vbr0 up
ip link set dev veth0 up
ip netns exec nsx ip link set dev veth1 up

为 veth2 分配自己的路由表

ip netns exec nsx ip rule add dev veth1 table 1

设置 vtable 的默认路由

ip netns exec nsx ip route add default via 10.0.2.1 dev veth1

您可以在 iptables-save 的输出中看到所有内容都已根据需要设置为 ACCEPT 或 FORWARD

ip addr show 的输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:10:e0:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.26.5/24 brd 192.168.26.255 scope global eth0
    inet 192.168.26.0/24 brd 192.168.26.255 scope global secondary eth0
    inet6 fe80::20c:29ff:fe10:e001/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vbr0 state UP qlen 1000
    link/ether 00:0c:29:10:e0:ed brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth1
    inet6 fe80::20c:29ff:fe10:e0ed/64 scope link
       valid_lft forever preferred_lft forever
47: veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether ce:63:69:82:73:35 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.1/24 scope global veth0
    inet6 fe80::cc63:69ff:fe82:7335/64 scope link tentative
       valid_lft forever preferred_lft forever
48: vbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether 00:0c:29:10:e0:ed brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.10/24 scope global vbr0
    inet6 fe80::20c:29ff:fe10:e0ed/64 scope link tentative
       valid_lft forever preferred_lft forever

ip route show 的输出:

 default via 192.168.26.2 dev eth0
    10.0.0.0/24 dev eth1  proto kernel  scope link  src 10.0.0.1
    10.0.2.0/24 dev vbr0  proto kernel  scope link  src 10.0.2.10
    10.0.2.0/24 dev veth0  proto kernel  scope link  src 10.0.2.1
    192.168.26.0/24 dev eth0  proto kernel  scope link  src 192.168.26.5

ip netns exec nsx ip addr show 的输出:

    45: lo: <LOOPBACK> mtu 16436 qdisc noop state DOWN
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    46: veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
        link/ether b6:27:40:06:c2:de brd ff:ff:ff:ff:ff:ff
        inet 10.0.2.2/24 scope global veth1
        inet6 fe80::b427:40ff:fe06:c2de/64 scope link tentative
           valid_lft forever preferred_lft forever

ip netns exec nsx ip route show 的输出

 default via 10.0.2.1 dev veth1
    10.0.2.0/24 dev veth1  proto kernel  scope link  src 10.0.2.2

iptables-save 的输出

# Generated by iptables-save v1.4.14 on Thu Apr 14 18:19:19 2016
*nat
:PREROUTING ACCEPT [36:3588]
:INPUT ACCEPT [32:2540]
:OUTPUT ACCEPT [51:3744]
:POSTROUTING ACCEPT [55:4792]
COMMIT
# Completed on Thu Apr 14 18:19:19 2016
# Generated by iptables-save v1.4.14 on Thu Apr 14 18:19:19 2016
*filter
:INPUT ACCEPT [3319:373389]
:FORWARD ACCEPT [8:2004]
:OUTPUT ACCEPT [3558:428447]
COMMIT
# Completed on Thu Apr 14 18:19:19 2016

答案1

从内核版本 4.3 开始,Linux 有一个 VRF 实现。检查: https://www.kernel.org/doc/Documentation/networking/vrf.txt

相关内容