作者:Orgad Kimchi,合著者:Nicolas Droux
2014 年 7 月发布
第 1 部分 — 使用数据链路多路径赋予网络高可用性
第 2 部分 — 数据链路多路径的更多用途
|
本文是由两部分组成的系列文章的第二部分,介绍如何使用数据链路多路径 (DLMP) 聚合。
在本文中,我们将介绍如何在使用 DLMP 聚合的环境中执行以下网络管理操作:
DLMP 聚合赋予网络高可用性 (HA)。要了解如何创建 DLMP 聚合和查看本系列文章中所用系统架构,请参见第 1 部分。
在下一个用例中,我们将结合使用 DLMP 聚合技术和其他网络技术:链路保护。
随着越来越多系统配置采用虚拟化,主机管理员可以为 Oracle Solaris 区域提供对物理或虚拟链路的独占访问。这种配置允许虚拟环境的网络流量与主机系统接收或发送的其他流量隔离,从而提高了网络性能。同时,此配置还会将系统和整个网络暴露于来宾环境可能产生的有害数据包的风险之下。
链路保护的目的是防止潜在恶意流量可能对网络造成的损害。该特性可防止以下基本威胁:
注:链路保护不会取代部署防火墙的需要,特别是对于具有复杂筛选要求的配置。
链路保护提供了云环境中所需的灵活性,例如,可以从 Oracle Solaris 区域中启用 root
帐户访问。
虽然启用 root
帐户访问提供了灵活性,但也暴露出安全隐患。例如,root
用户使用非 IPv4、IPv6 或 ARP 类型的不同源 IP 或 MAC 地址或数据包发送传出数据包,可以产生欺诈攻击。我们可以使用链路保护来防止此类攻击。
链路保护可通过四种不同属性启用:ip-nospoof
、dhcp-nospoof
、mac-nospoof
和 restricted
。下表描述了这些属性。
属性名称 | 属性说明 |
---|---|
ip-nospoof |
此属性要求所有传出的 IP、ARP 或 NDP 数据包的地址字段必须与 DHCP 配置的 IP 地址或 allowed-ips link 属性中所列地址之一匹配。 |
mac-nospoof |
此属性可防止 root 用户更改区域的 MAC 地址。传出数据包的源 MAC 地址必须与数据链路已配置的 MAC 地址匹配。 |
dhcp-nospoof |
此属性可防止 DHCP 的客户端 ID/DUID 欺诈。 |
restricted |
此属性只允许 IPv4、IPv6 和 ARP 协议。使用此属性可防止链路产生潜在有害的 L2 控制帧。 |
以下示例演示如何启用链路保护。
在全局区域中,运行以下命令启用 vnic1
上的链路保护:
root@global_zone:~# dladm set-linkprop -p protection=mac-nospoof,restricted,ip-nospoof vnic1
接下来,我们将对区域的 IP 地址设置限制;这样,即使区域的 root
用户也不能更改 IP 地址。
将 IP 地址 10.0.0.1
指定为 vnic1
链路的 allowed-ips
属性的值:
root@global_zone:~# dladm set-linkprop -p allowed-ips=10.0.0.1 vnic1
验证链路保护属性值,如清单 1 所示:
root@global_zone:~# dladm show-linkprop -p protection,allowed-ips vnic1 LINK PROPERTY PERM VALUE DEFAULT POSSIBLE vnic1 protection rw mac-nospoof, -- mac-nospoof, restricted, restricted, ip-nospoof ip-nospoof, dhcp-nospoof vnic1 allowed-ips rw 10.0.0.1 -- --
清单 1
在清单 1 中,我们可以看到 10.0.0.1
设置为允许的 IP 地址。
(可选)按照第 1 部分的“创建第一个区域 (zone1)”一节中所示,使用 anet
配置区域 VNIC 时,用 link-protection anet
属性配置其链路保护,该属性默认设置为 mac-nospoof
。使用 anet
还允许在区域配置中通过 allowed-address
属性指定 IP 地址,然后通过设置 configure-allowed-address
属性指定在区域启动时自动配置该地址。这是使用 anet
和 zonecfg
的另一个优点。清单 2 显示了一个使用 anet
属性设置区域的示例:
root@global_zone:~# zonecfg -z zone1 Use 'create' to begin configuring a new zone. zonecfg:zone1> create create: Using system default template 'SYSdefault' zonecfg:zone1> set zonepath=/zones/zone1 zonecfg:zone1> set autoboot=true zonecfg:zone1> select anet linkname=net0 zonecfg:zone1:net> set lower-link=aggr0 zonecfg:zone1:net> set allowed-address=10.0.0.1/24 zonecfg:zone1:net> set configure-allowed-address=true zonecfg:zone1:net> end zonecfg:zone1> verify zonecfg:zone1> commit zonecfg:zone1> exit
清单 2
我们在清单 2 中看到,可以动态设置保护属性值,无需重新启动区域;这对于通常有严格的正常运行时间要求的生产环境非常有用。此外,此功能还提供了更改环境安全级别所需的灵活性。另一个优点是它将 IP 网络配置封装在区域配置中,简化了物理计算机之间的区域迁移。
下面尝试更改区域 IP 地址来测试链路保护。
首先,登录区域:
root@global_zone:~# zlogin zone1
现在,删除 IP 接口:
root@zone1:~# ipadm delete-ip vnic1
接下来,新建一个 IP 接口:
root@zone1:~# ipadm create-ip vnic1
现在尝试分配一个新的 IP 地址 (10.0.0.10
),如清单 3 所示:
root@zone1:~# ipadm create-addr -a local=10.0.0.10/24 vnic1/v4 ipadm: cannot create address: Permission denied
清单 3
我们可以在清单 3 中看到,root
用户不能更改区域 IP 地址!
我们尝试将 IP 地址更改为允许的 IP 地址 (10.0.0.1
):
root@zone1:~# ipadm create-addr -a local=10.0.0.1/24 vnic1/v4
验证 IP 地址更改,如清单 4 所示:
root@zone1:~# ipadm show-addr vnic1 ADDROBJ TYPE STATE ADDR vnic1/v4 inherited ok 10.0.0.1/24
清单 4
我们在清单 4 中可以看到,可以更改 IP 地址。
我们可以从全局区域禁用链路保护:
root@global_zone:~# dladm reset-linkprop -p protection,allowed-ips vnic1
注:禁用此属性时无需重新启动区域。
验证已经删除了链路保护,如清单 5 所示:
root@global_zone:~# dladm show-linkprop -p protection,allowed-ips vnic1 vnic1 LINK PROPERTY PERM VALUE DEFAULT POSSIBLE vnic1 protection rw -- -- mac-nospoof, restricted, ip-nospoof, dhcp-nospoof vnic1 allowed-ips rw -- -- --
清单 5
在清单 5 中可以看到,我们对 allowed-ips
属性并无限制。
ip-nospoof
、dhcp-nospoof
、mac-nospoof
和 restricted
。dladm set-linkprop
命令添加链路保护。dladm reset-linkprop
命令将链路保护重置为默认模式。dladm show-linkprop
命令显示链路保护状态。在所有云基础架构中,管理环境性能和满足可靠的网络服务级别协议 (SLA) 都需要资源管理。
以下示例将展示如何启用网络资源管理。
Oracle Solaris 11 自带内置的 SLA 特性,允许对 VNIC 和流量流配置带宽限制和/或优先级。
将 DLMP 聚合与带宽限制和流结合使用时,我们可以从网络高可用性 (HA) 和高级网络资源管理中受益。
可以在全局区域中配置 VNIC 的带宽控制,以限制区域通过其 VNIC 收发的网络流量。
我们可以使用 VNIC 的 maxbw
属性限制 VNIC 的吞吐量,如图 1 所示。我们使用的是早就熟悉的 dladm
命令。
图 1. 设置带宽限制
例如,以下命令将 vnic1
的最大吞吐量设为 500 Mb/秒,实际上是提供物理数据链路(网络端口 net0
)连接的一部分。
root@global_zone:~# dladm set-linkprop -p maxbw=500M vnic1
验证更改,如清单 6 所示。
root@global_zone:~# dladm show-linkprop -p maxbw vnic1 LINK PROPERTY PERM VALUE DEFAULT POSSIBLE vnic1 maxbw rw 500 -- --
清单 6
在清单 6 中,我们可以看到 VNIC 最大吞吐量已经设为 500 Mb/秒。
(可选)可以使用 zonecfg
命令在 anet
上设置类似的 maxbw
属性:
root@global_zone:~# zonecfg -z zone1 zonecfg:zone1> select anet linkname=net0 zonecfg:zone1:anet> set maxbw=500M zonecfg:zone1:anet> end zonecfg:zone1> verify zonecfg:zone1> commit zonecfg:zone1> exit
注:配置 VNIC 的 maxbw
之后,可以使用边缘虚拟桥接 (EVB) 对相邻物理网络交换机强制实施该带宽控制。有关 EVB 的详细信息,请参见“Oracle Solaris 中的边缘虚拟桥接”。
如果您需要细粒度的网络带宽控制,Oracle Solaris 11 提供了设置流 的功能,这是一项高级服务质量 (QoS) 机制。流让我们能够限制特定网络接口上特定网络端口的网络带宽。
注:您可以结合使用对数据链路及其流的带宽控制。
我们可以在先前创建的 DLMP 聚合 (aggr0
) 上实现流。这有助于缓解针对 Web 服务器的拒绝服务 (DOS) 攻击。我们将区域的 HTTPS 网络最大带宽设为 100 Mb/秒,可以最大程度降低攻击对基础架构其余部分的影响。
在以下示例中,我们将 vnic1
网络接口上的安全套接字层 (SSL) 流量限制为 100 MB,如图 2 所示。
图 2. 设置一个流来控制带宽
首先,我们使用 flowadm
命令在 zone1
中创建流:
root@zone1:~# flowadm add-flow -l vnic1 -a transport=TCP,local_port=443 https-flow
将流的带宽限制设为 100 Mb/秒。
root@zone1:~# flowadm set-flowprop -p maxbw=100M https-flow
验证流创建:
root@zone1:~# flowadm show-flow FLOW LINK PROTO LADDR LPORT RADDR RPORT DSFLD https-flow vnic1 tcp -- 443 -- -- --
然后验证带宽限制,如清单 7 所示:
root@zone1:~# flowadm show-flowprop https-flow FLOW PROPERTY PERM VALUE DEFAULT POSSIBLE https-flow maxbw rw 100 -- -- https-flow priority rw medium medium low,medium,high https-flow hwflow r- off -- on,off
清单 7
在清单 7 中,我们可以的看到流的带宽限制为 100 Mb。
注意,在上例中,是从非全局区域在 VNIC 上创建流,因此流是匹域配置的一部分,并将随区域一起迁移。此类流将在区域启动时自动重新实例化。
流技术的另一个有用特性是能够使用 flowstat
命令监视流的网络性能统计信息。此特性对于解决网络性能问题非常有用。
我们重新运行第 1 部分的“测试 HA 功能”一节中用过的 iperf
网络性能工具,但此次服务器将监听端口 443(其上设置了流的端口)。
首先,在 zone1
上启动 iperf
服务器:
注:您可能需要停止之前的 iperf
服务器;按 Ctrl-C 即可停止。
root@zone1:~# iperf -s -l 128k -p 443 ------------------------------------------------------------ Server listening on TCP port 443 TCP window size: 125 KByte (default) ------------------------------------------------------------
接下来,从 zone3
启动 iperf
客户端(加载程序):
root@zone3:~# iperf -c zone1 -l 128k -P 4 -i 1 -p 443 -t 360 ------------------------------------------------------------ Client connecting to zone1, TCP port 443 TCP window size: 48.0 KByte (default) ------------------------------------------------------------ [ 7] local 10.0.0.3 port 53777 connected with 10.0.0.1 port 443 [ 4] local 10.0.0.3 port 58403 connected with 10.0.0.1 port 443 [ 6] local 10.0.0.3 port 59851 connected with 10.0.0.1 port 443 [ 5] local 10.0.0.3 port 42292 connected with 10.0.0.1 port 443 [ ID] Interval Transfer Bandwidth [ 7] 0.0- 1.0 sec 5.88 MBytes 49.3 Mbits/sec [ ID] Interval Transfer Bandwidth [ 6] 0.0- 1.0 sec 7.12 MBytes 59.8 Mbits/sec ...
打开另一个终端,然后从全局区域启动网络流观察,如清单 8 所示:
root@global_zone:~# flowstat -i 1 FLOW IPKTS RBYTES IDROPS OPKTS OBYTES ODROPS zone1/https-flow 5.18M 7.51G 240.06K 2.63M 175.30M 0 zone1/https-flow 9.43K 13.62M 416 1.30K 87.00K 0 zone1/https-flow 9.46K 13.35M 300 2.93K 195.31K 0 zone1/https-flow 10.01K 13.65M 460 4.89K 325.77K 0 zone1/https-flow 8.75K 12.00M 425 4.50K 300.27K 0 zone1/https-flow 9.70K 13.50M 459 4.99K 332.64K 0 zone1/https-flow 8.03K 11.13M 371 4.17K 278.80K 0 zone1/https-flow 10.17K 14.12M 485 5.21K 347.46K 0 zone1/https-flow 9.13K 12.50M 416 4.66K 310.23K 00 ^C
清单 8
注:要停止 flowstat
命令,请按 Ctrl-C。
在清单 8 中,您可以看到之前创建的流 (zone1/https-flow
) 的网络统计信息。此外,您还可以看到带宽限制为约 13 MB/秒(100 Mb/秒)。
流功能允许动态更改带宽限制,例如,如果为了满足此 Web 服务器的需求而需要增加带宽。此功能在云环境中非常重要,因为它可以提供弹性网络基础架构。
我们将带宽限制更改为 200 Mb/秒:
root@zone1:~# flowadm set-flowprop -p maxbw=200M https-flow
验证带宽更改,如清单 9 所示。
root@zone1:~# flowadm show-flowprop https-flow FLOW PROPERTY PERM VALUE DEFAULT POSSIBLE https-flow maxbw rw 200 -- -- https-flow priority rw medium medium low,medium,high https-flow hwflow r- off -- on,off
清单 9
在清单 9 中,我们可以看到现在带宽限制为 200 Mb/秒。
我们回到运行 flowstat
命令的终端,如清单 10 所示。
root@global_zone:~# flowstat -i 1 FLOW IPKTS RBYTES IDROPS OPKTS OBYTES ODROPS zone1/https-flow 25.14K 33.00M 550 12.67K 839.20K 0 zone1/https-flow 18.29K 24.88M 580 9.23K 611.16K 0 zone1/https-flow 21.39K 28.62M 647 10.86K 721.25K 0 zone1/https-flow 18.22K 24.75M 531 9.24K 613.42K 0 zone1/https-flow 19.14K 25.75M 654 9.72K 646.39K 0 zone1/https-flow 17.55K 23.42M 504 8.88K 588.76K 0 zone1/https-flow 20.44K 27.76M 656 10.33K 684.23K 0 zone1/https-flow 18.64K 25.07M 567 9.51K 632.57K 0 ^C
清单 10
注:要停止 flowstat
命令,请按 Ctrl-C。
在清单 10 中,我们可以看到带宽已经更改为约 25 MB/秒,等于 200 Mb/秒。
我们可以从全局区域同时监视区域及其关联流!
完成网络测量之后,您可以删除流:
注:删除流时无需重新启动区域;这对生产环境非常有用,此时需要能够在不严重影响环境的情况下解决网络性能问题。
在 zone1
中列出当前流:
root@zone1:~# flowadm show-flow FLOW LINK PROTO LADDR LPORT RADDR RPORT DSFLD https-flow vnic1 tcp -- 443 -- -- --
删除 https-flow
流:
root@zone1:~# flowadm remove-flow https-flow
验证流是否已删除,如清单 11 所示:
root@zone1:~# flowadm show-flow
清单 11
如果流已删除,命令将直接返回提示符,无任何输出。在清单 11 中,我们可以看到不再有 https-flow
流。
flowadm add-flow
命令添加流,使用 flowadm remove-flow
命令删除流。flowadm set-flowprop
命令更改流属性。flowadm show-flow
命令查看配置了哪些流。flowstat
监视流;而且,您还可以从全局区域监视所有流。Oracle Solaris 11 中引入的一个新特性支持在非全局区域中设置 NFS 服务器。使用此功能可以为云环境中的每个租户构建一个 NFS 服务器,在区域之间提供安全的共享存储,如图 3 所示。
图 3. 在区域之间提供安全的共享存储
图 4 显示 DLMP 聚合如何为其他网络服务(如 NFS 服务器)提供冗余。
图 4. 使用 DLMP 提高 NFS 服务器的可用性
使用清单 12 中所示命令,我们将创建一个 ZFS 文件系统并使用 NFS 共享该系统:
root@zone1# zfs create -o encryption=on -o dedup=on -o compression=on -o mountpoint=/data -o sharenfs=on rpool/data Enter passphrase for 'rpool/data': Enter again:
清单 12
注:您需要提供密码短语;密码短语至少包括 8 个字符。
清单 12 中的命令使用了以下选项:
-o encryption=on
启用加密。-o dedup=on
启用重复数据删除。-o compression=on
启用压缩。-o mountpoint=/data
指定挂载点的位置。-o sharenfs=on
指定应通过 NFS 共享 ZFS 文件系统。在清单 12 中,我们看到使用一条命令即可创建启用了加密、压缩、重复数据删除功能的 ZFS 文件系统,并使用 NFS 共享该文件系统。
我们来验证是否创建了 NFS 共享,如清单 13 所示:
root@zone1# share rpool_data /data nfs sec=sys,rw
清单 13
在清单 13 中,我们可以看到已经创建了 NFS 共享。
ZFS 可以共享 NFS 和 SMB(服务器消息块)等文件系统。有关如何使用 ZFS 共享文件系统的更多示例,请参见 zfs_share
(1M)。
现在,我们从客户端 (zone3
) 挂载此文件系统。
首先,通过列出 zone1
上的 NFS 共享,验证我们可以访问 NFS 共享:
root@zone3# showmount -e zone1 export list for zone1: /data (everyone)
现在挂载 NFS 文件系统,如清单 14 所示:
root@zone3# mount zone1:/data /mnt
清单 14
运行清单 14 所示命令之后,NFS 服务器将受益于 DLMP 提供的网络 HA,无需在 NFS 服务器上进行任何设置。
由此用例可见,Oracle Solaris 11 操作系统为每层都提供了虚拟化技术,如使用 ZFS 和网络虚拟化的存储虚拟化,以及使用 Oracle Solaris 区域的操作系统虚拟化。
zfs_share
(1M)。share
命令查看 NFS 服务器共享。showmount -e
命令列出远程 NFS 服务器上的共享文件系统。在 DLMP 聚合中,故障检测是检测聚合端口故障的方法。当端口无法发送或接收流量时,即视为端口发生故障。端口的几个可能的故障原因:
DLMP 聚合对聚合端口执行故障检测,确保网络能够连续发送和接收流量。端口发生故障时,与该端口关联的客户端 — 例如,经过配置的 IP 堆栈或 VNIC — 会故障切换到一个活动端口。发生故障的聚合端口在修复之前将不可用。其余活动端口继续工作,同时根据需要部署任何现有端口。故障端口恢复之后,可将来自其他活动端口的客户端与其关联。
DLMP 聚合支持基于链路的故障检测和基于探测器的故障检测。
结合使用两种类型的探测器 — 互联网控制消息协议 (ICMP) 探测器(第 3 层探测器)和过渡(第 2 层)探测器)执行基于探测器的故障检测,这两种探测器一起确定聚合的物理数据链路的运行状况。
ICMP 探测器通过向探测目标发送探测数据包检查端口的运行状况。只要可能,会自动配置探测目标的 IP 地址和用于发送这些数据包的本地 IP 地址。如果需要,也可以显式配置一个或多个探测目标和源地址。注意,目标 IP 地址必须与指定的源 IP 地址位于相同的子网。还要注意,针对 DLMP 探测配置的本地 IP 地址可以继续传递正常流量。因此,无需保留 DLM 的专用 IP 地址。
过渡探测通过交换第 2 层过渡探测器在聚合端口之间执行。这些探测器让聚合可以确定所有聚合端口的运行状况,同时避免为每个端口配置单独的本地 IP 探测器地址。
注:当在全局区域中创建基于聚合的 VNIC 并将其分配到非全局区域时,基于探测器的故障检测在全局区域中执行。因此,该探测是集中的,无需在各区域中配置 — 不像 IPMP 需要在每个区域中配置。
在以下示例中,我们将为聚合 aggr0
设置 ICMP 探测。
首先,设置 aggr0
的探测目标:
root@global_zone:~# dladm set-linkprop -p probe-ip=+ aggr0
注:由于未指定源 IP 地址,聚合 aggr0
及其 VNIC 上配置的任何 IP 地址将用作 ICMP 探测器的源 IP 地址。注意,在非全局区域中配置的 VNIC 的 IP 地址不会用于全局区域的探测。
将故障检测时间设置为 5 秒:
root@global_zone:~# dladm set-linkprop -p probe-fdt=5 aggr0
注:默认故障检测时间为 10 秒。
显示已设置的属性:
root@global_zone:~# dladm show-linkprop -p probe-ip,probe-fdt aggr0 LINK PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLE aggr0 probe-ip rw + + -- -- aggr0 probe-fdt rw 5 5 10 1-600
清单 15 中的示例显示我们的 DLMP 聚合的探测器统计信息。使用探测器类型 -P
选项,您可以提供以逗号分隔的参数列表(t
表示过渡探测器,i
表示 ICMP 探测器,all
表示 ICMP 和过渡探测器)。
root@global_zone:~# dlstat show-aggr -n -P t,i aggr0 TIME AGGR PORT LOCAL TARGET PROBE NETRTT RTT 0.06s aggr0 net3 net3 net2 t528 -- -- 0.06s aggr0 net3 net3 net2 t528 13.59ms 14.55ms 0.17s aggr0 net1 net1 net0 t528 -- -- 0.17s aggr0 net1 net1 net0 t528 8.99ms 9.78ms 0.22s aggr0 net2 net2 net1 t528 -- -- 0.22s aggr0 net2 net2 net1 t528 8.44ms 9.36ms 0.27s aggr0 net2 net2 net0 t528 -- -- 0.27s aggr0 net2 net2 net0 t528 8.31ms 9.14ms ...
清单 15
清单 15 输出中显示以下项:
TIME
:发送探测器的时间(以秒为单位)。此时间相对于发出 dlstat
命令的时间。如果在发出 dlstat
命令之前发送探测器,该时间为负。AGGR
:为其发送探测器的聚合的名称。PORT
:为其发送探测器的端口的名称。LOCAL
:对于 ICMP 探测器,此为探测器的源 IP 地址。对于过渡探测器,此为过渡探测器的来源端口名称。TARGET
:对于 ICMP 探测器,此为探测器的目标 IP 地址。对于过渡探测器,此为探测器的目标端口名称。PROBE
:表示探测器的标识号。前缀 t
代表过渡探测器,前缀 i
代表 ICMP 探测器。NETRTT
:探测器的网络往返时间。该值是发送探测器与从 DLMP 聚合接收确认之间的时间段。RTT
:探测器的总往返时间。该值是发送探测器与 DLMP 聚合完成确认过程之间的时间段。有关如何设置基于探测器的故障检测的更多示例,请参见“使用链路聚合配置高可用性”。
在本文中,我们介绍了如何利用内置的 Oracle Solaris 11 技术实现和监视多租户云基础架构的网络高可用性。本文中的示例展示了如何结合使用数据链路多路径和其他网络技术(如链路保护)提供更大的好处。具体来说,我们结合使用了网络安全与 QoS(通过由带宽控制设置带宽使用限制而实现),并使用流量流管理网络资源。
另请参见该作者发表的其他文章:
下面是其他 Oracle Solaris 11 资源:
Orgad Kimchi 是 Oracle(之前任职于 Sun Microsystems)ISV 工程小组的首席软件工程师。6 年来,他一直专注于虚拟化、大数据和云计算技术。
Nicolas Droux 是 Oracle 的 Solaris 内核网络首席架构师。他的专长来自其 20 多年从事操作系统内核、网络、虚拟化、安全、I/O、性能、HPC 和云架构工作的经验。
修订版 1.0,2014 年 7 月 9 日 |