管理第三方应用

使用拦截库

Junos OS 演化版可以在原生 Linux 上运行,因此可以运行第三方应用。Linux 显示请求的网络拓扑信息(如接口和路由数据)的方式与 Junos OS 显示此信息的方式之间存在一些差异。CLI 就是为了克服这些差异而设计的。但通常情况下,在本机 Linux 上运行的第三方应用程序使用 shell 命令直接从本机 Linux 源获取此信息。

Junos OS 演化版使用拦截机制,将网络拓扑信息的 shell 请求重定向到可从 Junos OS 获取信息的空间。此拦截机制是通过拦截库 libsi.so libnli.so和预加载的 来完成的。预加载拦截库后,某些类型的请求将被拦截并显示 Junos OS 信息。

截距库是可选的;仅当应用需要 表 1 中提到的 API 时,才需要它们:

表 1:需要 Intercept 库的 API

API

描述

数据包 IO 和 Linux 套接字 API

能够通过管理和/或数据接口发送和接收数据包。标准 libc,例如 send、receive、listen。

RTNETLINK

能够使用 rtnetlink 查询网络状态,如接口、路由。

网络设备

能够配置网络设备。

触发

能够使用 Linux 内核提供的标准接口查询内核数据结构。

Junos API

能够访问瞻博网络北向 API - NetConf/JET/遥测。

注意:

有关瞻博网络北向 API 的更多信息,请参阅以下内容:

注意:

Junos OS 演化版 20.1R1 支持以下功能:

  • 使用该 set system netlink-async-mode 配置启用NETLINK_ROUTE异步通知。默认情况下,此功能处于禁用状态。 show nsld mode 用于显示当前网络链路异步模式。

  • SIOCETHTOOL ioctl,可供其他应用程序使用。

  • 通过网络链路路由属性的多路径下一跃点路由信息。

预加载的 Linux 命令示例

下面是使用 ifconfig命令 preload 指令的工作原理示例,该命令显示接口。

如果使用 intercept 库预加载命令 ifconfig ,则会返回 Junos OS 接口信息。请注意,拦截库仅转换逻辑接口。在此示例中,由于仅在 lo0 和 re0:mgmt-0.0 上存在逻辑接口,因此输出仅显示预加载 ifconfig 命令的这两个接口。

您可以通过运行 jbash 获得相同的结果,jbash 是 Junos OS Evolved 提供的 shell,默认情况下会预libnli.solibsi.so加载。

注意:

仅使用 jbash 获取网络状态信息。不要使用 jbash 作为默认 shell。

如果在未使用拦截库预加载命令的情况下发出命令,则显示的输出来自 Linux。请注意,以下输出比 Junos OS 的输出长。 Linux 不像 Junos CLI 那样区分物理接口和逻辑接口。

接口名称转换

使用此拦截机制的一个限制因素是 Linux 接口命名与 Junos OS 接口命名不兼容。Linux 支持 15 字节接口名称(15 + 空字符);超过此限制的网络接口名称将在输出中被截短。Junos OS 逻辑接口名称可以超过 15 个字节,例如 et-0/0/10:2.32767。

为了解决这一差异,Junos OS 演化版使用转换规则(参见 表 2)以符合 Linux 的格式呈现逻辑接口名称。转换将呈现一种格式,例如 name-fpcSlot/picSlot/port:channelId.subUnit nn-ffpttccssss。使用根据此规则转换的接口名称,第三方应用程序可以有效地从 Junos OS 获取拓扑信息。

仅支持逻辑接口名称的转换,并且支持通道化和非通道化逻辑接口名称的转换。

表 2:接口名称的转换规则

value

描述

分配的空间(以字节为单位)

范围

nn

映射的名称字节

2

ff

十六进制中的 FPC

2

0-255

p

十六进制 PIC

1

0-15

TT

十六进制端口号

2

0-255

抄送

十六进制通道;如果不存在,请使用“xx”

2

0-255

SSS

十六进制中的亚基

4

0-65535

除管理接口外,如果逻辑接口名称中没有连字符 (-),则名称中的点 (.) 将更改为下划线 (_),例如: ifdname.subunit 将转换为 ifdname_subunit。

对于管理接口, reX:mgmt-Y.Z 转换为 mgmt-x-yy-zzzz,其中 x、yy、zzzz 在固定长度的十六进制内带 0。反向平移发生在同样的路线上。

