はじめに
このドキュメントでは、Wiresharkを使用してSecure Web Appliance(SWA)からキャプチャされたパケットを分析する方法について説明します。
前提条件
要件
次の項目に関する知識が推奨されます。
- Cisco SWAの管理
-
明示的および透過的なプロキシ導入方式
- パケット キャプチャ
使用するコンポーネント
このドキュメントの内容は、特定のソフトウェアやハードウェアのバージョンに限定されるものではありません。
このドキュメントの情報は、特定のラボ環境にあるデバイスに基づいて作成されました。このドキュメントで使用するすべてのデバイスは、クリアな(デフォルト)設定で作業を開始しています。本稼働中のネットワークでは、各コマンドによって起こる可能性がある影響を十分確認してください。
背景説明
シスコテクニカルサポートに連絡すると、SWAの発信および着信ネットワークアクティビティの詳細を提供するよう求められます。このアクティビティは、デバッグまたは検証の目的でトラフィックを収集するためにパケットキャプチャを実行することで監視できます。
明示的なプロキシ導入
明示的プロキシでは、クライアントがトラフィックをプロキシサーバに直接送信するように設定する必要があります。多くの場合、ネットワーク設定(PACファイルまたはDHCPオプション)またはブラウザ設定の特定のプロキシ設定を使用します。これにより、プロキシサーバは宛先に転送する前に要求を管理およびフィルタできます。
注:明示的な展開では、クライアントマシンから発信されるパケットの宛先IPアドレスは、プロキシサーバのIPアドレスになります。
明示的なプロキシ導入を使用する際のネットワークの論理フローを次に示します。
明示的なプロキシパケットフロー
透過的なプロキシ導入
トランスペアレントプロキシは、クライアント側の設定変更を必要とせずにネットワークトラフィックを代行受信します。トラフィックはプロキシサーバに自動的にリダイレクトされ、クライアントが明示的に認識しなくても要求をフィルタリングおよびモニタできます。
注:透過型導入では、クライアントマシンから送出されるパケットの宛先IPアドレスは、宛先サーバのIPアドレスです。
透過型プロキシ導入を使用する際のネットワークの論理フローを次に示します。
透過的なプロキシパケットフロー
SWAの透過的パケットフローについては、「Secure Web Applianceのパケットフローについて」を参照してください。
AsyncOS バージョン 7.x 以降でのパケット キャプチャ
グラフィカルユーザインターフェイス(GUI)からパケットキャプチャを開始するには、右上のヘルプとサポートメニューに移動し、Packet Captureを選択して、Start Captureをクリックします。パケット キャプチャ プロセスを停止するには、[Stop Capture] をクリックします。
注:GUIで開始されたキャプチャは、SWA GUIセッションの期限が切れた後やログアウトした後でも、セッション間で保存されたままになります。
コマンドラインインターフェイス(CLI)からパケットキャプチャを開始するには、Packetcapture > Startコマンドを入力します。パケットキャプチャプロセスを停止するには、Packetcapture > Stopコマンドを入力します。これにより、セッション終了時にSWAがパケットキャプチャを停止します。
SWAパケットキャプチャの設定ガイド
SWAでのパケットキャプチャの実行方法の詳細については、
コンテンツセキュリティアプライアンスでのパケットキャプチャの設定
SWAユーザガイド:パケットキャプチャセクション
SWAのパケットキャプチャフィルタ
SWA GUIおよびCLI(Packetcapture コマンド)からのデフォルトキャプチャでは、標準のtcpdumpフィルタ構文を使用します。このセクションでは、tcpdump キャプチャ ファイルについて説明するとともに、例をいくつか紹介します。
最もよく使用されるフィルタの一部を次に示します。
- ip:すべてのIPプロトコルトラフィックのフィルタ。
- tcp:すべてのTCPプロトコルトラフィックのフィルタ。
- ホスト:特定のIPアドレス送信元または宛先のフィルタ。
tcpdumpでよく使用される2つの論理条件があります。
- and:指定されたすべての条件が満たされた場合にのみパケットをキャプチャします(&&を使用)。
- Or:少なくとも1つの条件が満たされた場合にパケットをキャプチャします(
||を使用)。
注:これらの論理条件では、大文字と小文字が区別されます。
透過的または明示的な展開でIPアドレスによってパケットを収集するSWAのフィルタ例を次に示します。
送信元IP:192.168.1.1
宛先IP:10.20.3.15
host 192.168.1.1 || host 10.20.3.15
このフィルタは、10.20.3.15とSWAの間のトラフィックと、SWAと192.168.1.1の間のトラフィックをキャプチャします。
ヒント:フィルタにSWAのIPアドレスを追加する必要はありません。
トラブルシュート
クライアントがWebサイトにアクセスしようとすると、コミュニケーションプロセス全体が2つの部分に分かれます。
- クライアントはSWAと通信します。
- 宛先サーバと通信するSWA。
ヒント:パケットをキャプチャする前に、SWAへのパスでクライアントのIPアドレスが変更されていないことを確認してください。IPアドレスの変更は、トラフィックがSWAに到達する前に設定されたネットワークアドレス変換(NAT)ルール、またはSWAとクライアントマシン間にダウンストリームプロキシが存在するために発生します。
Wiresharkフィルタを使用して明示的接続を分析する
明示的接続のためのWiresharkフィルタ
パケットキャプチャの通信の最初のフェーズ:送信元IPはクライアントIPアドレスで、宛先IPアドレスはSWA IP(SWAの着信インターフェイスは通常P1インターフェイス)です。
Wiresharkでは、次のフィルタを使用できます。
クライアントIPによるフィルタリング:
ip.addr ==
通信の2番目のフェーズでは、送信元IPはSWA IPアドレス(外部インターフェイスは通常P2インターフェイス)で、宛先IPアドレスはWebサーバのIPアドレスです。
サーバIPでフィルタリングします。
ip.addr ==
明示的導入では、クライアントは要求をHTTP Connectとしてプロキシに送信し、HTTP Connect:
http.request.method == "CONNECT"
HTTP要求メソッドによるフィルタ:
http.request.method==GET
または
http.request.uri contains ""
Client HelloをフィルタリングするHTTPS要求:
ssl.handshake.type==1
両側の通信を確認する場合は、TCPストリームフィルタを使用するのが最適な方法です。
ヒント:TCPストリーム番号を確認するには、現在のフィルタ内の任意のパケットを右クリックするか、目的のパケットを右クリックし、Follow、choose TCP Streamを選択します。フィルタバーにTCPストリーム番号が表示されます。
第1フェーズと第2フェーズの両方のTCPストリーム番号を切り分けるには、フィルタを使用します。
tcp.stream eq || tcp.stream eq
<first_phase_stream_number>と<second_phase_stream_number>を適切なストリーム番号に置き換えます。
Wiresharkフィルタを使用した透過接続の分析
Web Cache Communication Protocol(WCCP)リダイレクションまたはPolicy-Based Routing(PBR)を含む透過的な要求では、クライアントトラフィックがSWAに送信される一方で、SWAは自身のIPアドレスではなく、宛先サーバのIPアドレスで応答します。その結果、透過的な要求では、パケットキャプチャは宛先サーバのIPアドレスを表示しますが、宛先MACアドレス(クライアントからSWAへのトラフィック内)としてSWA MACアドレスを使用し、IPスプーフィングが有効でない場合はSWAから送信されるパケットを使用します。送信元IPは、SWA MACアドレスを持つクライアントIPアドレスです。
透過的な接続のためのWiresharkフィルタ
透過的な要求の場合と同様に、Wiresharkは明示的な接続と同じようにフィルタリングしますが、SWAは実際のIPアドレスではなくスプーフィングされて自身を実際の宛先サーバとして使用してクライアントと通信できないことに注意してください。
クライアントIPによるフィルタリング:
ip.addr ==
サーバIPでフィルタリングします。
ip.addr ==
注意: SWAでIPスプーフィングが有効になっていない場合、SWAからWebサーバへのパケットの送信元IPアドレスはクライアントIPアドレスになります。
HTTP要求メソッドによるフィルタ:
http.request.method==GET
または
http.request.uri contains ""
Client HelloをフィルタリングするHTTPS要求:
ssl.handshake.type==1
両側の通信を確認する場合は、TCPストリームフィルタを使用するのが最適な方法です。
ヒント:TCPストリーム番号を確認するには、現在のフィルタにある任意のパケットを右クリックするか、目的のパケットを右クリックし、Followを選択して、TCP Streamを選択します。フィルタバーにTCPストリーム番号が表示されます
第1フェーズと第2フェーズの両方のTCPストリーム番号を切り分けるには、フィルタを使用します。
tcp.stream eq || tcp.stream eq
<first_phase_stream_number>と<second_phase_stream_number>を適切なストリーム番号に置き換えます。
Wiresharkフィルタは、明示的な接続に似ています。
クライアントWeb要求が明示的または透過的な接続であることを確認する方法
明示的要求では、クライアントはプロキシサーバを認識しながらURLにアクセスするため、クライアントはプロキシIPアドレスとプロキシポートにHTTP Connect要求を送信します。
デフォルトでは、SWAはプロキシサービスに対してTCPポート3128および80をリッスンします。明示的導入パケットキャプチャでは、クライアントとSWAの間のトラフィックがこれらのプロキシポート番号宛てであることを確認できます。
透過的な要求では、クライアントはプロキシIPを認識せずにURLにアクセスし、SWAは自身のIPアドレスを使用して通信しません。代わりに、SWAは宛先サーバのIPアドレスをスプーフィングしました。
トランスペアレントモードでは、トラフィックはクライアントと宛先サーバ(たとえば、シスコのWebサイト)の間を流れているように見えますが、宛先サーバのMACアドレスはSWAのMACアドレスです。SWAのMACアドレスを確認するには、CLIコマンドetherconfig > MEDIAを使用します。
Wiresharkビューの変更
プロキシを使用してWeb要求のトラブルシューティングを行う際にWiresharkのパケットの概要を把握するには、パケットビューにサーバ名表示(SNI)とTCPストリームIDを表示するのが最適です。
WiresharkビューへのSNIカラムの追加
ステップ 1:Wiresharkでパケットキャプチャファイルを開きます。
ステップ 2:Wiresharkで列名を右クリックします。
ステップ 3:Column Preferencesを選択します。
ステップ 4:+(新しい列の追加)記号をクリックします。
ステップ 5:その列の名前を入力します(SNIなど)。
手順 6:TypeセクションでCustomを選択します。
手順 7:フィールドセクションに、tls.handshake.extensions_server_nameと入力します。
ステップ 8: OKをクリックして変更を保存します。
または、次の手順を使用できます。
ステップ 1:Wireshark:ssl.handshake.type==1にフィルタを適用して、SSL/TLSハンドシェイクのClient Helloメッセージを分離します。
ステップ 2:プロトコルの詳細の展開:Transport Layer Security > Expand Handshake Protocol: Client Hello > Expand Extension: Server name > Expand Server Name Indication Extension(SNI)の順にクリックします。
ステップ 3:サーバー名を列として追加します。サーバ名(または特定のサーバ名)を右クリックし、Apply as Columnを選択します。
Wiresharkビューへのストリーム番号列の追加
ステップ 1:Wiresharkでパケットキャプチャファイルを開きます。
ステップ 2:Wiresharkで列名を右クリックします。
ステップ 3:Column Preferencesを選択します。
ステップ 4:+記号(新しい列の追加)をクリックします。
ステップ 5:その列の名前を入力します(Streamなど)。
手順 6:TypeセクションでCustomを選択します。
手順 7:Fieldセクションに、tcp.streamと入力します。
ステップ 8: OKをクリックして変更を保存します。
または、次の手順を使用できます。
ステップ 1:HTTP/TCPパケットの特定:HTTP/TCPプロトコルを含むパケットが表示されていることを確認します。
ステップ 2:パケットを選択またはクリックし、左下のペインでTransmission Control Protocol(TCP)を1つ選択またはクリックします。下にスクロールして(Stream Index:Number)を取得します。
ステップ 3:Stream Index:番号を右クリックして、カラムとして適用します。
関連情報