ICAPを使用したリモートコンテンツ検査またはコンテンツ変換サービス

最終公開日 : Oct 02, 2026
インターネットコンテンツ適応プロトコル (ICAP) は、HTTPメッセージで付加価値変換サービスを実行するためのシンプルで軽量なプロトコルです。一般的なシナリオでは、ICAPクライアントはHTTPリクエストとレスポンスを1つ以上のICAPサーバーに転送して処理します。ICAPサーバーはリクエストに対してコンテンツ変換を実行し、リクエストまたはレスポンスに対して適切なアクションを実行するレスポンスを返します。
NetScalerのセットアップでは、NetScalerはアンチマルウェアやデータ損失防止 (DLP) などのサードパーティICAPサーバーと相互運用するICAPクライアントとして機能します。NetScalerが受信ウェブトラフィックを受信すると、トラフィックを傍受し、コンテンツ検査ポリシーを使用してHTTPリクエストがICAP処理を必要とするかどうかを評価します。必要であれば、NetScalerはメッセージを復号化し、プレーンテキストとしてICAPサーバーに送信します。ICAPサーバーはリクエストメッセージに対してコンテンツ変換サービスを実行し、NetScalerに応答を返します。変更されたメッセージは、HTTPリクエストまたはHTTPレスポンスのいずれかです。NetScalerが複数のICAPサーバーと相互運用する場合、NetScalerはICAPサーバーの負荷分散を実行します。このセットアップは、1つのICAPサーバーではすべてのトラフィック負荷を処理するのに十分でない場合に役立ちます。ICAPサーバーが変更されたメッセージを返した後、NetScalerは変更されたメッセージをバックエンドのオリジンサーバーに転送します。
NetScalerは、受信トラフィックがHTTPSタイプの場合、セキュアなICAPサービスも提供します。NetScalerはSSLベースのTCPサービスを使用して、NetScalerとICAPサーバー間のセキュアな接続を確立します。
Kubernetes環境では、NetScaler Ingress Controllerを介してNetScalerでICAPを有効にするために、NetScalerはICAPカスタムリソース定義 (CRD) を提供します。ICAPを有効にすることで、次のアクションを実行できます。
  • 指定された文字列を含むURLをブロックする
  • DDoS攻撃を軽減するために一連のIPアドレスをブロックする
  • HTTPからHTTPSへの強制
KubernetesクラスターにICAP CRDをデプロイした後、ICAP CRD属性を使用してICAPポリシーを定義し、NetScalerの統計情報のために監査ログを有効にすることができます。NetScalerが提供するICAP機能の詳細については、リモートコンテンツ検査のためのICAPを参照してください。
ICAPポリシーは、大きくリクエスト変更ポリシーとレスポンス変更ポリシーに分類できます。
リクエスト変更: リクエスト変更 (REQMOD) モードでは、NetScalerはクライアントから受信したHTTPリクエストをICAPサーバーに転送します。リクエスト変更CRDリソースの例については、サンプルポリシー構成を参照してください。
レスポンス変更: レスポンス変更 (RESPMOD) モードでは、NetScalerはHTTPレスポンスをICAPサーバーに送信します (NetScalerが送信するレスポンスは通常、オリジンサーバーが送信するレスポンスです)。レスポンス変更CRDリソースの例については、サンプルポリシー構成を参照してください。
リクエストおよびレスポンス変更ポリシーの詳細については、リモートコンテンツ検査のためのICAPを参照してください。

NetScaler® ICAP CRDのデプロイ

NetScaler ICAP CRDデプロイYAMLファイルは、GitHubの次の場所にあります: icap-crd-deployment.yaml。
注記:
デプロイメントYAMLファイルを変更しないようにしてください。
次のコマンドを使用してICAP CRDを展開します。
kubectl create -f icap-crd-deployment.yaml
例:
root@master:~# kubectl create -f icap-crd-deployment.yaml
customresourcedefinition.apiextensions.k8s.io/icap-crd.citrix.com created

ICAP CRD属性

ICAP CRD は、コンテンツ検査を有効にし、ICAPポリシーを定義するために必要なさまざまなオプションを設定するための属性を提供します。これらのCRD属性は、それぞれ NetScaler コマンドと属性に対応しています。
次の表に、ICAPポリシーを定義するために使用できる CRD 属性を示します。また、この表には対応するNetScalerコマンドと属性も記載されています。

