1.网络介绍

网络介绍

 

OpenStack 网络服务提供了一个 API, 允许用户在云中设置和定义网络连接和寻址。网络服务的项目代号是neutron。OpenStack 网络处理虚拟网络基础结构的创建和管理, 包括网络、交换机、子网和由 OpenStack 计算服务 (nova) 管理的设备的路由器。还可以使用高级服务, 如防火墙或虚拟专用网络 (vpn)

 

OpenStack网络由neutron-server、持久存储数据库和任意数量的插件代理组成,它们提供其他服务例如与本地 Linux 网络机制、外部设备或SDN控制器的接口。

OpenStack 网络完全独立, 可以部署到专用主机。如果你的部署使用一个控制主机来运行集中计算组件, 则可以将网络服务器部署到该特定主机。

 

 

OpenStack 网络与各种其他 OpenStack 组件集成在一起:

 

OpenStack 认证服务 (keystone): 用于 API 请求的身份验证和授权

OpenStack 计算服务 (nova) :用于将 VM 上的每个虚拟网卡加入到特定的网络。

OpenStack 仪表板 (horizon) :由管理员和租户用户使用, 通过基于 web 的图形界面创建和管理网络服务。

 

 

基本网络

 基本网络包括Ethernet、VLAN、子网和ARP、DHCP、IP和TCP/UDP/ICMP

 

Ethernet

 

以太网是一个网络协议, 由 IEEE 802.3 标准指定。大多数有线网络接口卡 (nic) 都使用以太网进行通信。

在 OSI 模型的网络协议, 以太网占据第二层, 这是所谓的数据链路层。在以太网网络中, 连接到网络的主机通过交换帧进行通信, 这是数据包的以太网术语

以太网上的每个主机都由一个名为 "媒体访问控制 (MAC)" 地址的地址唯一标识。 在 OpenStack 环境中, 每个虚拟机实例都有一个唯一的 mac 地址, 这与计算主机的 mac 地址不同。

 

MAC 地址有48位, 通常表示为十六进制字符串,例如08:00:27:b9:88:74。虽然mac 地址被制造商硬编码到 NIC 中,但是现在的NIC允许你通过程序去改变MAC地址。

 

在 Linux 中, 您可以使用 ip 命令去查看 NIC 的 MAC 地址

ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether fa:16:3e:b0:34:49 brd ff:ff:ff:ff:ff:ff

 

在以太网网络中, 网络上的每个主机都可以将一个帧直接发送到其他主机。以太网还支持广播, 因此一个主机可以通过发送到特殊的 MAC 地址 ff:ff:ff:ff:ff:ff, 将帧发送到网络上的每个主机。ARP 和 DHCP 是使用以太网广播的两个显著协议。由于以太网网络支持广播, 您有时会听到称为广播域的以太网网络。

当 nic 接收到以太网帧时, 默认情况下, nic 将检查目标 mac 地址是否与 nic (或广播地址) 的地址匹配, 如果 mac 地址不匹配, 以太网帧将被丢弃。

对于计算主机, 此行为是不可取的, 因为该帧可能是针对其中一个实例而准备的。nic 可以配置为混杂模式, 它们将所有以太网帧传递到操作系统, 即使 MAC 地址不匹配。

计算主机应始终为混杂模式配置适当的 nic。

 

 

关于如何设置为混杂模式可以参考:http://www.splaybow.com/post/linux-wangka-hunza-moshi.html

 

VLAN

 

VLAN 是一种网络技术, 它使单个交换机可以充当多个独立交换机。具体地说, 连接到同一交换机但在不同 vlan 上的两台主机不会看到对方的通信量。

OpenStack 能够利用 vlan 隔离不同租户的通信量, 即使租户碰巧在同一计算主机上运行实例。

每个 VLAN 都有一个关联的数字 ID, 介于1和4095之间。我们说 "vlan 15" 指的是数字 ID 为15的 vlan。

 

假设您需要三个独立的网络, 但只有一个物理交换机。网络管理员将选择三个 vlan id, 如10、11和 12, 并将交换机配置为将交换机与 vlan id 关联起来。例如, 交换机2可能与 vlan 10 相关联, 交换机3可能与 vlan 11 相关联, 依此类推。当为特定 VLAN 配置交换机时, 它称为访问端口。交换机负责确保跨 vlan 隔离网络通信。

 

 

