Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

基于增强型出站 HTTPS 的 NETCONF 和 Shell 会话

总结 客户端应用程序可以在受支持的 Junos 设备上使用增强的出站 HTTPS 建立网络配置协议 (NETCONF) 会话和 shell 会话。

了解基于增强型出站 HTTPS 的 NETCONF 和 Shell 会话

NETCONF 和 Shell 会话比出站 HTTPS 的优势

  • 启用 NETCONF 或 shell 客户端应用程序来管理无法通过其他协议访问的设备。

  • 使用出站 HTTPS 客户端的基于证书的身份验证,启用设备的远程管理。

基于出站 HTTPS 的 NETCONF 和 Shell 会话概述

您可以通过出站 HTTPS 在受支持的 Junos 设备和网络管理系统之间建立 NETCONF 和 shell 会话。通过出站 HTTPS 的 NETCONF 或 shell 会话使您能够远程管理可能无法通过 SSH 等其他协议访问的设备。例如,如果设备在防火墙后面,而防火墙或其他安全工具会阻止这些协议,则可能会发生这种情况。另一方面,HTTPS 使用标准端口,在大多数环境中通常允许出站。

在受支持的设备上,Junos 软件映像包括一个瞻博网络扩展工具包 (JET) 应用程序,该应用程序支持使用出站 HTTPS 建立 NETCONF 或 shell 会话。JET 应用程序使用 gRPC 框架连接到出站 HTTPS 客户端,该客户端由在网络管理系统上运行的 gRPC 服务器组成。gRPC 是一个与语言无关的开源远程过程调用 (RPC) 框架。 图 1 以最简单的形式展示了出站 HTTPS 设置。

图 1:基于出站 HTTPS NETCONF and Shell Sessions over Outbound HTTPS 的 NETCONF 和 Shell 会话

在这种情况下,gRPC 服务器充当 NETCONF/shell 客户端,JET 应用程序是 gRPC 客户端和 NETCONF/shell 服务器。gRPC 服务器侦听指定端口上的连接请求,默认为端口 443。您可以将 JET 应用程序配置为扩展服务。相关连接和身份验证信息被传递到脚本。脚本运行时,会自动尝试连接到配置的主机和端口上的 gRPC 服务器。

JET 应用程序和 gRPC 服务器通过 TLS 加密的 gRPC 会话建立永久 HTTPS 连接。JET 应用程序使用 X.509 数字证书对 gRPC 服务器进行身份验证,如果身份验证成功,则会通过此连接建立请求的 NETCONF 或 shell 会话。NETCONF 操作和 shell 命令在为扩展服务应用程序配置的用户的帐户权限下执行。

