概览

基于我的前2篇文章中的实验环境,我现在将一个OVN网关路由器(OVN Gateway Router)添加进来。 此网关路由器将提供从我们的overlay网络访问物理网络的能力。

实验环境

为了演示网关路由器,我们需要向Ubuntu主机添加另一个物理网络:在每台主机eth1网卡添加网络10.127.0.128/25。
最终的物理网络拓扑如下图所示:

OVN L3 Gateway介绍

OVN网关用作overlay网络和物理网络之间的上行/下行通道。它有两个功能:

  • L2将OVN逻辑交换机桥接到VLAN中;

  • L3在OVN路由器和物理网络之间提供三层链路。

为了达成实验的目标,我们将重点介绍如何创建一个三层网关,其会作为我们的物理网络和逻辑网络之间的分界点。
与分布式逻辑路由器(DLR)不同,OVN网关路由器集中在单个主机(chassis)上,因此它可以提供尚不支持分布式的服务(NAT,负载平衡等)。

但是OVN网关发布的时候,还存在着某些限制:

  • 网关路由器仅可以经由逻辑交换机连接到其他路由器,而DLR已经可以经由一条链路直连路由器。社区正在进行相关工作来解决掉这个限制。

  • OVN支持多个网关路由器绑定到环境中,这意味着可以逻辑空间执行入站ECMP路由。然而,OVN当前不支持网关路由器之间的出站ECMP。这个特性也同样是OVN未来需要加强的。

使ubuntu1成为OVN主机

我们使用ubuntu1作为OVN网关路由器主机,而不是虚拟机。

首先为相应主机角色安装正确的OVN包:

dpkg -i ovn-host_2.6.0-1_amd64.deb

然后注册到OVN Central(ubuntu1自身):

ovs-vsctl set open . external-ids:ovn-remote=tcp:127.0.0.1:6642

ovs-vsctl set open . external-ids:ovn-encap-type=geneve

ovs-vsctl set open . external-ids:ovn-encap-ip=10.127.0.2

测试网络连通性:

root@ubuntu1:~# netstat -antp | grep 127.0.0.1

tcp        0      0 127.0.0.1:6642          127.0.0.1:55566         ESTABLISHED 4999/ovsdb-server

tcp        0      0 127.0.0.1:55566         127.0.0.1:6642          ESTABLISHED 15212/ovn-controlle

此外,如果OVN没有自动创建集成网桥,还需要手工创建集成网桥:

ovs-vsctl add-br br-int -- set Bridge br-int fail-mode=secure

OVN 逻辑网络拓扑

让我们在开始配置之前看一下为本次实验设计的网络架构。

我们创建的OVN逻辑网络拓扑如下图所示:

正如您所看到的,我们添加了以下新组件:

  • OVN网关路由器(edge1)

  • 逻辑交换机(transit),用于连接edge1和tenant1路由器

  • 逻辑交换机(outside),用于将edge1连接到实验室网络

添加L3 Gateway

如上图所述,gatway路由器将绑定到一个特定的 chassis(在我们的例子中是ubuntu1)。 为了完成这个绑定,我们需要找到ubuntu1的 chassis ID。 使用ubuntu1中的ovn-sbctl show命令,您应该能看到类似于此的输出:

ovn-sbctl show

Chassis "833ae1bd-ced3-494a-a95b-f2dc54172b71"

hostname: "ubuntu1"

Encap geneve

ip: "10.127.0.2"

options: {csum="true"}

Chassis "239f2c28-90ff-468f-a701-655585c630bf"

hostname: "ubuntu3"

Encap geneve

ip: "10.127.0.3"

options: {csum="true"}

Port_Binding "dmz-vm2"

Port_Binding "inside-vm4"

Chassis "517d558e-158a-4cb2-8870-283e9d39685e"

hostname: "ubuntu2"

Encap geneve

ip: "10.127.0.129"

options: {csum="true"}

Port_Binding "inside-vm3"

Port_Binding "dmz-vm1"

复制ubuntu1主机的chassis UUID供下文使用。

创建新的逻辑路由器。 请务必使用有效的UUID替换{chassis_id}。

在ubuntu1进行如下操作:

# 创建 router edge1

ovn-nbctl create Logical_Router name=edge1 options:chassis={chassis_uuid}

#创建连接edge1和tenant1 routers的逻辑交换机transit

ovn-nbctl ls-add transit

# edge1 到 the transit switch