如果将两个交换机连接在一起, 并且将交换机配置为 vlan, 则交换机用于交接的交换机必须配置为允许从任何 VLAN 将以太网帧转发到另一个交换机。此外, 交换机发送方必须使用 vlan ID 标记每个以太网帧, 以便接收交换机可以确保只有匹配 vlan 上的主机才有资格接收帧。

当交换机配置为从所有 vlan 传递帧并将其标记为 vlan id 时, 它称为trunk端口。IEEE 802.1Q 是描述在使用中继时如何在以太网帧中对 VLAN 标记进行编码的网络标准。

 

请注意, 如果在物理交换机上使用 vlan 在 OpenStack 云中实现租户隔离, 则必须确保将所有交换机配置为trunk端口。

选择当前网络基础结构不使用的 VLAN 范围非常重要。例如, 如果您估计您的云必须支持最多100项目, 请选择该值之外的 vlan 范围, 如 vlan 200–299。OpenStack 和所有处理租户网络的物理网络基础结构必须支持此 VLAN 范围。

 

 

trunk用于在不同的交换机之间进行连接。每个trunk都使用一个标记来标识正在使用的 VLAN。这可确保同一 VLAN 上的交换机可以进行通信。

 

Subnets and ARP

nic 使用 MAC 地址来寻址网络主机, 而 tcp/ip 应用程序使用 ip 地址。

地址解析协议 (ARP) 通过将 ip 地址转换为 MAC 地址来弥合以太网和 ip 之间的鸿沟

IP 地址分成两部分: 网络号和主机标识符。如果两台主机具有相同的网络号, 则它们处于同一个子网中。

 

请记住, 如果两个主机在同一本地网络上, 则只能通过以太网直接通信。

ARP 假定同一子网中的所有计算机都在同一本地网络上。在将 IP 地址和掩分配给主机时, 网络管理员必须小心, 以便同一子网中的任何两个主机都在同一本地网络上, 否则 ARP 无法正常工作。

 

要计算 IP 地址的网络号, 您必须知道与该地址关联的网掩码。网络掩码指示32位 IP 地址中的多少位组成了该网号。

有两种表达网络掩码的语法:

 

1.点分十进制

2.无类别域路由 (CIDR)

 

DHCP

一个 UDP 数据包到端口67上的地址255.255.255.255 来找到 dhcp 服务器。地址255.255.255.255 是本地网络广播地址: 本地网络上的所有主机都看到发送到此地址的 UDP 数据包。但是, 此类数据包不会转发到其他网络。因此, DHCP 服务器必须与客户端在同一本地网络上, 否则服务器将不会接收广播。DHCP 服务器通过将 UDP 数据包从端口67发送到客户端上的端口68进行响应。交换 的外观如下:

 

复制代码

1.客户端发送一个发现 ("我是一个客户端在 MAC 地址 08:00:27: b9:88:74, 我需要一个 IP 地址")

2.服务器发送一个offer ("OK 08:00:27: b9:88:74, 我提供 IP 地址 10.10.0.112")

3.客户端发送一个请求 ("服务器 10.10.0.131, 我想有 IP 10.10.0.112")

4.服务器发送确认 ("OK 08:00:27: b9:88:74, IP 10.10.0.112 是您的")

复制代码

 

OpenStack 使用名为 dnsmasq 的 第三方程序来实现 DHCP 服务器。Dnsmasq 写入到日志中 (通常是在/var/log/syslog) 中, 您可以在其中观察 DHCP 请求和回复:

 

Apr 23 15:53:46 c100-1 dhcpd: DHCPDISCOVER from 08:00:27:b9:88:74 via eth2
Apr 23 15:53:46 c100-1 dhcpd: DHCPOFFER on 10.10.0.112 to 08:00:27:b9:88:74 via eth2
Apr 23 15:53:48 c100-1 dhcpd: DHCPREQUEST for 10.10.0.112 (10.10.0.131) from 08:00:27:b9:88:74 via eth2
Apr 23 15:53:48 c100-1 dhcpd: DHCPACK on 10.10.0.112 to 08:00:27:b9:88:74 via eth2

 

