我的最终目标是在 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。