ovn-nbctl lrp-add edge1 edge1-transit 02:ac:10:ff:00:01 172.16.255.1/30

ovn-nbctl lsp-add transit transit-edge1

ovn-nbctl lsp-set-type transit-edge1 router

ovn-nbctl lsp-set-addresses transit-edge1 02:ac:10:ff:00:01

ovn-nbctl lsp-set-options transit-edge1 router-port=edge1-transit

# tenant1 到the transit switch

ovn-nbctl lrp-add tenant1 tenant1-transit 02:ac:10:ff:00:02 172.16.255.2/30

ovn-nbctl lsp-add transit transit-tenant1

ovn-nbctl lsp-set-type transit-tenant1 router

ovn-nbctl lsp-set-addresses transit-tenant1 02:ac:10:ff:00:02

ovn-nbctl lsp-set-options transit-tenant1 router-port=tenant1-transit

#添加静态路由

ovn-nbctl lr-route-add edge1 "172.16.255.128/25" 172.16.255.2

ovn-nbctl lr-route-add tenant1 "0.0.0.0/0" 172.16.255.1

ovn-sbctl show

注意ubuntu1主机上的端口绑定。
现在可以测试从ubuntu2上的vm1到edge1的网络连通性:

root@ubuntu2:~# ip netns exec vm1 ping 172.16.255.1

PING 172.16.255.1 (172.16.255.1) 56(84) bytes of data.

64 bytes from 172.16.255.1: icmp_seq=1 ttl=253 time=1.07 ms

64 bytes from 172.16.255.1: icmp_seq=2 ttl=253 time=1.13 ms

64 bytes from 172.16.255.1: icmp_seq=3 ttl=253 time=1.00 ms

连接到 “data”网络

我们将使用ubuntu1的eth1接口作为我们在edge1路由器和“数据”网络之间的连接点。 为了实现这一点,我们需要将OVN设置为通过专用OVS桥直接使用eth1接口。 这种类型的连接在OVN中称为“localnet”。

在ubuntu1进行如下操作:

#在路由器 'edge1'创建新的端口

ovn-nbctl lrp-add edge1 edge1-outside 02:0a:7f:00:01:29 10.127.0.129/25

# 新建逻辑交换机,并将它连接到edge1

ovn-nbctl ls-add outside

ovn-nbctl lsp-add outside outside-edge1

ovn-nbctl lsp-set-type outside-edge1 router

ovn-nbctl lsp-set-addresses outside-edge1 02:0a:7f:00:01:29

ovn-nbctl lsp-set-options outside-edge1 router-port=edge1-outside

# 为 eth1新建OVS网桥

ovs-vsctl add-br br-eth1

# 为 eth1创建网桥映射: 把 "dataNet" 映射到 br-eth1

ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-mappings=dataNet:br-eth1

#在 'outside'交换机创建localnet端口。把网络名称设置为"dataNet"

ovn-nbctl lsp-add outside outside-localnet

ovn-nbctl lsp-set-addresses outside-localnet unknown

ovn-nbctl lsp-set-type outside-localnet localnet

ovn-nbctl lsp-set-options outside-localnet network_name=dataNet

# 将 eth1 连接到 br-eth1

ovs-vsctl add-port br-eth1 eth1

从vm1测试到edge1-outside的网络连通性

root@ubuntu2:~# ip netns exec vm1 ping 10.127.0.129

PING 10.127.0.129 (10.127.0.129) 56(84) bytes of data.

64 bytes from 10.127.0.129: icmp_seq=1 ttl=253 time=1.74 ms

64 bytes from 10.127.0.129: icmp_seq=2 ttl=253 time=0.781 ms

64 bytes from 10.127.0.129: icmp_seq=3 ttl=253 time=0.582 ms

让Ubuntu主机访问“data”网络

对于ubuntu2 / ubuntu3,实际上只需要配置一个参数:给它们的物理网卡(本文中的eth1)设置一个IP。

对于ubuntu1,我们将在br-eth1接口上设置一个IP。

在ubuntu1上:

ip addr add 10.127.0.130/24 dev br-eth1

ip link set br-eth1 up

在ubuntu2上:

ip addr add 10.127.0.131/24 dev eth1

ip link set eth1 up

在ubuntu3上:

ip addr add 10.127.0.132/24 dev eth1

ip link set eth1 up

在ubuntu1 上测试到 edge1的网络连通性:

root@ubuntu1:~# ping 10.127.0.129

PING 10.127.0.129 (10.127.0.129) 56(84) bytes of data.