IP

Internet 协议 (IP) 指定如何在连接到不同本地网络的主机之间路由数据包。IP 依赖于称为路由器或网关的特殊网络主机。路由器是连接到至少两个本地网络的主机, 可以将 IP 数据包从一个本地网络转发到另一个局域网。路由器有多个 IP 地址: 每个连接到的网络都有一个。

 在网络协议的 OSI 模型中, IP 占据了第三层, 即网络层。

将数据包发送到 IP 地址的主机咨询其路由表, 以确定应将该数据包发送到的本地网络上的哪台计算机。路由表维护与主机直接连接的每个本地网络关联的子网列表, 以及这些本地网络上的路由器列表。

 

在 Linux 计算机上, 以下任一命令都显示路由表:

 

 

ip route show
route -n
netstat -rn

 

以下是 ip route show的输出示例:

$ ip route show
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
192.168.27.0/24 dev eth1  proto kernel  scope link  src 192.168.27.100
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

输出的1行指定默认路由的位置, 如果没有其他规则匹配, 则是有效的路由规则。与默认路由关联的路由器 (在上面的示例中 10.0.2.2) 有时称为默认网关。dhcp 服务器通常将默认网关的 ip 地址与客户端的 ip 地址和网络掩码一起传输给 dhcp 客户端。

输出的2行指定 10.0. 2.0/24 子网中的 IPs 位于与网络接口 eth0 关联的本地网络上。

输出的3行指定 192.168.27.0/24 子网中的 IPs 位于与网络接口 eth1 关联的本地网络上。

输出的4行指定 192.168.122/24 子网中的 IPs 位于与网络接口 virbr0 关联的本地网络上。
复制代码
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.27.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0
复制代码

 

ip route get 命令输出目标 ip 地址的路由。从上面的示例中, 目标 IP 地址10.0.2.14 位于 eth0 的本地网络上, 将直接发送:

$ ip route get 10.0.2.14
10.0.2.14 dev eth0  src 10.0.2.15

目标 IP 地址93.184.216.34 不在任何连接的本地网络上, 并将被转发到10.0.2.2 的默认网关:

$ ip route get 93.184.216.34
93.184.216.34 via 10.0.2.2 dev eth0  src 10.0.2.15

数据包跳过多个路由器以到达其最终目的地是很常见的。

 

TCP/UDP/ICMP

对于网络软件应用程序通过 ip 网络进行通信, 它们必须使用 ip 上分层的协议。这些协议占据了 OSI 模型的第四层, 称为传输层或4层

 

传输控制协议 (TCP) 是网络应用中最常用的4层协议。TCP 是面向连接的协议: 它使用客户端-服务器模型, 其中客户端连接到服务器, 其中服务器引用接收连接的应用程序。tcp 应用程序中的典型交互进行如下操作:

客户端连接到服务器。
客户端和服务器交换数据。
客户端或服务器断开连接。

由于网络主机可能有多个 tcp 应用程序正在运行, 因此 TCP 使用称为端口的寻址方案来唯一标识 tcp 应用程序。tcp 端口与范围1-65535 中的一个数字相关联, 主机上的一个应用程序一次只能与一个 tcp 端口关联, 这是由操作系统强制的限制。

 

据说 TCP 服务器侦听端口。例如, SSH 服务器通常监听端口22。要使客户端使用 tcp 连接到服务器, 客户端必须知道服务器主机的 IP 地址和服务器的 tcp 端口。

TCP 客户端应用程序的操作系统自动为客户端分配端口号。客户端拥有此端口号, 直到 TCP 连接终止, 然后操作系统再回收端口号。这些类型的端口称为临时端口。

IANA 维护许多 tcp 服务的端口号注册表, 以及使用其他采用端口的4层协议的服务。不需要注册 TCP 端口号, 但注册端口号有助于避免与其他服务发生冲突。

