7. プロキシフォワーダアプリケーションにおける管理ターゲット変換
プロキシフォワーダアプリケーションは、SNMPメッセージを転送する際に管理ターゲットの変換を実行します。この変換には、受信メッセージパラメータ(contextEngineID、contextName、securityModel、securityName、securityLevel)をターゲットSNMPエンジンに適した送信メッセージパラメータにマッピングすることが含まれます。
snmpProxyTableは、プロキシフォワーダが使用する変換ルールを定義します。
7.1. リクエスト転送
リクエスト転送には、コマンドジェネレータからコマンドリクエストを受信し、リクエストパラメータを変換し、コマンドレスポンダにリクエストを転送することが含まれます。
7.1.1. 受信リクエストの処理
プロキシフォワーダがリクエストを受信すると:
-
受信したメッセージから受信パラメータを抽出します:
- contextEngineID
- contextName
- securityModel
- securityName
- securityLevel
- PDUタイプ
-
これらのパラメータをキーとして使用してsnmpProxyTableを検索します。具体的には、次のエントリを検索します:
- snmpProxyTypeが読み取りクラスPDU(Get、GetNext、GetBulk)の場合はread(1)、書き込みクラスPDU(Set)の場合はwrite(2)
- snmpProxyContextEngineIDが受信contextEngineIDと一致
- snmpProxyContextNameが受信contextNameと一致
- snmpProxyTargetParamsInが受信セキュリティパラメータと一致するターゲットパラメータを参照
-
一致するエントリが見つからない場合:
- リクエストを転送できないことを示すエラー応答を生成します。
- 特定のエラーは、SNMPバージョンと状況に依存します(authorizationError、genErrなど)。
-
一致するエントリが見つかった場合:
- snmpProxySingleTargetOutまたはsnmpProxyMultipleTargetOut値を抽出します。
7.1.2. リクエストの転送
一致するsnmpProxyTableエントリを見つけた後:
単一ターゲット転送
snmpProxySingleTargetOutが指定されている場合:
-
snmpProxySingleTargetOutをsnmpTargetAddrNameとして使用してsnmpTargetAddrTableを検索します。
-
ターゲットアドレス情報を抽出します:
- snmpTargetAddrTDomain(トランスポートドメイン)
- snmpTargetAddrTAddress(トランスポートアドレス)
- snmpTargetAddrParams(snmpTargetParamsTableへの参照)
-
snmpTargetAddrParamsを使用してsnmpTargetParamsTableを検索します。
-
ターゲットセキュリティパラメータを抽出します:
- snmpTargetParamsMPModel(メッセージ処理モデル)
- snmpTargetParamsSecurityModel
- snmpTargetParamsSecurityName
- snmpTargetParamsSecurityLevel
-
ターゲットコンテキストを決定します:
- snmpProxyContextEngineIDが空の場合、受信contextEngineIDを使用します。
- そうでない場合は、snmpProxyContextEngineIDを使用します。
- snmpProxyContextNameについても同様です。
-
必要に応じてPDUを変換します:
- 受信および送信SNMPバージョンが異なる場合、PDU形式とエラーコードを変換します。
- SNMPv1からSNMPv2へ:エラーコードをマッピング、trap形式を変換します。
- SNMPv2からSNMPv1へ:エラーコード(noAccess→genErrなど)をマッピング、例外値を処理します。
-
メッセージ処理サブシステムのPDU送信プリミティブを使用して、ターゲットパラメータでリクエストを転送します。
複数ターゲット転送
snmpProxyMultipleTargetOutが指定されている場合:
-
snmpTargetAddrTagListにsnmpProxyMultipleTargetOutで指定されたタグが含まれるsnmpTargetAddrTable内のすべてのエントリを検索します。
-
一致する各ターゲットアドレスについて:
- 単一ターゲット転送のステップ2〜7に従います。
- 元のリクエストが複製され、複数のターゲットアドレスに送信されることに注意してください。
-
複数ターゲットの応答処理:
- 複数ターゲット転送は通常、読み取り操作にのみ使用されます。
- プロキシは応答を集約するか、最初の成功した応答を返す必要がある場合があります。
- 特定の動作は実装に依存します。
7.1.3. 応答の転送
プロキシフォワーダがターゲットコマンドレスポンダから応答を受信すると:
-
必要に応じて応答PDUを変換して、元のリクエスタが期待する形式と一致させます。
-
contextEngineIDとcontextNameを元のリクエスタが期待する値にマッピングします。
-
メッセージ処理サブシステムの応答PDU返送プリミティブを使用して応答を返送します。
7.2. 通知転送
通知転送には、通知オリジネータから通知を受信し、1つ以上の通知レシーバに転送することが含まれます。
7.2.1. 受信通知の処理
プロキシフォワーダが通知を受信すると:
-
受信パラメータを抽出します:
- contextEngineID
- contextName
- securityModel
- securityName
- securityLevel
- 通知タイプ(trapまたはinform)
-
これらのパラメータを使用してsnmpProxyTableを検索します。次のエントリを検索します:
- snmpProxyTypeがtrap通知の場合はtrap(3)、inform通知の場合はinform(4)
- snmpProxyContextEngineIDが受信contextEngineIDと一致(または任意に一致するように空)
- snmpProxyContextNameが受信contextNameと一致(または任意に一致するように空)
- snmpProxyTargetParamsInが受信セキュリティパラメータと一致するターゲットパラメータを参照(または任意に一致するように空)
-
一致するエントリが見つからない場合:
- 通知は転送されません。
- プロキシはこのイベントをローカルに記録する場合があります。
-
一致するエントリが見つかった場合:
- snmpProxyMultipleTargetOut値を抽出します(通知転送は常に複数ターゲット転送を使用します)。
7.2.2. 通知の転送
一致するsnmpProxyTableエントリを見つけた後:
-
snmpTargetAddrTagListにsnmpProxyMultipleTargetOutで指定されたタグが含まれるsnmpTargetAddrTable内のすべてのエントリを検索します。
-
一致する各ターゲットアドレスについて:
a. snmpTargetParamsTableでsnmpTargetAddrParamsを検索します。
b. ターゲットパラメータを抽出します。
c. snmpNotifyTable(参照されている場合)に基づいてtrapまたはinformとして送信するかどうかを決定するか、受信通知と同じタイプを使用します。
d. 必要に応じて通知PDUを変換します:
- SNMPv1 trapからSNMPv2 trapへ:PDU形式を変換し、sysUpTime.0とsnmpTrapOID.0を追加します。
- SNMPv2 trapからSNMPv1 trapへ:PDU形式を変換し、enterprise、agent-addr、generic-trap、specific-trapを抽出します。
e. メッセージ処理サブシステムのPDU送信プリミティブを使用して通知を転送します。
-
送信通知がinformリクエストの場合:
- 各ターゲットからの応答を待ちます。
- 受信通知もinformであった場合、応答を集約します。
- すべて(または構成されたサブセット)のターゲットから応答を受信した後にのみ、元の通知オリジネータに応答を返します。
変換例
例1:SNMPv3からSNMPv1へのリクエスト変換
受信リクエスト:
- contextEngineID: 0x80001F8880
- contextName: "publicView"
- securityModel: 3 (USM)
- securityName: "admin"
- securityLevel: authPriv
- PDU: GetRequest
snmpProxyTableエントリ:
- snmpProxyType: read(1)
- snmpProxyContextEngineID: 0x80001F8880
- snmpProxyContextName: "publicView"
- snmpProxyTargetParamsIn: "snmpv3Params"
- snmpProxySingleTargetOut: "legacyDevice"
snmpTargetAddrTableエントリ(legacyDevice):
- snmpTargetAddrTDomain: snmpUDPDomain
- snmpTargetAddrTAddress: 192.0.2.10:161
- snmpTargetAddrParams: "snmpv1Params"
snmpTargetParamsTableエントリ(snmpv1Params):
- snmpTargetParamsMPModel: 0 (SNMPv1)
- snmpTargetParamsSecurityModel: 1 (SNMPv1)
- snmpTargetParamsSecurityName: "public"
- snmpTargetParamsSecurityLevel: noAuthNoPriv
送信リクエスト:
- トランスポート: 192.0.2.10:161へのUDP
- SNMPバージョン: SNMPv1
- コミュニティ: "public"
- PDU: GetRequest(同じ変数バインディング)
応答変換:
- 受信SNMPv1応答はSNMPv3形式に変換されます。
- 応答はUSMを使用して暗号化および認証されます。
- 元のリクエスタに返送されます。
例2:SNMPv1 TrapからSNMPv2 Trapへの変換
受信SNMPv1 Trap:
- コミュニティ: "public"
- enterprise: 1.3.6.1.4.1.9
- agent-addr: 192.0.2.1
- generic-trap: linkDown(2)
- specific-trap: 0
- time-stamp: 12345
snmpProxyTableエントリ:
- snmpProxyType: trap(3)
- snmpProxyContextEngineID: ""(任意に一致)
- snmpProxyContextName: ""(任意に一致)
- snmpProxyTargetParamsIn: ""(任意に一致)
- snmpProxyMultipleTargetOut: "snmpv2Targets"
タグ「snmpv2Targets」を持つsnmpTargetAddrTableエントリ: SNMPv2cまたはSNMPv3パラメータを持つ複数のエントリ。
送信SNMPv2/v3 Traps:
- snmpTrapOID.0: 1.3.6.1.6.3.1.1.5.3 (linkDown)
- sysUpTime.0: 12345
- 元のtrapからの追加の変数バインディング。
特別な考慮事項
コンテキスト変換
snmpProxyTableはコンテキスト変換を許可します:
- テーブルエントリ内の空のsnmpProxyContextEngineIDまたはsnmpProxyContextNameは、「受信値を使用する」ことを意味します。
- 空でない値は、「受信コンテキストをこの送信コンテキストにマッピングする」ことを意味します。
これにより、プロキシは複数の受信コンテキストを単一の送信コンテキストにマッピングしたり、その逆を行ったりできます。
セキュリティダウングレードの防止
より高いセキュリティレベルからより低いセキュリティレベルに変換する場合(SNMPv3 authPrivからSNMPv1 noAuthNoPrivなど)、プロキシは次のことを行う必要があります:
- セキュリティダウングレードを記録して監査目的で保管します。
- 追加のアクセス制御を適用して、ダウングレード可能な操作を制限します。
- トランスポートの暗号化を検討(IPsecやTLSを使用など)して、SNMPレイヤーのセキュリティの低下を補償します。
エラー処理
プロキシはエラーを慎重に処理する必要があります:
- 変換エラー: PDUを変換できない場合(SNMPv1のSNMPv2例外値など)、適切なエラーを返します。
- 転送エラー: ターゲットに到達できない場合、元のリクエスタにタイムアウトまたはネットワークエラーを返します。
- 応答変換エラー: 応答を変換できない場合、エラーを記録し、元のリクエスタにgenErrを返します。
パフォーマンスの最適化
プロキシ転送は、次の方法で最適化できます:
- テーブルルックアップのキャッシュ: 頻繁に使用されるパスのsnmpProxyTable、snmpTargetAddrTable、およびsnmpTargetParamsTableルックアップをキャッシュします。
- ルールの事前コンパイル: 構成時にテーブルエントリを最適化された内部形式に変換します。
- 接続プーリング: TCPベースのトランスポートの場合、頻繁にアクセスされるターゲットへの永続的な接続を維持します。