使用第三个命名空间作为路由器的命名空间之间的 InterVLAN

使用第三个命名空间作为路由器的命名空间之间的 InterVLAN

我需要在 2 个命名空间(一个具有ip add 10.0.0.1/24 gateway 10.0.0.254,另一个具有ip add 20.0.0.1/24 gateway 20.0.0.254)之间建立连接,这些命名空间位于不同的 VLAN(10 和 20)中;它们连接到 OVS 桥,第三个名称空间必须充当路由器 - 这可能吗?该接口通过两个接口连接到桥接器。我分配给接口 gw1 10.0.0.254 和另一个接口 gw2 20.0.0.254。当我没有将 VLAN 标记分配给网桥和命名空间 1 之间的接口以及 gw1 时,我确实设法获得了 ICMP 回复,但是当我将一个 VLAN 标记分配给交换机的端口时,什么也没有发生,只是“目标主机不可达”。当我使用wireshark时,似乎ARP没有得到答案。我缺少什么?

创建命名空间:

sudo ip netns add namespace1
sudo ip netns add namespace2
sudo ip netns add router

创建链接:

sudo ip link add vif1 type veth peer name ethns1
sudo ip link add vif2 type veth peer name ethns2
sudo ip link add vif11 type veth peer name gw1
sudo ip link add vif22 type veth peer name gw2

创建 ovs 网桥并连接端口:

sudo ovs-vsctl add-br switch
sudo ovs-vsctl add-port switch vif1
sudo ovs-vsctl add-port switch vif11
sudo ovs-vsctl add-port switch vif2
sudo ovs-vsctl add-port switch vif22

将 veth 附加到命名空间:

sudo ip link set dev ethns1 netns namespace1
sudo ip link set dev ethns2 netns namespace2
sudo ip link set dev gw1 netns router
sudo ip link set dev gw2 netns router 

配置命名空间的地址:

sudo ip netns exec namespace1 ifconfig ethns1 10.0.0.1 netmask 255.255.255.0 up
sudo ip netns exec namespace1 route add default gw 10.0.0.254
sudo ip netns exec namespace2 ifconfig ethns2 20.0.0.1 netmask 255.255.255.0 up
sudo ip netns exec namespace2 route add default gw 20.0.0.254
sudo ip netns exec router ifconfig gw1 10.0.0.254 netmask 255.255.255.0 up
sudo ip netns exec router ifconfig gw2 20.0.0.254 netmask 255.255.255.0 up

设置接口:

sudo ip link set dev vif1 up
sudo ip link set dev vif2 up
sudo ip link set dev vif11 up
sudo ip link set dev vif22 up

在命名空间 3(路由器)中启用 IP 转发:

sudo ip netns exec router sysctl -w net.ipv4.ip_forward=1

我仍然没有将 VLAN 标记添加到交换机的端口,并且我可以从 namespace1 到达 gw1,但是当我这样做时:

sudo ovs-vsctl -- set port vif1 tag=10
sudo ovs-vsctl -- set port vif2 tag=20

我不确定这两个。

sudo ovs-vsctl -- set port vif22 trunk=10,20 
sudo ovs-vsctl -- set port vif11 trunk=10,20

然后什么也没发生:(

我还是一个使用 Ubuntu 的新手,所以我寻求帮助。

答案1

以前没有使用过 Open vSwitch,现在我不得不尝试一下。

关键信息在 中man 5 ovs-vswitchd.conf.db,其中对各种内容vlan_mode进行了解释。

特别是,对于一个使用权端口,在交换机内部,数据包始终带有标记,在交换机外部,它没有标记,并且在入口处添加标签,而在出口处则将其删除。这就是我在你的描述后所怀疑的,但很高兴确定一下。

因此,为了仅使用访问端口来实现您的场景,我使用了三个命名空间ns0(路由器),ns1如下ns2所示:

ns0:
  veth0b (peer veth0a), 10.0.10.254/24
  veth0d (peer veth0c), 10.0.20.254/24

ns1:
  veth1b (peer veth1a), 10.0.10.1/24

ns2:
  veth2b (peer veth2a), 10.0.20.1/24

main namespace:
  br0 (ovs):
    veth0a (access, tag=100)
    veth0c (access, tag=200)
    veth1a (access, tag=100)
    veth2a (access, tag=200)

在每个命名空间中启动一个非常方便xterm(我更喜欢彩色背景),然后您还可以tcpdump在命名空间内调试数据包流。

创建名称空间,创建 veth-pairs,根据需要移动到名称空间,不要忘记set每个链接up。然后

ns0

sudo ip addr add 10.0.10.254/24 dev veth0b
sudo ip addr add 10.0.20.254/24 dev veth0d
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

ns1

sudo ip addr add 10.0.10.1/24 dev veth1b
sudo ip route add default via 10.0.10.254

ns2

sudo ip addr add 10.0.20.1/24 dev veth2b
sudo ip route add default via 10.0.20.254

在主命名空间中:

sudo ovs-vsctl add-br br0
sudo ovs-vsctl add-port br0 veth0a tag=100
sudo ovs-vsctl add-port br0 veth0c tag=200
sudo ovs-vsctl add-port br0 veth1a tag=100
sudo ovs-vsctl add-port br0 veth2a tag=200

现在,在每个命名空间中,ping 应该可以正常工作,首先测试直接伙伴,然后测试路由伙伴。

我们还可以将两个访问端口 veth-pairs 替换为单个集群的veth 对。无需添加trunk=100,200,因为默认情况下每个非访问端口都是所有 VLAN 的中继端口。

在主命名空间中:

sudo ovs-vsctl del-port br0 veth0a
sudo ovs-vsctl del-port br0 veth0c
sudo ip link del veth0a
sudo ip link del veth0c
sudo ip link add veth0a type veth peer name veth0b netns ns0
sudo ip link set veth0a up
sudo ovs-vsctl add-port br0 veth0a

ns0

sudo ip link add link veth0b name veth0b.100 type vlan id 100
sudo ip link add link veth0b name veth0b.200 type vlan id 200
sudo ip link set veth0b up
sudo ip addr add 10.0.10.254/24 dev veth0b.100
sudo ip addr add 10.0.20.254/24 dev veth0b.200

然后像上面那样测试。

相关内容