出站 HTTPS 连接使用 X.509 数字证书对 gRPC 服务器进行身份验证。数字证书是通过可信第三方(称为证书颁发机构或证书颁发机构 (CA)来验证您的身份的一种电子手段。证书颁发机构颁发数字证书,该证书可用于通过证书验证在两个端点之间建立安全连接。X.509 标准定义了证书的格式。要在受支持的 Junos 设备上通过出站 HTTPS 建立 NETCONF 或 shell 会话,gRPC 服务器必须具有有效的 X.509 证书。

增强型出站 HTTPS 支持:

  • 连接到多个出站 HTTPS 客户端

  • 为每个出站 HTTPS 客户端配置多个备份 gRPC 服务器

  • 使用给定客户端建立多个并发 NETCONF 和 shell 会话

  • 使用自签名或 CA 签名的 X.509 数字证书对出站 HTTPS 客户端进行验证

  • 使用共享密钥对 Junos 设备进行验证

增强型出站 HTTPS 上会话的连接工作流程

在通过出站 HTTPS 举行的 NETCONF 或 shell 会话中,在网络管理系统上运行的 gRPC 服务器充当 NETCONF/shell 客户端,而 Junos 设备上的 JET 应用程序是 gRPC 客户端和 NETCONF/shell 服务器。您可以配置多个出站 HTTPS 客户端,也可以为每个客户端配置一个或多个备份 gRPC 服务器。JET 应用程序随时仅连接到客户端服务器列表中一个 gRPC 服务器。

gRPC 客户端和服务器通过出站 HTTPS 建立 NETCONF 或 shell 会话,请执行以下操作:

  1. gRPC 服务器侦听指定端口上的传入连接,如果未指定端口,则侦听默认端口 443 上的传入连接。

  2. gRPC 客户端会与配置的 gRPC 服务器和端口启动 TCP/IP 连接。如果配置具有一个或多个备份 gRPC 服务器的出站 HTTPS 客户端,则 gRPC 客户端会尝试连接到列表中的各个服务器,直到它建立连接。

  3. gRPC 客户端发送 TLS ClientHello 消息以启动 TLS 握手。

  4. gRPC 服务器会发送一 ServerHello 条消息及其证书。

  5. gRPC 客户端验证 gRPC 服务器的身份。

  6. gRPC 客户端会将为该出站 HTTPS 客户端配置的设备 ID 和共享密钥发送至 gRPC 服务器。

  7. 出站 HTTPS 客户端请求 NETCONF 或 shell 会话,gRPC 服务器使用设备 ID 和共享密钥对 Junos 设备进行身份验证。如果身份验证成功,将建立会话。

  8. 如果请求 NETCONF 会话,服务器和客户端将交换 NETCONF <hello> 消息。

  9. NETCONF 或 shell 客户端应用会根据需要执行操作。

gRPC 客户端会与同一 gRPC 服务器建立另一个 TCP/IP 连接,gRPC 客户端和服务器重复此过程,从而使出站 HTTPS 客户端能够与网络设备建立多个 NETCONF 和 shell 会话。

如何通过增强型出站 HTTPS 建立 NETCONF 和 Shell 会话

您可以使用作为 Junos 软件映像一部分的 JET 应用程序在网络管理系统 (NMS) 和受支持的 Junos 设备之间通过出站 HTTPS 建立 NETCONF 和 shell 会话。配置为扩展服务的 JET 应用程序会启动与在 NMS 上运行的 gRPC 服务器的连接,并通过 TLS 加密的 gRPC 会话建立永久 HTTPS 连接。NETCONF 或 shell 会话通过此 HTTPS 连接运行。在这种情况下,gRPC 服务器是 NETCONF/shell 客户端,JET 应用程序是 gRPC 客户端和 NETCONF/shell 服务器。

通过增强型出站 HTTPS 建立会话需要以下硬件和软件:

  • 运行 Python 3.5 或更高版本的网络管理系统

  • 运行 Junos OS 演化版的设备或具有升级版 FreeBSD 20.3 或更高版本且支持运行 JET 应用程序的 Junos OS 的设备

    注意:

    有关支持的设备,请参阅 功能浏览器

图 2 展示了在随后的任务中引用的设置。Junos 设备上的管理接口名称因平台和操作系统而异。

图 2:基于出站 HTTPS 拓扑 NETCONF over Outbound HTTPS Topology的 NETCONF

客户端和服务器通过出站 HTTPS 建立 NETCONF 或 shell 会话之前,您必须满足以下部分讨论的要求:

获取 gRPC 服务器的 X.509 证书

出站 HTTPS 连接使用 X.509 公钥证书来验证在网络管理系统上运行的 gRPC 服务器的身份。gRPC 堆栈支持 X.509 v3 证书格式。

gRPC 服务器证书的要求包括:

  • 证书可以自签名,也可由证书颁发机构 (CA) 签名。

  • 证书必须在通用名称 (CN) 字段中定义 gRPC 服务器的主机名,或者在 SubjectAltName (SAN) IP 地址字段中定义 gRPC 服务器的 IP 地址。Junos 设备必须使用相同的值才能与服务器建立连接。如果证书定义了 SubjectAltName IP 地址字段,设备在身份验证期间将忽略公用名字段。

  • 证书必须采用 PEM 编码并使用 .crt 扩展。

  • 证书及其密钥必须分别命名 为 server.crtserver.key

要使用 OpenSSL 获取证书:

  1. 生成一个私有密钥,并指定密钥长度(以位)。
    注意:

    我们建议使用 3072 位或更高的私有密钥大小。密钥长度不应超过 4096 位。

  2. 如果要连接到 gRPC 服务器的 IP 地址,请更新 openssl.cnf 或等效配置文件,以使用 gRPC 服务器的地址定义subjectAltName=IP扩展。
  3. 生成证书签名请求 (CSR),其中包含实体的公钥和有关其身份的信息。
  4. 通过请执行以下操作之一生成证书:
    • 将 CSR 发送至证书颁发机构,以请求 X.509 证书,并提供要包含任何其他扩展的配置文件。

    • 使用 CA 对 CSR 进行签名以生成客户端证书,如果需要引用您的配置文件和扩展,请添加 -extfile 选项。

    • 使用服务器密钥对 CSR 进行签名以生成自签名客户端证书,如果需要引用您的配置文件和扩展,请添加 -extfile 选项。

  5. 验证公用名 (CN) 字段和扩展(如果提供)是否正确。

设置 gRPC 服务器

网络管理系统需要以下软件:

  • Python 3.5 或更高版本

Junos 设备上的网络管理系统和 JET 应用程序使用 gRPC 框架,通过 TLS 加密的 gRPC 会话建立永久 HTTPS 连接。网络管理系统必须安装 gRPC 堆栈,并运行侦听指定端口的连接请求的 gRPC 服务器。瞻博网络在 GitHub 上的瞻博网络 netconf-https-outbound 存储库中提供必要的 proto 定义文件和示例 gRPC 服务器应用程序文件。

本节在运行 Ubuntu 18.04 的网络管理系统上设置 gRPC 服务器。如果运行的是其他操作系统,请使用适合您的操作系统的命令。

在运行 Ubuntu 18.04 的网络管理系统上设置 gRPC 服务器:

  1. 为 Python 3 安装 pip
  2. grpcio安装软件包。
  3. grpcio-tools安装软件包。
    注意:

    如果遇到安装错误或grpciogrpcio软件包,请尝试安装最新版本。

  4. 访问 https://github.com/Juniper/netconf-https-outbound 的瞻博网络 GitHub 存储库,并选择与在 Junos 设备上运行的版本对应的目录。

    释放

    目录

    Junos OS 20.3R1 或更高版本

    20.3

    Junos OS 演化版 22.4R1 或更高版本

    junos-evolved/22.4

  5. 将 GitHub 目录中的应用程序和 proto 文件下载到 gRPC 服务器证书所在网络管理系统上的目录。
    1. 选择每个文件,然后单击 Raw 按钮,然后复制文件的 URL。

    2. 使用 URL 和您选择的下载工具(例如, wgetcurl)来下载文件。

  6. 使用协议缓冲区编译器 protoc编译每个 proto 定义文件并生成 Python 代码,这会为每个 proto 文件生成两个输出文件。

    例如:

  7. 启动 gRPC 服务器,并指定连接的端口(如果它不同于默认端口 443)。
    注意:

    您可能需要使用 root 权限执行脚本,才能侦听端口 443。

gRPC 服务器无限期侦听指定端口的传入连接。将 Junos 设备配置为连接到 gRPC 服务器并建立连接和会话后,您可以根据需要执行 NETCONF 操作或 shell 命令。

为 NETCONF 或 Shell 用户配置用户帐户

要通过出站 HTTPS 建立 NETCONF 或 shell 会话,必须在 Junos 设备上本地创建用户帐户。使用此帐户在设备上执行该会话的 NETCONF 或 shell 操作。JET 应用程序会使用此帐户配置的权限运行。

在 Junos 设备上创建用户帐户:

  1. user使用唯一用户名配置语句,并包括该class语句以指定具有用户执行的所有操作所需的权限的登录类。例如:
  2. (可选)配置 uid and full-name 语句以指定唯一用户 ID 和用户名称。
  3. 提交配置以激活设备上的用户帐户。
  4. 在客户端需要通过出站 HTTPS 建立 NETCONF 或 shell 会话的每台 Junos 设备上重复上述步骤。

配置出站 HTTPS 客户端

通过增强的出站 HTTPS,您可以在层级配置多个出站 HTTPS 客户端 [edit system services outbound-https] ,并为每个客户端配置多个备份 gRPC 服务器。JET 应用程序随时仅连接到客户端服务器列表中一个 gRPC 服务器。

配置设备之前,您需要以下信息:

  • gRPC 服务器侦听连接的端口。

  • SubjectAltName IP 地址字段的内容,如果没有该字段,则表示 gRPC 服务器证书中通用名 (CN) 字段的内容。

  • gRPC 服务器证书的内容(如果是自签名)或者 CA 证书的内容(如果使用证书链进行验证)。

要配置出站 HTTPS 客户端,

  1. 导航至出站 HTTPS 客户端层次结构,并定义可唯一标识出站 HTTPS 客户端的标识符。
  2. 定义设备标识符,这是一个用户定义的字符串,gRPC 服务器使用该字符串在建立会话期间识别和验证 Junos 设备。
  3. 定义一个共享密钥字符串,这是 gRPC 服务器在会话建立期间用于对 Junos 设备进行身份验证的用户定义的字符串。

    设备将共享密钥字符串作为加密值存储在配置数据库中。

  4. (可选)定义用于将断开连接的出站 HTTPS 连接重新建立为stickyin-order的方法。
  5. (可选)定义 gRPC 客户端在尝试连接到出站 HTTPS 客户端服务器列表之间等待的时间(以秒为单位)。
  6. 为一个或多个 gRPC 服务器以及服务器侦听出站 HTTPS 连接请求的端口配置主机名或 IPv4 地址。

    主机名或 IP 地址必须分别匹配该 gRPC 服务器证书中的公用名 (CN) 字段或 SubjectAltName IP 地址字段的值。

  7. 对于每台 gRPC 服务器,配置trusted_cert语句,并提供验证服务器所需的证书信息。
    • 如果服务器证书是自签名的,请配置 gRPC 服务器证书 server.crt 的内容,省略任何新行。

    • 如果使用证书链对服务器证书进行身份验证,请按该顺序连接任何中间 CA 和根 CA 证书,删除所有新行,然后配置生成的单个字符串。

    注意:

    为了轻松为 trusted_cert 语句生成值,您可以按所需顺序串联相应的证书并删除所有新行,例如,使用类似以下内容的命令:

  8. 对将管理 Junos 设备的每台出站 HTTPS 客户端重复上述步骤。
  9. 提交配置。
注意:

如果出站 HTTPS 扩展服务已在运行,并且您添加、删除或修改出站 HTTPS 客户端并提交配置,则无需重新启动服务,即可使更改生效。它们会自动被拾取。

在 Junos 设备上配置出站 HTTPS 扩展服务

支持 NETCONF 和通过出站 HTTPS 进行 shell 会话的 Junos 版本包括 JET 应用程序和软件映像中的支持文件。 表 1 概述了位于设备上的 /var/db/脚本/jet 目录中的文件。

表 1:基于增强型出站 HTTPS 的会话的 JET 文件

文件

描述

nc_grpc_app.pyc

JET 应用程序,使用 gRPC 框架与网络管理系统上运行的 gRPC 服务器建立永久 HTTPS 连接。

nc_grpc_app_lib.pyc

必需的库

要为出站 HTTPS 上的会话配置 Junos 设备:

  1. 验证设备上是否存在 JET 应用程序和相关文件。
  2. 进入配置模式。
  3. 使设备能够运行未签名的 Python 3 应用程序。
  4. 为环路地址配置扩展服务通知。
  5. 导航至扩展服务应用程序的层次结构。
  6. 将应用程序配置为在后台作为守护进程运行。
  7. 将应用程序配置为在正常出口处重新生成。
  8. 配置 usename,以谁的权限执行应用程序,并执行 NETCONF 操作和 shell 命令。
  9. 提交配置。

    提交配置时, daemonize 选项会使应用程序自动启动。

  10. 验证应用程序是否正在运行。

应用程序成功启动后,它会将消息记录到 outbound_https.log 文件中。

注意:

如果应用程序在您提交配置后未自动启动,请查看与此应用程序相关的日志消息,以排除故障。在 Junos OS 中,发出 show log jet.log 命令。在 Junos OS 演化中,发出 show trace application cscriptshow log messages 命令。

启动 NETCONF 或 Shell 会话

在网络管理系统上运行的 gRPC 服务器充当 NETCONF/shell 客户端,Junos 设备上的 JET 应用程序充当 gRPC 客户端和 NETCONF/shell 服务器。启动 gRPC 服务器和 JET 应用程序后,JET 应用程序会尝试连接到指定端口上的 gRPC 服务器。如果连接成功,gRPC 客户端将验证 gRPC 服务器。如果服务器身份验证成功,您可以请求一个或多个 NETCONF 或 shell 会话。

开始之前,您需要了解以下信息:

  • 为出站 HTTPS 客户端配置的设备标识符和共享密钥字符串

要通过增强型出站 HTTPS 建立 NETCONF 或 shell 会话:

  1. 在网络管理系统上,如果尚未启动 gPRC 服务器,请启动服务器并指定连接的端口。
  2. 要与 Junos 设备建立一个或多个会话,请执行 request_session.py 脚本。指定会话类型以及为 Junos 设备上的出站 HTTPS 客户端配置的设备 ID 和共享密钥。例如:
    • 要请求默认的 csh 会话,则无需指定会话类型。

    • 要请求 NETCONF 会话,请添加选项 -s netconf

    如果服务器成功对 Junos 设备进行身份验证,则请求的会话将启动。

  3. 通过查看输出验证会话是否已建立。
    • Shell 会话应显示 csh session is started 输出,例如:

    • NETCONF 会话应显示 NETCONF 功能,如下所示:

  4. 根据需要执行 NETCONF 或 shell 操作。
  5. 完成会话后,键入 Ctrl+C
  6. 使用出站 HTTPS 连接后,可以通过删除或停用配置中的相关层次结构,然后提交更改来停止 Junos 设备上的扩展服务应用程序。