64 bytes from 10.127.0.129: icmp_seq=1 ttl=254 time=0.563 ms

64 bytes from 10.127.0.129: icmp_seq=2 ttl=254 time=0.290 ms

64 bytes from 10.127.0.129: icmp_seq=3 ttl=254 time=0.333 ms

配置NAT

让我们看看从vm1 ping ubuntu1时会发生什么:

root@ubuntu2:~# ip netns exec vm1 ping 10.127.0.130

PING 10.127.0.130 (10.127.0.130) 56(84) bytes of data.

^C

--- 10.127.0.130 ping statistics ---

3 packets transmitted, 0 received, 100% packet loss, time 2016ms

不出所料,果然ping不通。 为什么不通? 让我们看一下来自ubuntu1的tcpdump的输出结果:

root@ubuntu1:~# tcpdump -i br-eth1

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on br-eth1, link-type EN10MB (Ethernet), capture size 262144 bytes

14:41:53.057993 IP 172.16.255.130 > 10.127.0.130: ICMP echo request, id 19359, seq 1, length 64

14:41:54.065696 IP 172.16.255.130 > 10.127.0.130: ICMP echo request, id 19359, seq 2, length 64

14:41:55.073667 IP 172.16.255.130 > 10.127.0.130: ICMP echo request, id 19359, seq 3, length 64

我们可以看到请求进来,但是我们的响应通过不同的接口返回(在tcpdump输出中看不到)。

这是因为ubuntu1没有到172.16.255.130的路由,并且通过其自己的默认网关进行响应。

我们有2种方法来解决这个问题:

  • 在Ubuntu主机上添加静态路由

  • 在OVN网关路由器上设置NAT

我们将选择第2种方法,因为它比管理静态路由更容易些。

OVN有3种类型的NAT可以配置:

  • DNAT ——用于将请求从外部可见的IP转换为内部IP

  • SNAT ——用于将请求从一个或多个内部IP转换为外部可见的IP

  • SNAT-DNAT ——用于创建“静态NAT”,将外部IP映射到内部IP,反之亦然

由于我们不需要(或希望)公共网络能够直接访问我们的内部虚拟机,因此我们将重点放在允许从我们的虚拟机进行出站SNAT。 为了创建NAT规则,我们需要直接操纵OVN北向数据库。 语法有点奇怪,但我稍后会解释的。

在ubuntu1上:

# create snat rule which will nat to the edge1-outside interface

ovn-nbctl -- --id=@nat create nat type="snat" logical_ip=172.16.255.128/25

external_ip=10.127.0.129 -- add logical_router edge1 nat @nat

简而言之,此命令在北向数据库的“nat”表中创建一个条目,再将同时产生的UUID存储在ovsdb的变量“@nat”中。

然后将存储在@nat中的UUID添加到北向数据库的“logical_router”表中的“edge1”条目的“nat”字段。

如果你想知道北向数据库的细节,那么一定要去查阅ovn-nb的手册页。ovn-nbctl的手册页还解释了上面使用的命令语法。

从vm1测试网络连通性:

root@ubuntu2:~# ip netns exec vm1 ping 10.127.0.130

PING 10.127.0.130 (10.127.0.130) 56(84) bytes of data.

64 bytes from 10.127.0.130: icmp_seq=40 ttl=62 time=2.39 ms

64 bytes from 10.127.0.130: icmp_seq=41 ttl=62 time=1.61 ms

64 bytes from 10.127.0.130: icmp_seq=42 ttl=62 time=1.28 ms

如上所示,我们现在可以从内部虚拟机ping通外部网络。

结语

纯overlay网络几乎是完全没有用的,除非你能将它们连接到外部世界。 OVN网关提供用于进行这种连接的手段。在下一篇文章中,我将介绍OVN的另一个重要功能:OVN负载均衡器。

注:

本文翻译自:http://blog.spinhirne.com/2016/09/the-ovn-gateway-router.html

译文已投稿SDNLAB并发表:http://www.sdnlab.com/19216.html

