为了实现网络隔离,一般需要租户拥有自己的虚拟路由,而内外网的互联互通,以及分布在不同主机之间,但同属于一个虚拟网络的虚拟机之间的通信,也都依赖虚拟路由的实现,所以三层网络中的路由是非常重要的一部分。

目录

  1. 路由原理
    1. 静态路由
    2. 动态路由
  2. 三层网络在Linux中的实现
  3. Neutron的三层网络实现

路由原理

路由器式一种具有多个输入端口和输出端口的专用计算机,通过路由表来控制从哪个输入端口转到哪一个输出端口,它分为“转发”和“路由选择”两个层面。

转发表是根据路由表建立的,路由选择是多个路由器协同构建路由表,当网络拓扑发生变化时,动态的改变所选的路由,它是通过软件实现的。而转发表根据路由表得出的从哪个端口进的要往哪个人端口转,为提高转发速度它可以通过硬件实现。

三层路由分静态路由和动态路由两种

静态路由

静态路由是指由用户或者网络管理员手工配置的路由信息。当网络的拓扑结构或链路
的状态发生变化时,需要网络管理员手动去修改路由表中的相关静态路由信息。

静态路由信息默认情况下是私有的,不会传递给其他的路由器。当然,网络管理员可以通过对路由器设置使之成为共享的。

静态路由一般适用于比较简单的网络环境,在这样的网络环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确地路由信息。

动态路由

动态路由是与静态路由相对的一个概念,只路由器能够根据路由器之间的交换的特定路由信息自动地建立自己的路由表,并且能够根据链路和节点的变化适时地进行自动调整,当网络中节点或节点间的链路发生故障,或存在其他可用路由时,动态路由可以自行选择最佳的可用路由并继续转发报文。

常见的动态路由协议包括内部网关协议RIP、OSPF、外部网关协议BGP。

动态路由的特点是能够自动学习建立路由表。

在linux中,通过打开ipv4.ip_forward特性可以让数据包从一块网卡路由到另一块网卡上。

三层网络在Linux中的实现

Linux中实现三层路由很简单,打开ip_forward开关之后,这台Linux主机就可以充当路由器使用。

1
sysctl -w net.ipv4.ip_forward=1

在Linux中SNAT和DNAT由iptables来实现,因为IPv4地址比较稀缺,一般局域网都使用内网地址(内网地址分为三个网段:192.168.0.0/24、172.16.0.0/24、10.0.0.0/8),那么从内网地址到公网地址有一个转换过程。虚拟机使用内网地址的话,那么从虚拟机出去的流量叫SNAT,虚拟机进来的流量叫DNAT。

SNAT:内部地址要访问公网上的服务时(如Web页面),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做源地址转换,将内部地址的私有IP转换为公网IP。网关的这个地址转换成为SNAT,主要用于内部共享IP访问外部。

DNAT:当内部需要对外提供服务时(对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关代替内部服务来接收外部的连接,然后在内部做目的地址转换,此转换成为DNAT,主要用于内部服务对外发布。

Neutron的三层网络实现

Neutron在L3层不像在L2C层那样提供了一个像ML2的插件结构,它目前只实现了一个基于Network、Subnet、Port、Router核心数据结构的核心API(除了核心API,剩下的都叫扩展API)。

在l3-agent部分,则做了打开IPv4 forward特性,以及通过iptables实现了SNAT、DNAT这些事情。

在生产环境中,一般将云网络划分为三大部分,公共网络、管理和存储网络、服务网络。

  • 公共网络:用于云向外部租户提供API调用或者访问。
  • 管理网络:用于云中各物理机之间的通信。
  • 存储网络:用于存储服务端与客户端之间的流量,一般与管理网络相同。
  • 服务网络:虚拟机内部使用的网络。