与 TCP 一样, UDP 使用端口概念来区分在同一系统上运行的不同应用程序。但是请注意, 操作系统将 UDP 端口与 TCP 端口分开处理。例如, 一个应用程序可能与 TCP 端口16543相关联, 并且一个单独的应用程序与 UDP 端口16543关联。

 

DHCP、域名系统 (DNS)、网络时间协议 (NTP) 和虚拟可扩展局域网 (VXLAN) 是 OpenStack 部署中使用的 udp 协议的示例。

UDP 支持一对多通信: 将单个数据包发送到多个主机。通过将接收方 ip 地址设置为特殊的 ip 广播地址 255.255.255.255, 应用程序可以将 UDP 数据包广播到本地网络上的所有网络主机。应用程序还可以使用 IP 多址广播将 UDP 数据包发送到一组接收器。预期的接收器应用程序通过将 UDP 套接字绑定到作为有效多播组地址之一的特殊 IP 地址来加入多播组。接收主机不必与发件人在同一本地网络上, 但必须将中间的路由器配置为支持 IP 多播路由。VXLAN 是使用 IP 多播的 udp 协议的一个示例。

 

 

Internet 控制消息协议 (ICMP) 是用于通过 IP 网络发送控制消息的协议。例如, 如果路由器的路由表中没有与目标地址相对应的路由 (icmp 代码1、目标主机无法访问), 或者如果 ip 数据包太大而无法发送, 接收 ip 数据包的路由器可能会将 ICMP 数据包发回源。处理之三 (ICMP 代码 4, 所需的碎片和 "不分段" 标志已设置)。

 

 

 

网络组件

网络组件包括交换机、路由器、防火墙和负载均衡器

 

交换机

交换机是用于连接网络设备的设备。将数据包转发到其他设备上, 使用分组交换将数据传输到需要接收的设备。交换机在 OSI 模型的2层运行。

 

 

路由器

 

路由器是将多个网络连接在一起的网络设备。路由器连接到两个或多个网络。当他们接收数据包时, 他们使用路由表来确定将信息传递到哪个网络。

 

防火墙

防火墙是基于应用的规则集控制传入和传出网络通信的网络设备。

 

负载均衡器

负载平衡器是一种网络设备, 它在多个服务器之间分配网络或应用程序通信。

 

 

通道技术

 

隧道允许一个网络协议封装另一个有效负载协议, 这样, 从负载协议传输的数据包作为传递协议上的数据传输。例如, 这可以用于在不受信任的网络上安全地传递数据。

 

 

通用路由封装 (GRE)

GRE 通过使用带有公共 ip 地址的传送数据包, 在 Internet 上携带带有专用 ip 地址的 ip 数据包。

 

 

虚拟可扩展局域网 (VXLAN)

 

一个 VXLAN 的虚拟可扩展局域网, 允许在不同的网络中为虚拟机创建一个逻辑网络。VXLAN 在 四层 UDP 数据包上封装 二层 以太网帧。

 

网络命名空间

命名空间是限定特定标识符集的一种方法。使用命名空间, 可以在不同的命名空间中多次使用相同的标识符。还可以限制对特定进程可见的标识符集。

 

 

例如, Linux 为网络和进程提供了命名空间。进程在进程命名空间中运行, 它只能查看和与同一命名空间中的其他进程进行通信。

因此, 如果特定进程命名空间中的 shell 运行 ps waux, 它只会显示同一命名空间中的其他进程。

 

 

 

Linux 网络命名空间

在网络名称空间中, 作用域的 "标识符" 是网络设备;因此, 给定的网络设备 (如 eth0) 存在于特定的命名空间中。

Linux 启动时使用默认的网络命名空间, 因此, 如果您的操作系统没有执行任何特殊的操作, 那么所有网络设备都将位于该位置。

 

但也可以进一步创建非默认命名空间, 并在这些命名空间中创建新的设备, 或者将现有设备从一个名称空间移动到另一个。

 

 

每个网络名称空间也有自己的路由表, 实际上这是命名空间存在的主要原因

路由表按目标 ip 地址进行键控, 因此, 如果希望相同的目标 ip 地址在不同的时间表示不同的内容, 则网络命名空间就是您需要的内容-这是 OpenStack 网络为其提供的功能所需的东西不同虚拟网络中的 IP 地址重叠。

 

