如何配置OVN路由器?

概览

基于我上一篇文章中的实验环境,我现在将三层网络基础功能添加到OVN中。最终呈现出来的将是由逻辑路由器连接的一对逻辑交换机。 另外,路由器将被配置为通过OVN中内置的DHCP服务来提供IP地址。

重构逻辑组件

由于设置开始变得更加复杂,我们将重新构建网络架构。 新的逻辑网络拓扑如下:

  • 2 台逻辑交换机 switches: “dmz” 和“inside”
  • 逻辑路由器“tenant1”,它连接着两个逻辑交换机
  • IP网络“dmz” :172.16.255.128/26
  • IP网络“inside”:172.16.255.192/26
  • 每个逻辑交换机上各有一对“虚拟机”

新的逻辑网络如下图所示

如何配置OVN路由器?

理解路由

在本次实验中,我们将创建一个OVN路由器,即“分布式逻辑路由器”(DLR)。 DLR不同于传统路由器,因为它不是物理的设备,而是一种逻辑架构(与逻辑交换机不同)。 DLR仅作为OVS中的一个功能而存在:换句话说,每个OVS实例能够在overlay网络转发流量之前先在本地模拟出一个三层路由器。

创建逻辑交换机和逻辑路由器

在ubuntu1上定义逻辑交换机:


  1. ovn-nbctl ls-add inside 
  2. ovn-nbctl ls-add dmz 

添加逻辑路由器及其关联的路由器和交换机端口:


  1. # 添加路由器tenant1 
  2. ovn-nbctl lr-add tenant1 
  3.   
  4. # 为路由器tenant1创建一个连接到dmz交换机的端口 
  5. ovn-nbctl lrp-add tenant1 tenant1-dmz 02:ac:10:ff:01:29 172.16.255.129/26 
  6.   
  7. # 为dmz交换机创建用于连接到路由器tenant1的端口dmz-tenant1 
  8. ovn-nbctl lsp-add dmz dmz-tenant1 
  9. ovn-nbctl lsp-set-type dmz-tenant1 router 
  10. ovn-nbctl lsp-set-addresses dmz-tenant1 02:ac:10:ff:01:29 
  11. ovn-nbctl lsp-set-options dmz-tenant1 router-port=tenant1-dmz 
  12.   
  13. #为路由器tenant1创建一个连接到inside交换机的端口  
  14. ovn-nbctl lrp-add tenant1 tenant1-inside 02:ac:10:ff:01:93 172.16.255.193/26 
  15.   
  16. #为inside交换机创建用于连接到路由器tenant1的端口inside-tenant1 
  17. ovn-nbctl lsp-add inside inside-tenant1 
  18. ovn-nbctl lsp-set-type inside-tenant1 router 
  19. ovn-nbctl lsp-set-addresses inside-tenant1 02:ac:10:ff:01:93 
  20. ovn-nbctl lsp-set-options inside-tenant1 router-port=tenant1-inside 
  21.   
  22. ovn-nbctl show 

添加 DHCP

OVN中的DHCP与大多数的解决方案有点不同。 大多数人的想法是管理员将:

  1. 给定子网定义一组DHCP选项
  2. 创建逻辑交换机端口,给该端口定义MAC地址和IP地址
  3. 为该端口分配DHCP选项。
  4. 将端口安全设置为仅允许分配的地址

下面,我们将要给4台虚拟机配置逻辑端口。

在ubuntu1上:


  1. ovn-nbctl lsp-add dmz dmz-vm1 
  2. ovn-nbctl lsp-set-addresses dmz-vm1 "02:ac:10:ff:01:30 172.16.255.130" 
  3. ovn-nbctl lsp-set-port-security dmz-vm1 "02:ac:10:ff:01:30 172.16.255.130" 
  4.   
  5. ovn-nbctl lsp-add dmz dmz-vm2 
  6. ovn-nbctl lsp-set-addresses dmz-vm2 "02:ac:10:ff:01:31 172.16.255.131" 
  7. ovn-nbctl lsp-set-port-security dmz-vm2 "02:ac:10:ff:01:31 172.16.255.131" 
  8.   
  9. ovn-nbctl lsp-add inside inside-vm3 
  10. ovn-nbctl lsp-set-addresses inside-vm3 "02:ac:10:ff:01:94 172.16.255.194" 
  11. ovn-nbctl lsp-set-port-security inside-vm3 "02:ac:10:ff:01:94 172.16.255.194" 
  12.   
  13. ovn-nbctl lsp-add inside inside-vm4 
  14. ovn-nbctl lsp-set-addresses inside-vm4 "02:ac:10:ff:01:95 172.16.255.195" 
  15. ovn-nbctl lsp-set-port-security inside-vm4 "02:ac:10:ff:01:95 172.16.255.195" 
  16.   
  17. ovn-nbctl show 