有关 Junos 逻辑接口名称及其 Linux 兼容形式的示例,请参阅 表 3 。

表 3:转换后的逻辑接口名称示例

Junos 逻辑接口名称

转换后的 Linux 兼容接口名称

ET-1/2/3.4

ET-01203XX0004

GE-1/2/3.32

GE-01203XX0020

ET-1/15/3.4

ET-01F03XX0004

ET-1/2/255:6.7

ET-012FF060007

ET-1/2/4:5.32767

ET-01204057FFF

re0:管理-1.2

管理-0-01-0002

ae0.1

ae0_1

IRB0.11

irb0_11

通过预加载 libnli.so访问 Junos OS 状态时,输出中的接口名称显示为经过转换的 Linux 兼容接口名称。在命令中将翻译后的 Linux 兼容接口名称用作参数时,还必须使用该接口名称。在以下示例中,转换后的 et-01000000000 接口名称用作参数:

拦截功能的注意事项

此拦截功能支持只读请求。任何写入请求都会返回错误。

某些 Junos 网络状态的表示可能无法映射到 Linux 等效项。在这些情况下,数据要么被省略,要么重新映射到可比较的 Linux 模型。例如,Junos OS 演化版支持一系列丰富的下一跃点类型,例如 composite 在原生 Linux 中没有可比实现的 或 unilist 。

静态链接的第三方应用程序无法被拦截,因此此功能不支持。

在没有套接字拦截库的情况下运行应用程序

某些应用程序不能使用 LD_PRELOAD 套接字拦截 (SI) 库所需的环境变量。要为这些非 SI 应用程序启用 TCP 支持,请在启动应用程序之前设置 NO_SI_INTERCEPT 环境变量。设置此变量后,Junos OS 演化版将使用内核拦截而不是套接字拦截 (SI) 库。

非 SI 应用使用 TCP 通过管理和 WAN 接口进行通信,并可使用 TCP、UDP 或 UDS 连接到在同一设备上运行的其他应用。

注意:

父进程中设置的任何环境变量都由子进程继承。如果在启用的情况下 NO_SI_INTERCEPT 启动进程,则所有子进程都继承该设置。若要将套接字拦截库用于子进程,请删除 NO_SI_INTERCEPT 并添加到 LD_PRELOAD=libsi.so 新子进程的环境中。

限制

以下限制适用于非 SI 应用程序:

  • 非 SI 应用程序必须在默认的 Linux 网络命名空间中运行。容器化非 SI 应用程序必须在主机网络命名空间中运行。

  • IPsec 接口不支持非 SI 应用程序的连接。

  • 不支持 TCP 身份验证协议,包括 TCP-AO 和 MD5。

  • 与 DSCP 相关的 CLI 配置不适用于非 SI 应用程序套接字。

  • 需要 DNS 名称解析的非 SI 应用程序必须使用可通过管理接口访问的 DNS 服务器。

  • 非 SI 应用程序只能使用 gRPC 或类似机制检索网络状态。Netlink API 不适用于非 SI 应用访问 Junos OS Evolved 网络状态。

  • 如果子进程继承 NO_SI_INTERCEPT 了环境变量,则非 TCP 应用程序(例如 ping)将失败。要使子进程按预期工作,请不使用 LD_PRELOAD=libsi.so NO_SI_INTERCEPT.

  • 当由于目标地址和本地端点地址都无法访问而在已建立的 TCP 套接字上发送失败时,非 SI 应用程序不会收到错误。

  • 不支持平滑路由引擎切换 (GRES)。每个路由引擎运行一个独立的无 nstackd 状态实例。

移除第三方应用

有几种方法可以删除第三方应用程序。您应该使用的方法取决于您安装应用程序的方式。

  • 如果使用该 request system software add 命令安装了第三方应用程序,则可以使用该 request system software delete 命令删除同一应用程序。

  • 删除这些应用程序的第一步是取消密钥与命令的 request security system-keystore unlink key 链接。

    接下来,删除使用 shell 命令为 rm -f /path/to/binary1 /path/to/binary2 应用程序安装的所有二进制文件。

  • 如果第三方应用程序是通过 Docker 容器安装的,请使用以下 Docker 命令删除容器: