gRPC 隧道概述
gRPC 隧道充当客户端-服务器协议,通过默认路由实例或配置的路由实例将会话从目标拨出到 TCP 客户端。如果未选择配置路由实例,gRPC 隧道将使用默认路由实例。
可以为每个 gRPC 隧道会话配置源地址,以拨出与隧道服务器的连接。如果未配置源地址,内核将选择可以到达隧道服务器的源地址。
有关 gRPC 隧道的详细信息,请参阅 https://github.com/openconfig/grpctunnel。
gRPC 隧道有三个主要实体:
-
目标 — 表示网络设备。目标是 gRPC 客户端。
-
隧道服务器 — 一个软件实体,它是一个异机应用程序,用于管理订阅和目标注册。隧道服务器是 gRPC 服务器。
-
隧道客户端 — 执行客户端任务的软件实体。隧道客户端可以是独立包含在隧道服务器中。隧道客户端也是一个 gRPC 客户端。
使用 gRPC 隧道会话的好处:
-
从服务器端建立连接时,可克服一系列复杂的防火墙配置。
-
无需任何作要求即可访问各种 TCP 服务器应用,如 gNMI-gNOI、SSH 或 NETCONF-SSH。
gRPC 隧道架构
gRPC 隧道是基于 TCP 的应用程序在 gRPC 消息中进行通信的通用基础结构。
通常,TCP 客户端会启动与 TCP 服务器或目标的连接。Junos 设备充当运行 TCP 服务器应用程序(如 gNMI-gNOI、SSH 和 NETCONF-SSH)的目标。如果客户端无法访问服务器,常见原因可能是:
-
服务器遇到复杂的防火墙配置,防火墙会阻止入站连接。
-
服务器运行到实施网络地址转换 (NAT) 的路由器。
-
服务器会遇到任何其他作要求,这会阻止外部连接。
当 TCP 客户端无法访问目标时,可以配置 gRPC 隧道会话以在 TCP 客户端和目标之间建立连接。gRPC 隧道会话在目标拨出到 TCP 客户端的相反方向上建立连接。
要使用 gRPC 隧道会话,需要将隧道客户端添加到运行 grpc 隧道进程的目标侧,并执行所有与 gRPC 隧道相关的配置。在 TCP 客户端,添加了隧道服务器。
您必须在 grpc-tunnel [edit system services] 层次结构中包含配置语句,才能配置 gRPC 隧道会话。
gRPC 隧道安全
gRPC 隧道是一种拨出模型,设备根据配置启动连接。gRPC 隧道位于使用 TLS 证书的安全 gRPC 通道上。
示例:配置 gRPC 隧道
概述
本节介绍在此示例中配置目标所需的步骤。目标是包含 gRPC 隧道配置的 Junos OS 设备。
要求
此示例使用以下软件和硬件组件:
-
Junos OS 或 Junos Evolved 22.4 或更高版本(适用于路由和交换设备)
-
一台主机设备作为隧道客户端
-
一台主机设备作为隧道服务器
拓扑学
图 1 显示了此示例中使用的拓扑。
根据目标设备的 Junos 配置,它会向隧道服务器拨出一个 grpc 隧道。目标设备通过注册流 RPC 向隧道服务器注册自身。
当客户端向特定目标请求 TCP 会话时,隧道服务器将充当中间人,并连接到隧道服务器上上述注册的目标会话。
如果目标支持请求的类型,设备将拨出一个名为“隧道流 RPC”的新隧道。此过程通过隧道服务器在客户端和目标之间建立 gRPC 隧道。隧道客户端现在可以访问目标上的预期 TCP 应用程序。
隧道服务器和网络设备之间只能存在一个寄存器流,但同一对可以存在多个隧道流。
配置 gRPC 隧道
CLI 快速配置
配置此示例的方法是将以下命令复制到文本文件中,调整特定于网络的详细信息,然后将其复制到 [编辑] 层次结构级别的 CLI 中。
set system services grpc-tunnel servers server server1 address 10.205.0.1 set system services grpc-tunnel servers server server1 port 50301 set system services grpc-tunnel servers server server1 credentials tls certificate-id client-cert1 set system services grpc-tunnel servers server server1 targets ssh
分步过程
按照以下步骤在目标设备中配置 gRPC 隧道。
-
在 gRPC-tunnel 下配置服务器。
-
配置隧道服务器的 IPv4 或 IPv6 地址或主机名。
[edit system services] user@host# set grpc-tunnel servers server server1 address 10.205.0.1
-
配置隧道服务器侦听的端口号。
[edit system services] user@host# set grpc-tunnel servers server server1 port 50301
-
使用 tls 语句配置凭据。
[edit system services] user@host# set grpc-tunnel servers server server1 credentials tls certificate-id client-cert1
-
指定要访问的目标应用程序。可用的选项有 ssh、 netconf-ssh 和 gnmi-gnoi。
[edit system services] user@host# set grpc-tunnel servers server server1 targets ssh
-
-
(可选)设置 重试间隔 (以秒为单位)。如果无法访问 tunnel-server,则目标设备会在重试间隔后重试连接。
[edit system services] user@host# set grpc-tunnel servers retry-interval 30
-
(可选)
设置 路由实例。如果未设置路由实例,则 gRPC 隧道将使用默认路由实例。[edit system services] user@host# set grpc-tunnel servers server ts1 routing-instance routing-instance
-
(可选)
设置 源地址。如果未设置源地址,内核将选择可以到达隧道服务器的源地址。[edit system services] user@host# set grpc-tunnel servers server ts1 source-address 69.70.31.677
-
(可选)在 grpc-tunnel 下配置 target-string-option。
-
使用 pattern 语句创建受支持选项的有序列表。
[edit system services] user@host# set grpc-tunnel target-string-option pattern hostname custom
-
使用 custom-string 语句定义一个自定义字符串,当语句 模式 包含 custom 作为选项之一时发送该字符串。
[edit system services] user@host# set grpc-tunnel target-string-option custom-string device1
-
如果在模式中选择了多个选项,请使用 delimiter 语句。默认情况下, | 使用(管道符号)。
[edit system services] user@host# set grpc-tunnel target-string-option delimiter |
-
最多可以配置 10 个隧道服务器。
结果
显示目标设备上的配置结果。输出仅反映此示例中添加的功能配置。
user@host> show configuration system services
grpc-tunnel {
servers {
retry-interval 30;
server server1 {
address 10.205.0.01;
port 50301;
credentials {
tls {
certificate-id client-cert1;
}
}
targets [ ssh ];
routing-instance routing-instance;
source-address 69.70.31.677;
}
server server2 {
address 10.205.0.02;
port 50302;
credentials {
tls {
ca-profiles [ serverRootCA1 serverRootCA2 ];
}
}
targets [ gnmi-gnoi netconf-ssh ];
routing-instance routing-instance;
source-address 69.70.31.677;
}
}
target-string-option {
pattern [ hostname vendor model version custom ];
custom-string device1;
delimiter |;
}
}