“TF功能指南”系列文章,旨在帮助大家深入了解Tungsten Fabric各组件功能,更好地部署和应用,发挥TF对于多云互联虚拟网络的创建和编排能力。本文重点介绍如何将TF的功能扩展到物理路由器的管理上。
原文链接:https://www.juniper.net/documentation/en_US/contrail5.0/topics/concept/using-device-manager-netconf-contrail.html
注:原文为Contrail,在本系列文章中,Tungsten Fabric的功能与Contrail一致。
物理路由器支持概述
Device Manager是部署在控制节点的daemon程序,可用于管理Tungsten Fabric系统中的物理路由器。
Device Manager daemon程序侦听来自API服务器的配置事件,为其管理的所有物理路由器创建任何必要的配置,并对这些物理路由器进行编程。
你可以扩展集群网络,将Juniper Networks MX系列的物理路由器,以及其它支持网络配置(NETCONF)协议的物理路由器都包含进来。你可以将物理路由器配置为Tungsten Fabric集群中配置的任何虚拟网络的一部分,以促进物理路由器与TF控制节点之间的通信。
配置模型
图1描述了系统中使用的配置模型。物理路由器、物理接口和逻辑接口都代表物理路由器实体。
图1: Tungsten Fabric配置模型
配置物理路由器
TF Web用户界面可用于将物理路由器配置到Tungsten Fabric系统中。选择Configure > Physical Devices > Physical Routers,为物理路由器创建一个条目,并提供路由器的管理IP地址和用户证书。
下面显示了如何从TF Web用户界面配置Juniper Networks MX系列设备。
图2:添加Physical Router窗口
选择Configure > Physical Devices > Interfaces以添加要在路由器上配置的逻辑接口。逻辑接口的名称必须与路由器上的名称匹配(例如ge-0 / 0 / 0.10)。
图3:添加Interface窗口
Device Manager配置
Device Manager可以在Juniper Networks MX系列设备和其它物理路由器上配置以下所有内容。
·根据需要为物理接口和逻辑接口创建配置。
·根据配置需要创建VRF表条目。
·根据需要将接口添加到VRF表。
·创建与外部虚拟网络相对应的公共VRF表。
·根据需要为内部或外部BGP组创建BGP协议配置,并将iBGP和eBGP对等体添加到适当的组中。
·根据策略配置对路由目标的导入和导出规则进行编程。
·根据需要创建策略和防火墙。
·配置以太网VPN(EVPN)。
MX系列设备上要求的先决条件配置
在使用Device Manager管理MX系列设备的配置之前,请使用以下Junos CLI命令在设备上启用NETCONF:
set system services netconf ssh
set system services netconf traceoptions file nc
set system services netconf traceoptions flag all
调试Device Manager配置
如果在Device Manager配置期间出现任何故障,则失败的配置将作为候选配置存储在MX 系列设备上。Device Manager会将错误消息记录在本地系统日志中。
Device Manager配置文件中的日志级别应设置为INFO,以记录发送到物理路由器的NETCONF XML消息。
配置场景
本节介绍不同的配置场景,并显示生成的MX系列设备配置的摘要。
使用REST API配置物理路由器
有关使用REST API进行配置的信息,请参阅:
https://www.juniper.net/documentation/en_US/contrail5.0/topics/concept/rest-apis-routers-contrail.html
使用REST API配置MX设备的示例Python脚本
请参考以下链接,获取基于Python的脚本,以使用Tungsten Fabric提供的VNC Rest API在TF系统中配置所需的MX 系列设备资源。
https://github.com/Juniper/contrail-controller/blob/master/src/config/utils/provision_physical_router.py
Device Manager功能
当Device Manager在Tungsten Fabric数据库中检测到关联时,它会自动配置物理路由器。
以下命名规范用于生成MX系列路由器配置:
·Device Manager生成的配置组名称: __contrail__
·BGP组:
·内部组名称: __contrail__
·外部组名称: __contrail_external
·VRF名称: _contrai_{l2|l3}_[vn-id]_[vn-name]
·NAT VRF名称: _contrai_{l2|l3}_[vn-id]_[vn-name]-nat
·导入策略: [vrf-name]—import, Export policy: [vrf-name]—export
·Service集: sv-[vrf-name]
·NAT规则,SNAT: sv-[vrf-name]-sn-rule, DNAT: sv-[vrf-name]-dn-rule
·SNAT术语名称: term_[private_ip], DNAT term name: term_[public_ip]
·防火墙过滤器:
·公共VRF过滤器: redirect_to_public_vrf_filter
·专用VRF过滤器: redirect_to_[vrf_name]_vrf
·逻辑接口单元编号:
·Service端口: 2*vn_id -1, 2*vn_id
·IRB接口: vn_id
动态隧道
Tungsten Fabric中的动态隧道配置,可以让你在TF Web用户界面上配置GRE隧道。当Tungsten Fabric检测到此配置时,Device Manager模块将构造GRE隧道配置并将其推送到MX系列路由器。TF架构的全局系统配置中使用了一个名为ip-fabric-subnets的属性。每个IP fabric子网和BGP路由器都被配置为MX系列路由器中的动态隧道目标点。物理路由器数据平面IP地址被视为动态隧道的源地址。你必须配置数据平面IP地址,以便在物理路由器上自动配置动态隧道。IP fabric子网是全局配置,所有子网都在具有数据平面IP配置的集群中的所有物理路由器上进行了配置。
API配置中使用以下命名规范:
·全局系统配置: ip-fabric-subnets
·物理路由器: data-plane-ip
Web UI配置
图4显示了用于配置动态隧道的Web用户界面。
图4: Edit Global Config窗口
在“Edit Global Config”窗口中,VTEP地址用于data-plane-ip地址。
以下是Device Manager生成的MX系列路由器配置的示例。
代码语言:javascript复制root@host# show groups __contrail__ routing-options
router-id <router-ip-address>;
route-distinguisher-id <route-distinguisher-ip-address>;
autonomous-system 64512;
dynamic-tunnels {
__contrail__ {
source-address <source-ip-address>
gre;
destination-networks {
<destination-network-1>/24;
<destination-network-2>/32;
<destination-network-3>/32;
<destination-network-4>/32;
<destination-network-5>/32;
<destination-network-6>/32;
}
}
}
BGP组
当Device Manager检测到BGP路由器配置及其与物理路由器的关联时,它将在物理路由器上配置BGP组。
图5显示了用于配置BGP组的Web用户界面。
图5: Edit BGP Router窗口
图6显示了用于配置物理路由器的Web用户界面。
图6: BGP组的Edit Physical Router窗口
以下是Device Manager生成的MX系列路由器配置的示例。
代码语言:javascript复制root@host show groups __contrail__ protocols bgp
group __contrail__ {
type internal;
multihop;
local-address <ip-address>;
hold-time 90;
keep all;
family inet-vpn {
unicast;
}
family inet6-vpn {
unicast;
}
family evpn {
signaling;
}
family route-target;
neighbor <ip-address>;
neighbor <ip-address>;
neighbor <ip-address>;
neighbor <ip-address>;
}
group __contrail_external__ {
type external;
multihop;
local-address <ip-address>;
hold-time 90;
keep all;
family inet-vpn {
unicast;
}
family inet6-vpn {
unicast;
}
family evpn {
signaling;
}
family route-target;
}
扩展专用网络
Device Manager允许你将专用网络和端口扩展到物理路由器。当Device Manager检测到VNC配置时,它将推送第2层(EVPN)和第3层VRF,将规则和接口配置导入和导出到物理路由器。
图7显示了用于配置物理路由器以扩展专用网络的Web用户界面。
图7: 用于扩展专用网络的Edit Physical Router窗口
以下是Device Manager生成的MX系列路由器配置的示例。
代码语言:javascript复制/* L2 VRF */
root@host# show groups __contrail__ routing-instances _contrail_l2_147_vn_private-x1-63
vtep-source-interface lo0.0;
instance-type virtual-switch;
vrf-import _contrail_l2_147_vn_private-x1-63-import;
vrf-export _contrail_l2_147_vn_private-x1-63-export;
protocols {
evpn {
encapsulation vxlan;
extended-vni-list all;
}
}
bridge-domains {
bd-147 {
vlan-id none;
routing-interface irb.147;
vxlan {
vni 147;
}
}
}
/* L3 VRF */
root@host# show groups __contrail__ routing-instances _contrail_l3_147_vn_private-x1-63
instance-type vrf;
interface irb.147;
vrf-import _contrail_l3_147_vn_private-x1-63-import;
vrf-export _contrail_l3_147_vn_private-x1-63-export;
vrf-table-label;
routing-options {
static {
route <ip-address>/24 discard;
}
auto-export {
family inet {
unicast;
}
}
}
/* L2 Import policy */
root@host# ...cy-options policy-statement _contrail_l2_147_vn_private-x1-63-import
term t1 {
from community target_64512_8000066;
then accept;
}
then reject;
/* L2 Export Policy */
root@host# ...ail__ policy-options policy-statement _contrail_l2_147_vn_private-x1-63-export
term t1 {
then {
community add target_64512_8000066;
accept;
}
}
/* L3 Import Policy */
root@host# ...ail__ policy-options policy-statement _contrail_l3_147_vn_private-x1-63-import
term t1 {
from community target_64512_8000066;
then accept;
}
then reject;
/*L3 Export Policy */
root@host# ...ail__ policy-options policy-statement _contrail_l3_147_vn_private-x1-63-export
term t1 {
then {
community add target_64512_8000066;
accept;
}
}
扩展公用网络
当公用网络扩展到物理路由器时,将在MX系列路由器上配置静态路由。配置将下一跳从public.inet.0路由表复制到inet.0默认路由表,并将转发表过滤器从inet.0路由表复制到public.inet.0路由表。该过滤器将应用于在inet.0路由表中查找的所有数据包,并与公共虚拟网络的子网中的目标匹配。策略动作是为了执行在public.inet.0路由表中的查找操作。
图8显示了用于扩展公用网络的Web用户界面。
图8: Edit Network Gateway窗口
以下是Device Manager生成的MX系列路由器配置的示例。
代码语言:javascript复制/* forwarding options */
root@host show groups __contrail__ forwarding-options
family inet {
filter {
input redirect_to_public_vrf_filter;
}
}
/* firewall filter configuration */
root@host# show groups __contrail__ firewall family inet filter redirect_to_public_vrf_filter
term term-_contrail_l3_184_vn_public-x1- {
from {
destination-address {
<ip-address>/16;
}
}
then {
routing-instance _contrail_l3_184_vn_public-x1-;
}
}
term default-term {
then accept;
}
/* L3 VRF static route 0.0.0.0/0 configuration */
root@host# ...instances _contrail_l3_184_vn_public-x1- routing-options static route 0.0.0.0/0
next-table inet.0;
EVPN配置
对于每个专用网络,在MX系列路由器上都配置了2层以太网VPN(EVPN)实例。如果有任何2层接口与虚拟网络相关联,那么还要在网桥域下创建逻辑接口。
以下是Device Manager生成的MX系列路由器配置的示例。
代码语言:javascript复制root@host# show groups __contrail__ routing-instances _contrail_l2_147_vn_private-x1-63
vtep-source-interface lo0.0;
instance-type virtual-switch;
vrf-import _contrail_l2_147_vn_private-x1-63-import;
vrf-export _contrail_l2_147_vn_private-x1-63-export;
protocols {
evpn {
encapsulation vxlan;
extended-vni-list all;
}
}
bridge-domains {
bd-147 {
vlan-id none;
interface ge-1/0/5.0;
routing-interface irb.147;
vxlan {
vni 147;
}
}
}
客户虚拟机和裸机服务器的浮动IP地址和源网络地址转换
本节描述了裸机服务器部署场景,其中服务器连接到专用网络内部的TOR QFX设备,而MX系列路由器则是公用网络连接的网关。
MX系列路由器提供了NAT功能,该功能允许来自公用网络的流量进入专用网络,以及反向的情况。为此,你需要在MX系列路由器上配置NAT规则。当Device Manager检测到裸机服务器连接到公用网络时,将负责在MX系列路由器上对这些NAT规则进行编程。
你必须为TOR设备、MX系列路由器、专用网络和公用网络(包括地址池)配置虚拟网络计算。当TOR设备上的逻辑接口与虚拟机接口相关联,并且将浮动IP地址分配给同一虚拟机接口(VMI)时,Tungsten Fabric会检测到此情况,并且Device Manager会在与专用网络关联的每个MX系列路由器上配置必要的浮动IP NAT规则。
图9说明了Device Manager在MX系列路由器上配置了两个特殊的逻辑接口,称为服务端口(service-ports),用于从专用网络到公用网络的NAT转换。
图9:浮动IP和SNAT的逻辑拓扑
TF架构允许用户使用虚拟网络计算API指定服务端口名称。服务端口必须是MX系列路由器上的物理链接,并且管理和操作状态必须为up。Device Manager在此服务端口上创建两个逻辑接口,每个逻辑接口用于一个专用虚拟网络,并应用NAT规则。
MX系列路由器上的专用网络路由实例,具有指向内部服务接口的默认静态路由(0.0.0.0/0)下一跳。MX系列路由器上的公用网络路由实例,具有指向外部服务接口的专用IP前缀下一跳的路由。从公共IP地址到私有IP地址以及反向NAT规则,都在MX系列路由器上配置。
在MX系列路由器上,为每个专用网络到一个或多个公用网络关联,都创建了一个特殊的路由实例。该VRF在一侧具有两个接口,允许往返于公用网络的流量,而另一个接口则允许往返于专用网络的流量。在MX系列路由器上需要配置防火墙过滤器,以便如果公用网络具有与由TF vRouter管理的guest VM关联的浮动IP地址,则vRouter将执行浮动IP地址功能。否则,MX系列路由器将执行NAT功能,以便与裸机服务器VM之间收发通信。
你必须创建必需的物理设备、接口和虚拟网络配置,并将其推送到MX系列路由器,如图9所示。
可以使用Web UI或VNC API完成Tungsten Fabric配置。所需的配置是:
·创建专用虚拟网络。
·创建一个或多个TOR物理路由器(Tungsten Fabric无需将Junos OS配置推送到该设备。因此,这里vnc managed属性将设置为False)。
·将专用虚拟网络扩展到TOR设备。
·在TOR设备上创建物理和逻辑接口。
·在专用网络上为裸机服务器创建VMI,并将VMI与逻辑接口关联。这样做表明裸机服务器已通过逻辑接口连接到TOR设备。实例IP地址必须分配给该VMI。VMI将专用IP地址用于裸机服务器。
·创建网关路由器。这是由Device Manager管理的物理路由器。
·为物理MX系列路由器配置 service-port物理接口信息。Device Manager在MX系列路由器上,为与该设备关联的每个专用网络配置两个逻辑服务接口,并自动在这些接口上配置NAT规则以实现私有到公共IP地址的转换,并为反向动作配置SNAT规则。逻辑端口ID是根据TF VNC分配的虚拟网络ID计算得出的。每个专用网络需要两个逻辑端口。
·关联浮动IP地址,包括在Tungsten Fabric中创建公用网络、浮动IP地址池和浮动IP地址,并将该IP地址与VMI裸机服务器关联。
·专用网络和公用网络必须扩展到物理路由器。
当Tungsten Fabric中存在所需的配置时,Device Manager会将生成的Junos OS配置推送到MX系列设备。以下展示了示例的配置:
代码语言:javascript复制/* NAT VRF configuration */
root@host# show groups __contrail__ routing-instances _contrail_l3_147_vn_private-x1-63-nat
instance-type vrf;
interface si-2/0/0.293;
vrf-import _contrail_l3_147_vn_private-x1-63-nat-import;
vrf-export _contrail_l3_147_vn_private-x1-63-nat-export;
vrf-table-label;
routing-options {
static {
route 0.0.0.0/0 next-hop si-2/0/0.293;
}
auto-export {
family inet {
unicast;
}
}
}
/* NAT VRF import policy */
root@host# ...y-statement _contrail_l3_147_vn_private-x1-63-nat-import
term t1 {
from community target_64512_8000066;
then accept;
}
then reject;
/* NAT VRF Export policy */
root@host# ..._ policy-options policy-statement _contrail_l3_147_vn_private-x1-63-nat-export
term t1 {
then reject;
}
/* The following additional config is generated for public l3 vrf */
root@host# show groups __contrail__ routing-instances _contrail_l3_184_vn_public-x1-
interface si-2/0/0.294;
routing-options {
static {
route <ip-address>/32 next-hop si-2/0/0.294;
route <ip-address>/32 next-hop si-2/0/0.294;
}
}
/* Services set configuration */
root@host# show groups __contrail__
services {
service-set sv-_contrail_l3_147_vn_ {
nat-rules sv-_contrail_l3_147_vn_-sn-rule;
nat-rules sv-_contrail_l3_147_vn_-dn-rule;
next-hop-service {
inside-service-interface si-2/0/0.293;
outside-service-interface si-2/0/0.294;
}
}
}
/* Source Nat Rules*/
root@host# show groups __contrail__ services nat rule sv-_contrail_l3_147_vn_-sn-rule
match-direction input;
term term<_x_x_x_x> {
from {
source-address {
<ip-address>/32;
}
}
then {
translated {
source-prefix <ip-address>/32;
translation-type {
basic-nat44;
}
}
}
}
term term<_x_x_x_x> {
from {
source-address {
<ip-address>/32;
}
}
then {
translated {
source-prefix <ip-address>/32;
translation-type {
basic-nat44;
}
}
}
}
/* Destination NAT rules */
root@host# show groups __contrail__ services nat rule sv-_contrail_l3_147_vn_-dn-rule
match-direction output;
term term<_x_x_x_x> {
from {
destination-address {
<ip-address>/32;
}
}
then {
translated {
destination-prefix <ip-address>/32;
translation-type {
dnat-44;
}
}
}
}
term term<_x_x_x_x> {
from {
destination-address {
<ip-address>/32;
}
}
then {
translated {
destination-prefix <ip-address>/32;
translation-type {
dnat-44;
}
}
}
}
/* Public VRf Filter */
root@host# show groups __contrail__ firewall family inet filter redirect_to_public_vrf_filter
term term-_contrail_l3_184_vn_public-x1- {
from {
destination-address {
<ip-address>/16;
}
}
then {
routing-instance _contrail_l3_184_vn_public-x1-;
}
}
term default-term {
then accept;
}
/* NAT Vrf filter */
root@host# ...all family inet filter redirect_to__contrail_l3_147_vn_private-x1-63-nat_vrf
term term-_contrail_l3_147_vn_private-x1-63-nat {
from {
source-address {
<ip-address>/32;
<ip-address>/32;
}
}
then {
routing-instance _contrail_l3_147_vn_private-x1-63-nat;
}
}
term default-term {
then accept;
}
/* IRB interface for NAT VRF */
root@host# show groups __contrail__ interfaces
irb {
gratuitous-arp-reply;
unit 147 {
family inet {
filter {
input redirect_to__contrail_l3_147_vn_private-x1-63-nat_vrf;
}
address <ip-address>/24;
}
}
/* Service Interfaces config */
root@host# show groups __contrail__ interfaces si-2/0/0
unit 293 {
family inet;
service-domain inside;
}
unit 294 {
family inet;
service-domain outside;
}
MX系列设备生成的配置样本
本节提供了使用Python脚本生成的MX系列设备配置的几种场景和示例。
场景1:无外部网络的物理路由器
以下描述了没有外部虚拟网络的基本vn、vmi、li、pr、pi配置的用例。当使用此用例的参数执行以下所示的Python脚本时,该配置将应用于MX系列物理路由器。
在Tungsten Fabric控制器上执行的脚本:
代码语言:javascript复制# python provision_physical_router.py --api_server_ip <ip-address> --api_server_port 8082 --admin_user <admin user> --admin_password <password> --admin_tenant_name default-domain --op add_basic
MX系列设备生成的配置:
代码语言:javascript复制root@host# show groups __contrail__
routing-options {
route-distinguisher-id <route-distinguisher-ip-address>;
autonomous-system 64512;
}
protocols {
bgp {
group __contrail__ {
type internal;
multihop;
local-address <ip-address>;
keep all;
family inet-vpn {
unicast;
}
family inet6-vpn {
unicast;
}
family evpn {
signaling;
}
family route-target;
}
group __contrail_external__ {
type external;
multihop;
local-address <ip-address>;
keep all;
family inet-vpn {
unicast;
}
family inet6-vpn {
unicast;
}
family evpn {
signaling;
}
family route-target;
}
}
}
policy-options {
policy-statement __contrail__default-domain_default-project_vn1-export {
term t1 {
then {
community add target_64200_8000008;
accept;
}
}
}
policy-statement __contrail__default-domain_default-project_vn1-import {
term t1 {
from community target_64200_8000008;
then accept;
}
then reject;
}
community target_64200_8000008 members target:64200:8000008;
}
routing-instances {
__contrail__default-domain_default-project_vn1 {
instance-type vrf;
interface ge-1/0/5.0;
vrf-import __contrail__default-domain_default-project_vn1-import;
vrf-export __contrail__default-domain_default-project_vn1-export;
vrf-table-label;
routing-options {
static {
route<ip-address>/24 discard;
}
auto-export {
family inet {
unicast;
}
}
}
}
}
场景2:具有外部网络、公共VRF的物理路由器
本节介绍带有外部虚拟网络公共VRF的vn、vmi、li、pr、pi配置的用例。当使用此用例的参数执行所示的Python脚本时,该配置将应用于MX系列物理路由器。
本示例假定已执行场景1中已描述的配置。
在Tungsten Fabric控制器上执行的脚本:
代码语言:javascript复制# python provision_physical_router.py --api_server_ip <ip-address> --api_server_port 8082 --admin_user <admin user> --admin_password <password> --admin_tenant_name default-domain --op add_basic --public_vrf_test True
MX系列设备生成的配置:
除了在场景1中生成的配置之外,还将以下其它配置推送到MX系列设备。
代码语言:javascript复制forwarding-options {
family inet {
filter {
input redirect_to___contrail__default-domain_default-project_vn1_vrf;
}
}
}
firewall {
filter redirect_to___contrail__default-domain_default-project_vn1_vrf {
term t1 {
from {
destination-address {
<ip-address>/24;
}
}
then {
routing-instance __contrail__default-domain_default-project_vn1;
}
}
term t2 {
then accept;
}
}
}
routing-instances {
__contrail__default-domain_default-project_vn1 {
routing-options {
static {
route 0.0.0.0/0 next-table inet.0;
}
}
}
}
场景3:具有外部网络、公共VRF和EVPN的物理路由器
本节中的场景描述了vn、vmi、li、pr、pi物理路由器配置与外部虚拟网络(公共VRF)和EVPN配置的使用情况。当使用此场景的参数执行Python脚本(如前面的示例中所示)时,以下配置将应用于MX系列物理路由器。
本示例假定已执行场景1中已经描述的配置。
在Tungsten Fabric控制器上执行的脚本:
代码语言:javascript复制# python provision_physical_router.py --api_server_ip <ip-address> --api_server_port 8082 --admin_user <admin user> --admin_password <password> --admin_tenant_name default-domain --op add_basic --public_vrf_test True –vxlan 2002
MX系列设备的生成的配置:
除了在场景1中生成的配置之外,还将以下其它配置推送到MX系列设备。
代码语言:javascript复制protocols {
mpls {
interface all;
}
}
firewall {
filter redirect_to___contrail__default-domain_default-project_vn1_vrf {
term t1 {
from {
destination-address {
<ip-address>/24;
}
}
then {
routing-instance __contrail__default-domain_default-project_vn1;
}
}
term t2 {
then accept;
}
}
}
routing-instances {
__contrail__default-domain_default-project_vn1 {
vtep-source-interface lo0.0;
instance-type virtual-switch;
vrf-target target:64200:8000008;
protocols {
evpn {
encapsulation vxlan;
extended-vni-all;
}
}
bridge-domains {
bd-2002 {
vlan-id 2002;
interface ge-1/0/5.0;
routing-interface irb.2002;
vxlan {
vni 2002;
ingress-node-replication;
}
}
}
}
}
场景4:具有外部网络、公共VRF和裸机服务器浮动IP地址的物理路由器
本节中的场景描述了vn、vmi、li、pr、pi物理路由器配置的用户案例,该配置带有外部虚拟网络(公共VRF)和用于裸机服务器配置的浮动IP地址。
在Tungsten Fabric控制器上执行的脚本:
代码语言:javascript复制#python provision_physical_router.py --api_server_ip <ip-address> --api_server_port 8082 --admin_user <admin user> --admin_password <password> --admin_tenant_name default-domain --op {fip_test|delete_fip_test}