ICAPサーバーの追加

ICAP CRD仕様の icap-servers オブジェクトの下にICAPサーバーを指定できます。要件に基づいて、1つまたは複数のICAPサーバーを指定できます。
CRD属性 NetScalerコマンド NetScaler属性 説明
ip (必須) add service <name> <IP> <serviceType> <port> IP ICAPサーバーのIPアドレス
ポート (必須) add service <name> <IP> <serviceType> <port> ポート ICAPサーバーが通信するポート
サーバータイプ (必須) add service <name> <IP> <serviceType> <port> serviceType ICAPサーバーのタイプ。指定可能な値はTCPとSSL_TCPです。

バックエンドサービスとイングレスクラスの指定

次の設定を行うには、Servicesとingressclass属性を指定します。
  • ICAPポリシーを有効にする必要があるバックエンドサービスを指定します。
  • イングレスコントローラーによって処理される必要があるICAPリソースを指定します。
CRD属性 NetScalerコマンド 説明
Services (必須) NA ICAPポリシーを有効にする必要があるバックエンドサービスを一覧表示します。
ingressclass (必須) NA 指定されたイングレスクラスに関連付けられたイングレスコントローラーのみがリソースを処理するように、イングレスクラスを指定します。そうでない場合、クラスター内のすべてのコントローラーがこのCRDリソースを処理します。

ICAPプロファイルの追加

NetScaler の ICAP 設定は、ICAP プロファイルと呼ばれるエンティティで指定されます。このプロファイルには、ICAP 設定のコレクションが含まれています。設定には、ICAP リクエストを動的に生成し、ICAP レスポンスを受信し、コンテンツ検査データをログに記録するためのパラメータが含まれます。
CRD属性 NetScalerコマンド NetScaler属性 説明
preconfigured-profile (オプション) NA NA 事前設定されたICAPプロファイルの名前。
direction (必須) add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) Mode ICAPの動作モード。可能な値はREQUESTとRESPONSEです。
uri (必須) add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) URI ICAPサービスを表すURI。
プレビュー add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -preview ( ENABLED \| DISABLED )] プレビュー ICAPリクエストでプレビューヘッダーを有効または無効にします。この機能により、ICAPサーバーはトランザクションの開始部分を確認できます。その後、リクエストメッセージの残りの部分を受信する代わりに、早期にトランザクションからオプトアウトするかどうかを決定できます。
プレビュー長 add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -previewLength <positive_integer> previewLength Preview Headerフィールドの値。NetScalerは、この設定値とOPTIONSで受信したプレビューサイズのうち、小さい方の値を使用します。
ホストヘッダー add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -hostHeader <string> hostHeader ICAPホストヘッダー。
ユーザーエージェントヘッダー add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -userAgent <string> userAgent ICAPユーザーエージェントヘッダー。
クエリパラメータ add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -queryParams <string> queryParams ICAPリクエストURIに含めるクエリパラメータ。入力値はarg=value形式である必要があります。複数のパラメータがある場合は、パラメータ間に&を追加します。例: arg1=val1&arg2=val2。
コネクションキープアライブ add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -connectionKeepAlive ( ENABLED \| DISABLED ) connectionKeepAlive ICAPリクエストでAllow: 204ヘッダーの送信を有効または無効にします。
ICAPヘッダーの挿入 add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -insertICAPHeaders <string> insertICAPHeaders ICAPサーバーに送信するICAPリクエストにカスタムICAPヘッダーを挿入します。ヘッダーは静的でも、PIポリシー式を使用して動的に構築することもできます。たとえば、静的なユーザーエージェントとクライアントのIPアドレスを送信するには、式を"User-Agent: NS-ICAP-Client/V1.0r0-Client-IP: "+CLIENT.IP.SRC+"r0として指定できます。NetScalerは、指定されたヘッダー名と値の有効性をチェックしません。指定されたヘッダー構文を手動で検証する必要があります。
HTTPリクエストの挿入 add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -insertHTTPRequest <string> insertHTTPRequest NetScalerがカプセル化してICAPサーバーに送信する、式形式の正確なHTTPリクエスト。このパラメーターを設定すると、ICAPリクエストはこのヘッダーのみを使用して送信されます。この属性は、HTTPヘッダーを送信できない場合や、ICAPサーバーが受信HTTPリクエストの一部のみを必要とする場合に使用できます。NetScalerはこのリクエストの有効性をチェックしません。リクエストを手動で検証する必要があります。
リクエストタイムアウト add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -reqTimeout <positive_integer> reqTimeout リモートサーバーがICAPリクエストに応答するまでの時間(秒単位)。NetScalerがこの時間内に完全な応答を受信しない場合、指定されたリクエストタイムアウトアクションが実行されます。値がゼロに設定されている場合、この機能は無効になります。
リクエストタイムアウトアクション add ns icapProfile <name> -uri <string> -Mode ( REQMOD \| RESPMOD ) -reqTimeoutAction <reqTimeoutAction> reqTimeoutAction 設定されたタイムアウト値内にリモートサービスを表す仮想サーバーが応答しない場合に実行するアクション。サポートされているアクションは次のとおりです。BYPASS - リモートサーバーの応答を無視し、リクエスト/応答をクライアント/サーバーに送信します。カプセル化されたヘッダーを含むICAP応答が設定されたリクエストタイムアウト値内に受信されない場合、このオプションはリモートICAPサーバーの応答を無視し、完全なリクエスト/応答をサーバー/クライアントに送信します。DROP - ユーザーに応答を送信せずにリクエストを破棄します。RESET - クライアント接続を閉じてリセットします。クライアントは必要に応じてリクエストを再送信できます。