SDN控制器之OVN实验三:从OVN虚拟网络访问物理网络相关推荐

  1. SDN控制器之OVN实验一:介绍和安装OVN

    本文是博主投稿SDNLAB的文章.原文链接:http://www.sdnlab.com/19157.html OVN概览 OVN是由开发出OVS的那群出色的程序员们的另一个优秀的作品.这个网络虚拟化项 ...

  2. 华三讲堂:Overlay网络与物理网络的关系

    http://www.ctiforum.com/news/guandian/441144.html 在以往IT建设中,硬件服务器上运行的是虚拟层的计算,物理网络为了与虚拟服务器对接,需要网络自己进行调 ...

  3. SDN控制器之POX篇

    1. 安装POX POX基于Python2.7的环境运行,官方版本的POX可以运行在Windows.Mac OS.以及Linux操作系统中.POX源码已在github发布,可将POX的源码下载到本地机 ...

  4. eNSP内部网络访问外部网络实验

    实验目的 掌握ospf协议的配置方法: 掌握telnet远程登录的基本配置: 掌握交换机端口的 VLAN 配置方法. 实验内容 内部网络要求互通: 内部网络能够连接外部的服务器: 路由器能够获取外部服 ...

  5. 对等网中计算机网卡是怎么安装的,实验三 对等网的组建

    实验三 对等网的组建及常用网络命令的使用 一.实验目的 (1)理解对等网的基本概念和特点 (2)熟悉组建对等网的网卡.交换机.线缆等网络硬件设备 (3)熟悉网络组件及各参数的设置和安装方法 (4)掌握 ...

  6. Linux实验三父子进程每隔3秒,实验三进程的创建和简单控制(学生分析.doc

    实验三进程的创建和简单控制(学生分析 实验 进程的创建和简单控制 实验目的: 掌握进程的概念和进程的状态,对进程有感性的认识: 掌握进程创建方法: 认识进程的并发执行,了解进程族之间各种标识及其存在的 ...

  7. c语言p1口转向灯实验,实验三模拟汽车左右转向灯控制.doc

    评阅 单片机实验报告(实验三) 姓名张培 林志霖 学号 51 28 班级 13-电信MT时间 A-504 地点 实验名称: 模拟汽车左右转向灯控制实验 实验目的 熟悉C语言的基本语句.复合语句.条件选 ...

  8. sdn体系的三个平面_软件定义网络基础---SDN控制平面

    一:SDN控制平面 一个或多个SDN控制器组成,是网络的大脑.  对底层网络交换设备进行集中管理,状态监测.转发决策以及处理和调 度数据平面的流量:  通过北向接口向上层应用开放多个层次的可编程能 ...

  9. 计算机控制pid控制实验,计算机控制实验三数字PID调节器算法的研究

    计算机控制技术实验报告 学院:********** 班级:********** 姓名:****** 学号:**********实验三 数字PID调节器算法的研究 实验项目名称:数字PID调节器算法的研 ...

最新文章

  1. Python zip() 函数
  2. python实现数据库连接池_Python实现Mysql数据库连接池
  3. linux qemu 源码编译
  4. 局域网samba配置,以及在Windows环境下的访问
  5. oracle实例包括哪几部分,数据库的实例组成部分及作用是什么?一个oracle数据库可以有多个实例吗?...
  6. python中的深浅拷贝的区别
  7. 中农大计算机组成原理在线作业1,河北农大2017计算机组成原理_在线作业_1课案.docx...
  8. python模块导入及属性:import
  9. week15-字符串
  10. TreeView 右键菜单
  11. Linux 发展史小览
  12. Android 2020年最新保活方案 保活90% 已适配8.0 ,9.0, 10.0(酷狗音乐)
  13. c语言借助中间变量完成的作业,北京交通大学黄宇黄宇老师C语言第一次作业.doc...
  14. EXCEL POI单元格下拉的两种实现方式
  15. vscode markdown 导出PDF错误
  16. 新版火狐 拖 功能_Firefox 33的新功能
  17. 栈解旋unwinding
  18. lqc_SSH配置与使用
  19. ubuntu无法挂载大容量U盘
  20. java毕业设计的自助旅游导航系统mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. 开源项目的演进会遇到哪些“坑”?KubeVela 从发起到晋级 CNCF 孵化的全程回顾
  2. 大唐豪侠服务器列表文件格式错误,关于大唐豪侠一键端的一些问题心得
  3. Spark:The Definitive Guide--读书小结(五)
  4. java图片小猫,LAVApi.java
  5. 不藏了!分享100个Python小技巧!!
  6. 投入到炼钢的大熔炉中去!
  7. Excel匹配关键词,返回指定结果(函数LOOKUP/FIND)
  8. CNN卷积神经网络之RegNet
  9. 毕业设计——基于STM32的智能家具控制系统(ESP-01S(8266)、手机app远程控制、远程显示温度)
  10. MT9804-MT9811DEMO资料 下载