您可能已经注意到,与上一个实验不同,现在通过一条命令就能定义mac和IP地址。 IP地址定义实现了我们的2个目的:

  1. 它通过OVN在本地应答其知道的IP / MAC的ARP请求来实现ARP抑制。
  2. 从哪个端口收到DHCP请求,就会从哪个接口分配IP地址。通过这种方式来实现DHCP。

接下来,我们需要定义DHCP选项并将它们分配给逻辑端口。这里的处理将与我们以前看到的有点不同,因为我们将直接与OVN NB数据库进行交互。 用这种方式的原因是需要捕获DHCP_Options中的UUID,以便我们可以将UUID分配给交换机端口。 为此,我们将把捕获的ovn-nbctl命令的结果输出到一对bash变量中。


  1. dmzDhcp="$(ovn-nbctl create DHCP_Options cidr=172.16.255.128/26 \ 
  2. options="\"server_id\"=\"172.16.255.129\" \"server_mac\"=\"02:ac:10:ff:01:29\" \ 
  3. \"lease_time\"=\"3600\" \"router\"=\"172.16.255.129\"")"  
  4. echo $dmzDhcp 
  5.   
  6. insideDhcp="$(ovn-nbctl create DHCP_Options cidr=172.16.255.192/26 \ 
  7. options="\"server_id\"=\"172.16.255.193\" \"server_mac\"=\"02:ac:10:ff:01:93\" \ 
  8. \"lease_time\"=\"3600\" \"router\"=\"172.16.255.193\"")" 
  9. echo $insideDhcp 
  10.   
  11. ovn-nbctl dhcp-options-list 

