FortiGate のキャプチャを Wireshark で解析|fgt2eth 変換の手順

  • URLをコピーしました!
目次

はじめに

FortiGate のトラブルシュートでは、実際に流れているパケットを確認したい場面があります。FortiGate には、CLI の組み込みパケットスニファ(diagnose sniffer packet)と、GUI のパケットキャプチャという 2 つの取得方法があります。ただし、CLI スニファの出力はテキスト形式であり、そのままでは Wireshark で開ける pcap 形式ではありません。Wireshark で解析するには、出力を pcap に変換する手順(fgt2eth)が必要になります。

本記事では、FortiGate でパケットキャプチャを取得し、Wireshark で解析できる形にするまでの手順を、CLI と GUI の両方の方法で整理します。

この記事でわかること
  • FortiGate でのキャプチャ取得の 2 つの方法(CLI スニファと GUI パケットキャプチャ)と使い分け
  • diagnose sniffer packet の構文と verbose レベルの選び方
  • CLI スニファの出力を fgt2eth で pcap に変換する手順
  • GUI パケットキャプチャで pcap を直接取得する手順
  • Wireshark に取り込んだ後の解析の進め方

結論を先に整理すると、取得方法は 2 つです。1 つは CLI で diagnose sniffer packet を実行し、出力をログ保存して fgt2eth で pcap に変換する方法。もう 1 つは GUI のパケットキャプチャで pcap を直接ダウンロードする方法です。いずれの方法でも、Wireshark に取り込んだ後はディスプレイフィルタで目的の通信を絞り込んで解析します。

FortiGate でのキャプチャ取得の 2 つの方法(CLI と GUI)

まず、2 つの方法の特徴と使い分けを整理します。

方法特徴pcap への変換
CLI スニファ(diagnose sniffer packet)SSH 越しに利用でき、フィルタを細かく制御できる必要(fgt2eth で変換)
GUI パケットキャプチャ画面操作で取得でき、pcap を直接ダウンロードできる不要

手軽さを重視し、GUI にアクセスできる環境であれば、pcap を直接取得できる GUI パケットキャプチャが便利です。一方、CLI しか使えない環境や、フィルタを細かく制御したい場合、作業をスクリプト化したい場合は、CLI スニファが向いています。各機能の公式リファレンスや KB の探し方は、関連記事『Fortinet 公式情報の探し方|製品仕様から脆弱性情報までの調べ方』にまとめています。

diagnose sniffer packet の構文と verbose レベル

CLI スニファは、次の形式で実行します。出力は CLI に表示され続け、指定したパケット数に達するか、Ctrl+C で停止するまで継続します。

diagnose sniffer packet <interface> <'filter'> <verbose> <count> <tsformat>

各引数の意味は次のとおりです。

  • interface: キャプチャするインターフェース名。全インターフェースを対象にする場合は any を指定します。
  • filter: 取得対象を絞り込むフィルタ式(後述)フィルタなしの場合は none を指定します。
  • verbose: 出力する情報の詳細度(後述)
  • count: 取得するパケット数。0 を指定すると、Ctrl+C で停止するまで取得し続けます。
  • tsformat: タイムスタンプの形式

参考: Performing a sniffer trace or packet capture(FortiGate / FortiOS 8.0.0 Administration Guide)
“you should prepare to capture the output to a file”
(スニッフィングを始める前に、出力をファイルに保存する準備をしておくとよいでしょう)
https://docs.fortinet.com/document/fortigate/8.0.0/administration-guide/680228/performing-a-sniffer-trace-or-packet-capture

verbose レベルの選び方

verbose レベルによって、出力される情報の範囲が変わります。

verbose出力内容
1パケットのヘッダ
2ヘッダ + IP ペイロードのデータ
3ヘッダ + Ethernet フレームのデータ
4ヘッダ + インターフェース名
5ヘッダ + IP ペイロードのデータ + インターフェース名
6ヘッダ + Ethernet フレームのデータ + インターフェース名

通信の有無やフローの確認だけであれば verbose 1 や 4 で十分です。ただし、この後 Wireshark 用に pcap へ変換することを見据える場合は、フレーム全体のデータが含まれる verbose 3 または 6 で取得する必要があります(変換の詳細は後述します)。

タイムスタンプ形式とフィルタ式

