Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

管理第三方应用程序

使用拦截库

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

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

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

表 1:需要拦截库的 API

Api

描述

数据包 IO 和 Linux 套接字 API

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

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,可供其他应用程序使用。

  • 通过 netlink 路由属性提供多路径下一跳路由信息。

预加载的 Linux 命令示例

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

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

您可以通过运行 jbash 获得相同的结果,jbash是 Junos OS 演化版提供的外壳,默认情况下会预加载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.subUnitnn-ffpttccssss呈现为 。使用根据此规则转换的接口名称,第三方应用程序可以有效地从 Junos OS 获取拓扑信息。

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

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

价值

描述

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

范围

nn

映射名称字节

2

Ff

十六进制 FPC

2

0-255

P

十六进制图片

1

0-15

Tt

十六进制端口号

2

0-255

Cc

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

2

0-255

SSSS

十六进制亚单位

4

0-65535

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

对于管理接口,转换为 mgmt-x-yy-zzzzreX:mgmt-Y.Z其中 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:MGMT-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 Evolved 支持一套丰富的下一跃点类型,例如 compositeunilist 在本地 Linux 中没有类似实现的类型。

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

删除第三方应用程序

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

  • 如果使用命令 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 命令删除该容器: