サードパーティアプリケーションの管理

インターセプトライブラリの使用

Junos OS EvolvedはネイティブLinux上で動作するため、サードパーティ製アプリケーションを実行できます。Linuxが要求されたネットワークトポロジー情報(インターフェイスやルートデータなど)を表示する方法と、Junos OSがこの情報を表示する方法にはいくつかの違いがあります。CLIは、これらの違いを克服するように設計されています。ただし、通常、ネイティブLinux上で実行されているサードパーティアプリケーションは、シェルコマンドを使用してネイティブLinuxソースからこの情報を直接取得します。

Junos OS Evolvedは、ネットワークトポロジー情報に対するシェルのリクエストを、Junos OSから情報を取得できるスペースにリダイレクトするインターセプトメカニズムを使用します。このインターセプトメカニズムは、事前読み込みしたインターセプトライブラリ( libsi.so と libnli.so)によって実現されます。インターセプトライブラリをプリロードした後、特定のタイプのリクエストがインターセプトされ、Junos OS情報が表示されます。

インターセプトライブラリはオプションです。アプリケーションが 表1に示すAPIを必要とする場合にのみ必要です。

表1:インターセプトライブラリを必要とするAPI

API

説明

パケットIOとLinuxソケットAPI

管理および/またはデータ インターフェイスを介してパケットを送受信する機能。send、receive、listenなどの標準libc。

rtnetリンク

rtnetlinkを使用して、インターフェイスやルートなどのネットワーク状態を照会する機能。

ネットデバイス

ネットワークデバイスの設定が可能。

プロセス

Linuxカーネルが提供する標準インターフェイスを使用してカーネルデータ構造をクエリする機能。

Junos API

ジュニパーのノースバウンドAPI(NetConf/JET/Telemetry)へのアクセス機能。

注:

ジュニパーのノースバウンドAPIの詳細については、以下を参照してください。

注:

Junos OS Evolvedリリース20.1R1は、以下の機能をサポートしています。

  • set system netlink-async-mode設定を使用して、NETLINK_ROUTE非同期通知を有効にします。この機能はデフォルトでは無効になっています。show nsld modeを使用して、現在のネットリンク非同期モードを表示します。

  • SIOCETHTOOL ioctl は、他のアプリケーションで使用できます。

  • ネットリンクルート属性によるマルチパスネクストホップルート情報

プリロードされたLinuxコマンドの例

preload ディレクティブの動作例は、インターフェイスを表示するコマンド ifconfig を使用します。

インターセプトライブラリを使用して ifconfig コマンドをプリロードすると、Junos OSインターフェイス情報が返されます。インターセプトライブラリは論理インターフェイスのみを変換することに注意してください。この例では、lo0とre0:mgmt-0.0にのみ論理インターフェイスがあるため、出力にはプリロードされた ifconfig コマンドのこれら2つのインターフェイスのみが表示されます。

デフォルトで libnli.so と libsi.so をプリロードするJunos OS Evolvedで提供されているシェルであるjbashを実行しても同じ結果が得られます。

注意:

jbashは、ネットワークの状態情報を取得するためにのみ使用してください。jbash をデフォルトのシェルとして使用しないでください。

インターセプトライブラリでコマンドをプリロードせずにコマンドを発行した場合、表示される出力はLinuxからのものです。以下の出力は、Junos OSの出力よりも長いことに注意してください。Linuxでは、Junos CLIのように物理インターフェイスと論理インターフェイスを区別しません。

インターフェイス名変換

このインターセプトメカニズムを使用する際の制限要因の1つは、Linuxインターフェイス命名規則がJunos OSインターフェイス命名規則と互換性がないことです。Linux は 15 バイトのインターフェイス名 (15 + null 文字) をサポートしています。この制限を超えるネットワークインターフェイス名は、出力で切り捨てられます。Junos OS論理インターフェイス名は、 et-0/0/10:2.32767のように15バイトより長くすることができます。

この違いを回避するために、Junos OS Evolvedは変換ルール( 表2を参照)を使用して、論理インターフェイス名をLinux準拠の形式でレンダリングします。翻訳は、 name-fpcSlot/picSlot/port:channelId.subUnit から nn-ffpttccssssなどの形式をレンダリングします。このルールに従って変換されたインターフェイス名を使用して、サードパーティアプリケーションはJunos OSからトポロジー情報を効果的に取得できます。

論理インターフェイス名の変換のみがサポートされており、チャネル化された論理インターフェイス名と非チャネル化された論理インターフェイス名の両方の変換がサポートされます。

表2:インターフェイス名の変換ルール

値

説明

割り当てられた領域(バイト単位)

範囲

nn

マップされた名前バイト数

2

FF

fpc in hex

2

0-255

p

十六進数のPIC

1

0-15

TT

16進数のポート番号

2

0-255

CC

ヘックスのチャンネル。存在しない場合は、「xx」を使用してください

2

0-255

SSSS

HEXのサブユニット

4

0-65535

管理インターフェイスを除き、論理インターフェイス名にハイフン(-)が含まれていない場合、名前のドット(.)はアンダースコア(_)に変更されます。たとえば、 ifdname.subunit は ifdname_subunitに変換されます。

管理インターフェイスの場合、 reX:mgmt-Y.Z は mgmt-x-yy-zzzz に変換され、x、yy、zzzz は固定長の 0 で 16 進数で埋め込まれています。そして、逆翻訳も同じ行で起こります。

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は、ネイティブLinuxに比較可能な実装がない composite や unilist などの豊富なネクストホップタイプをサポートしています。

静的にリンクされているサードパーティ製アプリケーションは傍受できないため、この機能ではサポートされません。

ソケットインターセプトライブラリを使用しないアプリケーションの実行

一部のアプリケーションでは、ソケットインターセプト (SI) ライブラリに必要な LD_PRELOAD 環境変数を使用できません。これらの非SIアプリケーションのTCPサポートを有効にするには、アプリケーションを起動する前に NO_SI_INTERCEPT 環境変数を設定します。この変数を設定すると、Junos OS Evolvedはソケットインターセプト(SI)ライブラリではなくカーネルインターセプトを使用します。

非SIアプリケーションは、TCPを使用して管理インターフェイスとWANインターフェイスを介して通信し、TCP、UDP、またはUDSを使用して同じデバイス上で実行されている他のアプリケーションに接続できます。

注:

親プロセス内で設定された環境変数は、子プロセスに継承されます。 NO_SI_INTERCEPT を有効にしてプロセスを開始すると、すべての子プロセスが設定を継承します。ソケットインターセプトライブラリを子プロセスに使用するには、 NO_SI_INTERCEPT を削除し、新しい子プロセスの環境に LD_PRELOAD=libsi.so を追加します。

制限事項

非SIアプリケーションには、次の制限が適用されます。

  • 非SIアプリケーションは、デフォルトのLinuxネットワーク名前空間で実行する必要があります。コンテナ化された非SIアプリケーションは、ホストネットワーク名前空間で実行する必要があります。

  • IPsecインターフェイスは、非SIアプリケーションの接続をサポートしていません。

  • TCP-AOやMD5を含むTCP認証プロトコルはサポートされていません。

  • DSCP関連のCLI設定は、非SIアプリケーションソケットには適用されません。

  • DNS名解決を必要とする非SIアプリケーションでは、管理インターフェイス経由で到達可能なDNSサーバーを使用する必要があります。

  • 非SIアプリケーションは、gRPCまたは同様のメカニズムを使用してのみネットワーク状態を取得できます。Netlink APIは、非SIアプリケーションがJunos OS Evolvedネットワーク状態にアクセスするには機能しません。

  • 子プロセスがNO_SI_INTERCEPT環境変数を継承する場合、TCP以外のアプリケーション(pingなど)は失敗します。子プロセスが意図したとおりに機能できるようにするには、NO_SI_INTERCEPTなしでLD_PRELOAD=libsi.soを設定します。

  • 宛先アドレスとローカル エンドポイント アドレスの両方に到達できないために確立された TCP ソケットで送信に失敗しても、非 SI アプリケーションはエラーを受信しません。

  • グレースフルルーティングエンジンスイッチオーバー(GRES)はサポートされていません。各ルーティングエンジンは、独立したステートレス nstackd インスタンスを実行します。

サードパーティアプリケーションの削除

サードパーティ製アプリケーションを削除するには、いくつかの方法があります。使用する必要がある方法は、アプリケーションのインストール方法に基づいています。

  • サードパーティ製アプリケーションが request system software add コマンドでインストールされた場合は、 request system software delete コマンドを使用して同じアプリケーションを削除できます。

  • これらのアプリケーションを削除する最初のステップは、 request security system-keystore unlink key コマンドでキーのリンクを解除することです。

    次に、 rm -f /path/to/binary1 /path/to/binary2 シェルコマンドを使用して、アプリケーションにインストールしたバイナリを削除します。

  • サードパーティ製アプリケーションがDockerコンテナを介してインストールされている場合は、次のDockerコマンドを使用してコンテナを削除します。