如果您想了解有关OVN NB数据库的更多信息,请参阅ovn-nb的手册(译者注:http://openvswitch.org/support/dist-docs/ovn-nb.5.pdf)。

现在,我们将使用存储在变量中的UUID为逻辑交换机端口分配DHCP_Options。


  1. ovn-nbctl lsp-set-dhcpv4-options dmz-vm1 $dmzDhcp 
  2. ovn-nbctl lsp-get-dhcpv4-options dmz-vm1 
  3.   
  4. ovn-nbctl lsp-set-dhcpv4-options dmz-vm2 $dmzDhcp 
  5. ovn-nbctl lsp-get-dhcpv4-options dmz-vm2 
  6.   
  7. ovn-nbctl lsp-set-dhcpv4-options inside-vm3 $insideDhcp 
  8. ovn-nbctl lsp-get-dhcpv4-options inside-vm3 
  9.   
  10. ovn-nbctl lsp-set-dhcpv4-options inside-vm4 $insideDhcp 
  11. ovn-nbctl lsp-get-dhcpv4-options inside-vm4 

配置虚拟机

与上一个实验一样,我们将使用OVS内部端口和网络命名空间构建的“伪虚拟机”。 现在的区别是,我们将使用DHCP进行地址分配。

接下来我们将设置虚拟机。

在ubuntu2上:


  1. ip netns add vm1 
  2. ovs-vsctl add-port br-int vm1 -- set interface vm1 type=internal 
  3. ip link set vm1 address 02:ac:10:ff:01:30 
  4. ip link set vm1 netns vm1 
  5. ovs-vsctl set Interface vm1 external_ids:iface-id=dmz-vm1 
  6. ip netns exec vm1 dhclient vm1 
  7. ip netns exec vm1 ip addr show vm1 
  8. ip netns exec vm1 ip route show 
  9.   
  10. ip netns add vm3 
  11. ovs-vsctl add-port br-int vm3 -- set interface vm3 type=internal 
  12. ip link set vm3 address 02:ac:10:ff:01:94 
  13. ip link set vm3 netns vm3 
  14. ovs-vsctl set Interface vm3 external_ids:iface-id=inside-vm3 
  15. ip netns exec vm3 dhclient vm3 
  16. ip netns exec vm3 ip addr show vm3 
  17. ip netns exec vm3 ip route show 

在 ubuntu3上:


  1. ip netns add vm2 
  2. ovs-vsctl add-port br-int vm2 -- set interface vm2 type=internal 
  3. ip link set vm2 address 02:ac:10:ff:01:31 
  4. ip link set vm2 netns vm2 
  5. ovs-vsctl set Interface vm2 external_ids:iface-id=dmz-vm2 
  6. ip netns exec vm2 dhclient vm2 
  7. ip netns exec vm2 ip addr show vm2 
  8. ip netns exec vm2 ip route show 
  9.   
  10. ip netns add vm4 
  11. ovs-vsctl add-port br-int vm4 -- set interface vm4 type=internal 
  12. ip link set vm4 address 02:ac:10:ff:01:95 
  13. ip link set vm4 netns vm4 
  14. ovs-vsctl set Interface vm4 external_ids:iface-id=inside-vm4 
  15. ip netns exec vm4 dhclient vm4 
  16. ip netns exec vm4 ip addr show vm4 
  17. ip netns exec vm4 ip route show 

测试网络连通性

在ubuntu2上,从vm1测试网络连通性:


  1. # ping vm1的默认网关 
  2. root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.129 
  3. PING 172.16.255.129 (172.16.255.129) 56(84) bytes of data. 
  4. 64 bytes from 172.16.255.129: icmp_seq=1 ttl=254 time=0.689 ms 
  5. 64 bytes from 172.16.255.129: icmp_seq=2 ttl=254 time=0.393 ms 
  6. 64 bytes from 172.16.255.129: icmp_seq=3 ttl=254 time=0.483 ms   
  7. # 从 overlay网络ping vm2(跨越整个 tenant1) 
  8. root@ubuntu2:~# ip netns exec vm1  ping 172.16.255.131 
  9. PING 172.16.255.131 (172.16.255.131) 56(84) bytes of data. 
  10. 64 bytes from 172.16.255.131: icmp_seq=1 ttl=64 time=2.16 ms 
  11. 64 bytes from 172.16.255.131: icmp_seq=2 ttl=64 time=0.573 ms 
  12. 64 bytes from 172.16.255.131: icmp_seq=3 ttl=64 time=0.446 ms   
  13. # 经过 router ping通 vm3(跨越整个 overlay网络) 
  14. root@ubuntu2:~# ip netns exec vm1  ping 172.16.255.194 
  15. PING 172.16.255.194 (172.16.255.194) 56(84) bytes of data. 
  16. 64 bytes from 172.16.255.194: icmp_seq=1 ttl=63 time=1.37 ms 
  17. 64 bytes from 172.16.255.194: icmp_seq=2 ttl=63 time=0.077 ms 
  18. 64 bytes from 172.16.255.194: icmp_seq=3 ttl=63 time=0.076 ms   
  19. #经过 router ping 通vm4(跨越整个 overlay网络) 
  20. root@ubuntu2:~# ip netns exec vm1  ping 172.16.255.195 
  21. PING 172.16.255.195 (172.16.255.195) 56(84) bytes of data. 
  22. 64 bytes from 172.16.255.195: icmp_seq=1 ttl=63 time=1.79 ms 
  23. 64 bytes from 172.16.255.195: icmp_seq=2 ttl=63 time=0.605 ms 
  24. 64 bytes from 172.16.255.195: icmp_seq=3 ttl=63 time=0.503 ms 

结语

OVN使得第三层overlay网络易于部署和管理。 另外像DHCP的服务直接构建到系统中的方式,有助于减少构建有效的SDN解决方案所需的外部组件的数量。 在下一篇文章中,将讨论如何将我们(当前隔离的)overlay网络连接到外部世界。


作者:佚名

来源:51CTO

上一篇:0016 c/c++语言 二进制转换为十进制


下一篇:AIX 学习笔记之 存储管理 LV PV VG PP