コンテンツ検査ポリシーとアクション

コンテンツ検査機能を有効にした後、ICAPリクエスト情報を処理するためのICAPアクションを追加する必要があります。作成されたICAPプロファイルとサービス、またはロードバランシング仮想サーバーは、ICAPアクションにバインドされます。
CRD 属性 NetScaler コマンド NetScaler 属性 説明
コンテンツ検査基準 add contentInspection policy <name> -rule <expression> -action <string> ルール ポリシーが指定されたアクションを実行するかどうかを決定するために使用する式。
デフォルトアクション add contentInspection action <name> -type ICAP -serverName <string> -icapProfileName <string> -ifserverdown <if-server-down> undefAction ポリシー評価の結果が未定義 (UNDEF) の場合に実行するアクション。UNDEF イベントは内部エラー状態を示します。これより前の組み込みアクションのみを使用できます。
ログアクション add contentinspection policy <name> -rule <expression> -action <string> -logAction <string> logAction このポリシーに一致するリクエストに使用するメッセージログアクションの名前。
操作 add ContentInspection action <name> -type ICAP -serverip <ip> - serverport <port> -icapProfileName <string> タイプ このICAPアクションが実行する操作のタイプ。設定可能なアクションは次のとおりです。 ICAP - 受信リクエストまたは応答をICAPサーバーに転送して変更します。 INLINEINSPECTION - 受信または送信パケットをIPSサーバーに転送して侵入防止を行います。 MIRROR - クローンされたパケットを転送して侵入検知を行います。 NOINSPECTION - 受信および送信パケットを検査デバイスに転送しません。 NSTRACE - このトランザクションで現在およびそれ以降の受信パケットをキャプチャします。
サーバー障害時のアクション add contentInspection action <name> -type ICAP -serverName <string> -icapProfileName <string> -ifserverdown <> サーバーダウン時 リモートサービスを表す仮想サーバーが稼働していない場合に実行するアクション。サポートされているアクションは次のとおりです。 RESET - クライアント接続を閉じてリセットします。ブラウザなどのクライアントプログラムがこのアクションを処理し、ユーザーに通知する場合があります。クライアントは必要に応じてリクエストを再送信できます。 DROP - ユーザーに応答を送信せずにリクエストを破棄します。 CONTINUE - コンテンツ検査をバイパスし、クライアントまたはサーバーへのトラフィックフローを再開します。

Goto優先度式

次の表は、ポリシーのグループをサービスにバインドするためのCRD属性であるgoto-priority-expression属性に関する情報を提供します。
CRD属性 NetScalerコマンド NetScaler属性 サポートされている値 デフォルト値
ゴートゥー・プライオリティ・エクスプレッション lb vserverをバインド gotoPriorityExpression NEXT と END End

ポリシー構成の記述方法

NetScalerが提供するICAP CRD仕様をKubernetesクラスターにデプロイした後、.yaml ファイルでポリシー構成を定義できます。.yaml ファイルでは、kind フィールドで icappolicy を使用し、要件に基づいてポリシー構成の属性に値を指定します。必須およびオプションのパラメーターとその説明については、前のセクションを参照してください。
.yaml ファイルをデプロイすると、NetScaler Ingress ControllerはNetScalerにポリシー構成を適用します。

ポリシー構成のガイドライン

  • CRDがnamespace に関連付けられている場合、デフォルトでは、ポリシーはその名前空間に関連付けられているサービスに適用されます。たとえば、複数の名前空間に同じサービス名が関連付けられている場合、ポリシーはCRDに関連付けられている名前空間に属するサービスに適用されます。
  • 単一の .yaml ファイルで複数のポリシーを定義している場合、ファイル内で最初に定義されたポリシー構成が優先され、その後のポリシー構成はシーケンスに従って適用されます。異なるファイルで複数のポリシーを定義している場合、最初にデプロイしたファイルで定義された最初のポリシー構成が優先されます。

Goto-priority-expression の使用に関するガイドライン

  • ICAPポリシーは、goto-priority-expression フィールド内で NEXT キーワードを使用することで、複数のグループとして組み合わせることができます。
  • 現在のポリシー内で goto-priority-expression フィールドが NEXT であり、現在のポリシーが True と評価される場合、グループ内の次のポリシーが実行されます。このプロセスは、goto-priority-expression フィールドが END に設定されているポリシーが見つかるまで、後続のポリシーで継続されます。
  • 現在のポリシーがFALSEと評価される場合、ポリシーの実行は現在のポリシーで停止するため、goto-priority-expressionは影響しません。
  • ICAPポリシー内のICAPポリシーグループは、NEXTとしてgoto-priority-expressionが割り当てられたポリシーから始まり、goto-priority-expressionフィールドにENDが割り当てられるまですべての連続するポリシーを含みます。
  • goto-priority-expressionを使用してICAPポリシーをグループ化する場合、グループ内のポリシーにバインドされているサービス名は同じである必要があります。
  • ICAP内の最後のポリシーは、常にgoto-priority-expressionをENDとして持つ必要があります。
  • ポリシーに対してgoto-priority-expressionフィールドが指定されていない場合、ENDのデフォルト値がgoto-priority-expressionに割り当てられます。

ICAPポリシーの作成と検証

文字列exampleを含むマイクロサービスへのすべての受信URLをドロップするためにNetScalerでポリシーを定義したいシナリオを考えます。exampleicappolicy.yamlという名前の.yamlファイルを作成し、適切なCRD属性を使用してICAPポリシーを次のように定義します。
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
  name: exampleicappolicy
spec:
  ingressclass: "cic-vpx"
  services:
    - "frontend"
  icap-servers:
    servers:
      - ip: "192.168.1.1"
        port: 1344
    server-type: "TCP"
  icap:
  - direction: "REQUEST"
    profile:
      preview: "ENABLED"
      preview-length: 1024
      uri: "http://icap.example.com/reqmod"
      host-header: "icap.example.com"
      user-agent-header: "testAgent"
      query-params: "arg1=val1&arg2=val2"
      connection-keep-alive: "ENABLED"
      req-timeout: 30
      req-timeout-action: "BYPASS"
    content-inspection-criteria: "HTTP.REQ.URL.CONTAINS(\"example\")"
    default-action: "DROP"
    goto-priority-expression: "END"
    operation: "ICAP"
    server-failure-action: "CONTINUE"
コマンドkubectl create -f exampleicappolicy.yamlを実行して.yamlファイルをデプロイした後、NetScaler Ingress ControllerはNetScalerにポリシー構成を適用します。
Kubernetesクラスターのマスターノードで、次のコマンドを実行して適用されたICAPポリシーCRDのステータスを確認できます。
kubectl get icappolicies.citrix.com exampleicappolicy
次のコマンドを実行してステータスを表示できます。
kubectl get icappolicies.citrix.com exampleicappolicy
NAME               STATUS    MESSAGE
exampleicappolicy   Success   CRD Activated
CRDの作成または適用中に問題がある場合、イングレスコントローラーのログを使用してデバッグできます。
kubectl logs <nsic pod name>
また、次の手順を使用して、構成がNetScalerに適用されているかどうかを確認できます。
  1. NetScaler CLIにログインします。
  2. 構成がNetScalerに適用されているかどうかを確認するには、次のコマンドを使用します。