每个网络名称空间也有自己的 iptables 集 (用于 IPv4 和 IPv6)。因此, 您可以将不同的安全性应用于不同命名空间中具有相同 IP 寻址的流以及不同的路由。

 

任何给定的 Linux 进程都在特定的网络名称空间中运行。默认情况下, 这是从其父进程继承的, 但具有正确功能的进程可以将自身转换为不同的命名空间;

在实践中, 这主要是使用 ip netns exec netns 命令... 调用, 它启动在名为 netns 的命名空间中运行的命令。

假设这样一个进程向 IP 地址发送了一条消息, 命名空间的作用是, 将在该命名空间的路由表中查阅该名称, 这将确定消息通过的网络设备。

虚拟路由和转发 (VRF)

虚拟路由和转发是一种 IP 技术, 它允许路由表的多个实例同时在同一路由器上共存。这是上面描述的网络命名空间功能的另一个名称。

 

网络地址转换

 

网络地址转换 (NAT) 是在传输数据包时修改 IP 数据包报头中的源或目标地址的过程。通常, 发送方和接收方应用程序不知道正在操作 IP 数据包。

nat 通常是由路由器实现的, 因此我们将把执行 nat 的主机称为 nat 路由器。但是, 在 OpenStack 部署中, 通常是实现 NAT 功能的 Linux 服务器, 而不是硬件路由器。这些服务器使用 iptables 软件包来实现 NAT 功能。

 

NAT 有多种变体, 在这里我们描述了在 OpenStack 部署中常见的三种:

 

SNAT

在源网络地址转换 (SNAT) 中, NAT 路由器在 ip 数据包中修改发送者的 ip 地址。SNAT 通常用于使具有专用地址的主机能够与公用 Internet 上的服务器进行通信。

 

RFC 1918 保留以下三子网作为私有地址:

    10.0.0.0/8
    172.16.0.0/12
    192.168.0.0/16

这些 ip 地址不是可公开路由的, 这意味着公用 Internet 上的主机不能将 ip 数据包发送到这些地址中的任何一个。私有 IP 地址在住宅和企业环境中被广泛使用

通常, 在具有专用 IP 地址的主机上运行的应用程序将需要连接到公用 Internet 上的服务器。一个这样的例子是, 用户谁想要访问一个公共网站, 如 www.openstack.org。如果 ip 数据包以专用 ip 地址作为源到达 www.openstack.org 的 web 服务器, 则 web 服务器无法将数据包发送回接收者。

SNAT 通过将源 ip 地址修改为在公共 Internet 上可路由的 ip 地址来解决此问题。SNAT 有不同的变异;在 OpenStack 中, 发送方和接收方之间的路径上的 NAT 路由器将数据包的源 ip 地址替换为路由器的公共 ip 地址。路由器还将源 TCP 或 UDP 端口修改为另一个值, 路由器维护发送者的真实 ip 地址和端口的记录, 以及修改后的 ip 地址和端口。

 

当路由器接收到具有匹配的 ip 地址和端口的数据包时, 它会将它们转换回专用 ip 地址和端口, 并将数据包转发。

因为 NAT 路由器修改端口和 IP 地址, 所以这种形式的 SNAT 有时被称为端口地址转换 (PAT)。它有时也被称为 NAT 重载。

OpenStack 使用 SNAT 使运行在实例中的应用程序能够连接到公共 Internet。

 

 

DNAT

在目标网络地址转换 (DNAT) 中, NAT 路由器修改 ip 数据包标头中目标的 ip 地址。

 

OpenStack 使用 DNAT 将数据包从实例路由到 OpenStack 元数据服务。在实例内部运行的应用程序通过将 HTTP 获取请求发送到具有 IP 地址169.254.169.254 的 web 服务器来访问 OpenStack 元数据服务。在 OpenStack 部署中, 没有具有此 IP 地址的主机.

相反, OpenStack 使用 DNAT 来更改这些数据包的目标 IP, 从而达到元数据服务正在侦听的网络接口。

posted @ 2017-12-29 11:56  钟桂耀  阅读(444)  评论(0编辑  收藏  举报