tsformat には次の値を指定できます。

  • a: 絶対時刻(UTC、yyyy-mm-dd hh:mm:ss.ms
  • l: 絶対時刻(FortiGate のローカル時刻)
  • 省略時: スニフ開始からの相対時間(秒)

フィルタ式は、tcpdump でおなじみの BPF に近い書き方です。hostportsrc / dst、プロトコル(arpipudptcp 等)を組み合わせて指定します。

# port1 で 192.168.1.10 宛ての TCP 80 番を 10 パケット、ローカル時刻で取得
diagnose sniffer packet port1 'host 192.168.1.10 and tcp port 80' 4 10 l

# any で ICMP または TCP のみ(SSH の port 22 を除外)を無制限に取得
diagnose sniffer packet any 'not port 22 and (icmp or tcp)' 4 0 l

なお、Wireshark のディスプレイフィルタ(ip.addr == ... などの書式)は、この CLI スニファのフィルタ式とは別物です。CLI 側は BPF に近い構文である点に注意してください。

SSH ログの保存と fgt2eth による pcap 変換

CLI スニファの出力はテキスト形式のため、Wireshark で開くには pcap への変換が必要です。流れは「CLI 出力をログファイルに保存 → fgt2eth で pcap に変換 → Wireshark で開く」という 3 ステップになります。

参考: Technical Tip: How to import ‘diagnose sniffer packet’ data to WireShark(Fortinet Community)
“the output of the ‘diagnose sniff packet’ command can be imported into Wireshark”
(’diagnose sniff packet’ コマンドの出力を Wireshark に取り込めます)
https://community.fortinet.com/t5/FortiGate/Technical-Tip-How-to-import-diagnose-sniffer-packet-data-to/ta-p/191727

手順

STEP
Wireshark をインストールする

fgt2eth は変換時に Wireshark 同梱の text2pcap を呼び出します。そのため、解析用 PC とは別に変換を行う PC でも、Wireshark のインストールが必要です。

STEP
fgt2eth を入手する

上記 Community KB の記事から fgt2eth.exe(zip)を入手します。Perl 環境向けの fgt2eth.pl や、GitHub で公開されている Sniftran も代替として利用できます。

STEP
SSH クライアントで出力をログ保存する

PuTTY などの SSH クライアントで FortiGate に接続し、セッションの全出力をログファイルに保存する設定にしておきます。スニフ開始前にこの準備をしておくことが重要です。

STEP
verbose 3 または 6 でスニフを実行する

pcap への変換にはフレーム全体のデータが必要なため、verbose は 3 または 6 を指定します。

# any インターフェースで ICMP を verbose 6・無制限に取得(Ctrl+C で停止)
diagnose sniffer packet any 'host 8.8.8.8 and icmp' 6 0
STEP
fgt2eth で pcap に変換する

取得を停止したら、保存したログファイルを fgt2eth で変換します。

fgt2eth.exe -in <保存したログ.txt> -out <出力.pcap>
STEP
Wireshark で開く

生成された pcap ファイルを Wireshark で開きます。

fgt2eth 単体では変換できず、内部で text2pcap を必要とする点が、つまずきやすいポイントです。変換時にエラーが出る場合は、変換 PC に Wireshark がインストールされているかを確認してください。

GUI パケットキャプチャで pcap を直接取得する

GUI を使える環境であれば、パケットキャプチャツールから pcap を直接ダウンロードできます。CLI スニファのようなテキスト出力の変換が不要なため、手軽です。

参考: Using the packet capture tool(FortiGate / FortiOS 7.6.6 Administration Guide)
“When the capture is finished, click Save as pcap”
(キャプチャが完了したら、Save as pcap をクリックします)
https://docs.fortinet.com/document/fortigate/7.6.6/administration-guide/462154/using-the-packet-capture-tool

手順

  1. Network > Diagnostics を開き、Packet Capture タブを選択します。
  2. Interface を選択します(既定は any)。
  3. 必要に応じて Filters を有効化し、絞り込みの構文を選びます。
  • Basic: Host・Port・Protocol number を指定します。
  • Advanced: src host 172.16.200.254 and dst host 172.16.200.1 and dst port 443 のような文字列で指定します。
  1. Start capture をクリックします。キャプチャはリアルタイムで表示され、パケットを選択すると Headers タブや Packet data タブで詳細を確認できます。
  2. 完了後、Save as pcap をクリックすると、pcap ファイルが自動的にダウンロードされます。

ダウンロードした pcap は変換不要でそのまま Wireshark で開けます。なお、ingress と egress のインターフェースを同時にキャプチャするなど、複数のキャプチャを並行して実行することもできます。GUI のパケットキャプチャは、CLI の on-demand-sniffer 系コマンドからも制御できます。

CLI と GUI の使い分け

変換の手間がない GUI は、GUI にアクセスでき、手早く pcap が欲しい場面に向いています。一方、SSH しか使えない環境や、フィルタを細かく制御したい場合、作業を自動化したい場合は CLI スニファ + fgt2eth が選択肢になります。

Wireshark に取り込んだ後の解析

pcap を Wireshark に取り込んだら、ここからはディスプレイフィルタで目的の通信を絞り込んで解析します。tcp.analysis.flags で再送や重複 ACK、ゼロウィンドウといった異常を浮かび上がらせたり、特定のストリームだけを追ったりと、ディスプレイフィルタの組み立て方が解析効率を大きく左右します。

複数条件の組み合わせや TCP 再送・HTTP エラーの追跡など、ディスプレイフィルタの具体的な書き方は、関連記事『Wireshark のフィルタ書き方と複数条件の使い分け|TCP 再送と HTTP エラーの追跡』で詳しく解説しています。本記事はキャプチャの取得と変換までを扱い、解析のフィルタリングはそちらを参照してください。

なお、CLI スニファのフィルタ式(BPF 系)と Wireshark のディスプレイフィルタ(ip.addr == ... などの書式)は別物です。取得時に絞り込みすぎず、広めに取得しておいて Wireshark 側のディスプレイフィルタで詳細を絞る、という進め方も有効です。

キャプチャ時の注意点

キャプチャを取得・解析する際に、見落とされがちな点を整理します。

ASIC オフロードによる取りこぼし

FortiGate のパケットスニファはカーネルベースの機能です。そのため、NP / SP などの専用プロセッサーにオフロードされたセッションは、スニファで捕捉できません。

参考: Checking that traffic is offloaded by NP processors(FortiGate / FortiOS 7.6.2 Hardware Acceleration)
“Offloaded traffic is not picked up by the packet sniffer”
(オフロードされたトラフィックは、パケットスニファでは捕捉されません)
https://docs.fortinet.com/document/fortigate/7.6.2/hardware-acceleration/30072/checking-that-traffic-is-offloaded-by-np-processors

トラフィックを流しているのにスニファに出てこない場合、そのセッションがオフロードされている可能性があります。オフロードされたパケットも確認したい場合は、該当するファイアウォールポリシーで一時的にオフロードを無効化します。

config firewall policy
    edit <ポリシーID>
        set auto-asic-offload disable
    next
end

ただし、オフロードの無効化は CPU 負荷の増加につながります。トラブルシュート時に限り、対象を絞ったポリシーで無効化し、確認後は元に戻す運用をおすすめします。

その他の注意点

pcap 変換には verbose 3 または 6 が必要:
verbose 1 や 4 では、変換に必要なフレーム全体のデータが含まれません。fgt2eth で変換する場合は verbose 3 または 6 で取得します。

CLI フィルタと Wireshark フィルタは別物:
取得時の BPF 系フィルタと、解析時のディスプレイフィルタは構文が異なります。

キャプチャ位置で見え方が変わる:
FortiGate 上のキャプチャは、クライアント側やサーバー側のキャプチャとは見え方が異なります。問題箇所の切り分けでは、複数地点でのキャプチャを突き合わせると精度が上がります。

信頼できない pcap の取り扱い:
Wireshark の dissector には脆弱性が報告されることがあり、悪意のあるキャプチャファイルを開くだけで問題につながる可能性があります。信頼できないソースの pcap は、最新版の Wireshark を用い、可能であれば隔離環境で開くことをおすすめします。

GUI キャプチャの制約:
GUI のパケットキャプチャは、FortiGate の GUI からログアウトすると停止します。長時間のバックグラウンド取得には CLI スニファが向いています。

まとめ

FortiGate のトラフィック調査では、CLI スニファと GUI パケットキャプチャという 2 つの取得方法があり、Wireshark で解析するまでの手順がそれぞれ異なります。本記事では、CLI 出力の fgt2eth 変換と GUI からの pcap 直接取得、そして取得時の注意点を整理しました。取得方法と落とし穴を押さえておくと、必要なパケットを確実に Wireshark へ取り込めます。

  • FortiGate のキャプチャは CLI スニファと GUI パケットキャプチャの 2 通り
  • CLI 出力は pcap ではなく、fgt2eth での変換が必要
  • pcap 変換を見据えるなら verbose 3 または 6 で取得
  • GUI(Network > Diagnostics)なら pcap を直接ダウンロード可能
  • ASIC オフロードされたセッションはスニファで取りこぼし
  • 取りこぼし時は該当ポリシーで auto-asic-offload を一時的に無効化
  • 取り込み後はディスプレイフィルタで解析(書き方は関連記事を参照)

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

関西を拠点に活動する、現役インフラエンジニア。経験20年超。

大手通信キャリアにて、中〜大規模インフラ(ネットワーク・サーバ・クラウド・セキュリティ)の設計・構築およびプロジェクトマネジメントに従事。現場で直面した技術課題への対処や、最新の脆弱性情報への実務対応を、一次情報として発信しています。

保有資格
CCIE Lifetime Emeritus(取得から20年以上)/ VCAP-DCA / Azure Solutions Architect Expert

▶ 運営者プロフィール(詳細)

目次