show ns icapProfile | grep exampleicappolicy
show icapProfile <icapProfile-name>
show run | grep -i icap
ICAP

ポリシー設定の例

応答モードでのICAPポリシー

この例では、ICAPポリシーが応答トラフィックに適用されます。つまり、ポリシーはICAPサーバーからNetScalerに送信される応答を検査し、場合によっては変更します。
kubectl apply -f - <<EOF
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
  name: exampleicappolicy
spec:
  ingressclass: "cic-vpx"
  services:
    - "frontend"
  icap-servers:
    servers:
      - ip: "192.168.1.1"
        port: 1344
    server-type: "TCP"
  icap:
  - direction: "RESPONSE"
    profile:
      preview: "ENABLED"
      preview-length: 1024
      uri: "http://icap.example.com"
      user-agent-header: "testAgent"
      query-params: "arg1=val1&arg2=val2"
      connection-keep-alive: "ENABLED"
      req-timeout: 30
      req-timeout-action: "BYPASS"
    content-inspection-criteria:  "HTTP.RES.HEADER(\"Location\").CONTAINS(\"example\")"
    default-action: "DROP"
    goto-priority-expression: "END"
    operation: "ICAP"
    server-failure-action: "CONTINUE"
EOF

複数のICAPサーバーのパイプライン処理

この例では、リクエストの処理に複数のICAPサーバーを使用します。
kubectl apply -f - <<EOF
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
  name: exampleicappolicy
spec:
  ingressclass: "cic-vpx"
  services:
    - "frontend"
  icap-servers:
    servers:
      - ip: "192.168.1.1"
        port: 1344
      - ip: "192.168.1.2"
        port: 1344
      - ip: "192.168.1.3"
        port: 1344
    server-type: "TCP"
  icap:
  - direction: "RESPONSE"
    profile:
      preview: "ENABLED"
      preview-length: 1024
      uri: "http://icap.example.com"
      user-agent-header: "testAgent"
      query-params: "arg1=val1&arg2=val2"
      connection-keep-alive: "ENABLED"
      req-timeout: 30
      req-timeout-action: "BYPASS"
    content-inspection-criteria:  "HTTP.RES.HEADER(\"Location\").CONTAINS(\"example\")"
    default-action: "DROP"
    goto-priority-expression: "END"
    operation: "ICAP"
    server-failure-action: "CONTINUE"
EOF

複数のポリシー設定

単一の.yamlファイルに複数のポリシー設定を追加し、それらのポリシーをNetScalerに適用できます。ここに示されている例のように、各ポリシー設定に対して個別のセクションを追加する必要があります。
kubectl apply -f - <<EOF
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
  name: exampleicappolicy1
spec:
  ingressclass: "cic-vpx"
  services:
    - "frontend"
  icap-servers:
    servers:
      - ip: "192.168.1.1"
        port: 1344
    server-type: "TCP"
  icap:
    - direction: "RESPONSE"
      profile:
        preview: "ENABLED"
        preview-length: 1024
        uri: "http://icap.example.com"
        user-agent-header: "testAgent"
        query-params: "arg1=val1&arg2=val2"
        connection-keep-alive: "ENABLED"
        req-timeout: 30
        req-timeout-action: "BYPASS"
      content-inspection-criteria: "HTTP.RES.HEADER(\"Location\").CONTAINS(\"example\")"
      default-action: "DROP"
      goto-priority-expression: "NEXT"
      operation: "ICAP"
      server-failure-action: "CONTINUE"
---
apiVersion: citrix.com/v1beta1
kind: icappolicy
metadata:
  name: exampleicappolicy2
spec:
  ingressclass: "cic-vpx"
  services:
    - "frontend"
  icap-servers:
    servers:
      - ip: "192.168.1.1"
        port: 1344
    server-type: "TCP"
  icap:
    - direction: "RESPONSE"
      profile:
        preview: "ENABLED"
        preview-length: 1024
        uri: "http://icap.example.com"
        user-agent-header: "testAgent"
        query-params: "arg1=val1&arg2=val2"
        connection-keep-alive: "ENABLED"
        req-timeout: 30
        req-timeout-action: "BYPASS"
      content-inspection-criteria: "HTTP.RES.HEADER(\"Location\").CONTAINS(\"sample\")"
      default-action: "DROP"
      goto-priority-expression: "END"
      operation: "ICAP"
      server-failure-action: "CONTINUE"
EOF