【Fortigate】パケットキャプチャの取得手順 FortiOS 7.0.3

ネットワークの障害を切り分けるときに、FortiGate を通るパケットをキャプチャできます。キャプチャは GUI でも CLI でも取れます。GUI では pcap ファイルとして保存して Wireshark で見られ、CLI ではその場でパケットのヘッダを表示して、パケットが通っているかを確かめられます。

この記事では、GUI でのキャプチャの手順と、CLI の diagnose sniffer packet の使い方を、実際の表示とあわせて確認します。検証時の FortiOS は 7.0.3 です。

この記事でわかること
  1. GUI でパケットキャプチャを取り、pcap ファイルをダウンロードする手順
  2. CLI の diagnose sniffer packet の書式と、詳細レベル・取得回数・タイムスタンプの違い
  3. ホスト、ネットワーク、プロトコル、TCP フラグでのフィルタの書き方

検証の構成

端末(10.0.200.100)は FortiGate(FG1)の LAN(port2)につながり、wan1(port3)からインターネットに出ます。port3 から出るときは、送信元が port3 のアドレス 10.0.10.117 に変換されます。

Internet端末10.0.200.100FortiGate(FG1)LAN(port2)wan1(port3)10.0.10.117port3 から出るときは、送信元が 10.0.10.117 に変換される(NAT)
図1 検証の構成

GUI での取得

キャプチャの条件を作る

port2 を通るパケットを取得します。ネットワーク ›› パケットキャプチャ を開き、新規作成 をクリックします。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

FortiGate 管理画面画面イメージ
ネットワーク ›› パケットキャプチャ ›› 新規パケットキャプチャフィルタ
1インターフェースLAN (port2) 選べるインターフェース(抜粋)ISP1_Loopback
ISP2_Loopback
l2t.root
NAT interface (naf.root)
z_vpn (port1)
LAN (port2)wan1 (port3)
2最大キャプチャパケット数4000
3フィルタ ON
 ホスト10.0.200.100
 ポート 
 VLAN(s) 
 プロトコル 
IPv6パケットを含む OFF
非IPパケットを含める OFF
OKキャンセル
図2 パケットキャプチャフィルタの設定(実際の画面ではなく、設定する項目を示したイメージです)
No.項目設定内容
1インターフェースパケットを取得するインターフェースです。今回は LAN (port2) を選びます。
2最大キャプチャ
パケット数
取得するパケットの上限です。今回は表示された値(4000)のままにします。
3フィルタ有効にして、ホスト に端末の 10.0.200.100 を入力します。取得できる数に上限があるので、IP アドレスやポート番号で絞って取得するのがおすすめです。

OK をクリックすると、一覧に条件が追加されます。この時点では、まだキャプチャは始まっていません(停止中)。

FortiGate 管理画面画面イメージ
ネットワーク ›› パケットキャプチャ
インターフェースホストフィルタ最大パケットカウントステータス
1LAN (port2)10.0.200.1004,000 停止中
図3 作成したキャプチャの条件(実際の画面ではなく、表示のポイントを示したイメージです)

キャプチャを開始・停止する

一覧の LAN (port2) をダブルクリックすると、キャプチャ中 の項目が表示されます。▶(開始)をクリックするとキャプチャが始まり、最大キャプチャパケット数に対して何パーセントまで取得したかが表示されます。止めるときは ■(停止)をクリックします。

FortiGate 管理画面画面イメージ
ネットワーク ›› パケットキャプチャ ›› LAN (port2)
インターフェースLAN (port2)
最大キャプチャパケット数4000
1キャプチャ中60% ■(停止)
2(停止後)63% ▶ ⟳ ⤓(ダウンロード)
フィルタ ホスト10.0.200.100
図4 キャプチャの開始・停止とダウンロード(実際の画面ではなく、操作するボタンを示したイメージです)
No.表示意味
1キャプチャ中取得中は、最大キャプチャパケット数に対する割合(例:60%)が表示されます。■ で停止します。
2ダウンロード停止したあと、ダウンロードボタンで pcap ファイルを保存できます。

pcap ファイルを Wireshark で開く

ダウンロードすると、port2.root.1.pcap という名前のファイルが保存されます。このファイルを Wireshark で開くと、キャプチャしたパケットを確認できます。今回は、端末 10.0.200.100 との RDP(3389)の通信が記録されていました。

Wireshark(port2.root.1.pcap)画面イメージ
No.SourceDestinationProtocolInfo
110.0.200.10010.0.200.154TLSv1…Application Data
210.0.200.15410.0.200.100TCP50100 → 3389 [ACK] Seq=1 Ack=52 Win=4095 Len=0
310.0.200.10010.0.200.154TLSv1…Application Data
410.0.200.15410.0.200.100TCP50100 → 3389 [ACK] Seq=1 Ack=103 Win=4095 Len=0
510.0.200.10010.0.200.154TLSv1…Application Data
610.0.200.15410.0.200.100TCP50100 → 3389 [ACK] Seq=1 Ack=154 Win=4095 Len=0
図5 Wireshark で開いたキャプチャ(実際の画面ではなく、表示のポイントを示したイメージです)
補足

新しいバージョンの FortiOS では、GUI のパケットキャプチャは ネットワーク ›› 診断(Diagnostics)の中に移っています。使うバージョンのメニューで確認してください。

CLI での取得

CLI の diagnose sniffer packet では、パケット全体を保存するのではなく、送信元・宛先・プロトコルなどの条件に合うパケットのヘッダをその場で表示して、パケットが通っているかをトレースできます。次の Fortinet のナレッジを参考に、動作を確認しました。

>> 参考記事:Troubleshooting Tip: Using the FortiOS built-in packet sniffer

書式

diagnose sniffer packet <インターフェース> "<フィルタ条件>" <詳細レベル> <取得回数> <タイムスタンプ>
引数意味
インターフェース取得するインターフェースです。すべてのインターフェースを対象にするときは any にします。
フィルタ条件取得するパケットの条件(IP アドレス、プロトコルなど)です。none にすると条件なし(すべてのパケット)になります。
詳細レベル表示する情報の量(1〜6)です。下の表を参照してください。
取得回数取得するパケット数です。指定しないか 0 にすると無制限になり、Ctrl+C で止めます。
タイムスタンプ時刻の表示形式です。a は UTC、l(小文字のエル)は FortiGate のローカル時刻です。指定しないと、キャプチャ開始からの経過時間になります。
詳細レベル表示する内容
1パケットのヘッダ(要約)
2ヘッダと、IP 部分のデータ(16進数)
3ヘッダと、イーサネット部分からのデータ(16進数)
4ヘッダと、インターフェース名
5ヘッダと、IP 部分のデータ、インターフェース名
6ヘッダと、イーサネット部分からのデータ、インターフェース名

よく使うのは詳細レベル 4 です。どのインターフェースから入って、どのインターフェースから出たかを追えるので便利です。

この記事の CLI の表示は、検証時の画面を書き起こしたものです。

インターフェースの指定

すべてのインターフェースを通る ICMP パケットを、詳細レベル 4 で取得します。

FortiGate

diagnose sniffer packet any "icmp" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "icmp" 4Using Original Sniffing Modeinterfaces=[any]filters=[icmp]115.703439 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request15.703481 port3 out 10.0.10.117 -> 8.8.8.8: icmp: echo request15.706246 port3 in 8.8.8.8 -> 10.0.10.117: icmp: echo reply15.706259 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply16.712713 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request16.712724 port3 out 10.0.10.117 -> 8.8.8.8: icmp: echo request16.715505 port3 in 8.8.8.8 -> 10.0.10.117: icmp: echo reply16.715519 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply17.728835 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request17.728846 port3 out 10.0.10.117 -> 8.8.8.8: icmp: echo request17.731619 port3 in 8.8.8.8 -> 10.0.10.117: icmp: echo reply17.731633 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply18.744015 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request18.744032 port3 out 10.0.10.117 -> 8.8.8.8: icmp: echo request18.746796 port3 in 8.8.8.8 -> 10.0.10.117: icmp: echo reply18.746806 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C16 packets received by filter0 packets dropped by kernel
図6 すべてのインターフェースの ICMP(詳細レベル4)(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)
No.表示意味
1port2 in → port3 out
port3 in → port2 out
端末の echo request が port2 から入り、送信元を 10.0.10.117 に変換して port3 から出ています。echo reply は port3 から入り、宛先を 10.0.200.100 に戻して port2 から出ています。in/out はそのインターフェースで受信したか送信したかを表します。

port2 だけを通る ICMP パケットを取得する場合は、インターフェースに port2 を指定します。

FortiGate

diagnose sniffer packet port2 "icmp" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet port2 "icmp" 4Using Original Sniffing Modeinterfaces=[port2]filters=[icmp]15.650911 port2 -- 10.0.200.100 -> 8.8.8.8: icmp: echo request5.653735 port2 -- 8.8.8.8 -> 10.0.200.100: icmp: echo reply6.658062 port2 -- 10.0.200.100 -> 8.8.8.8: icmp: echo request6.660849 port2 -- 8.8.8.8 -> 10.0.200.100: icmp: echo reply7.673674 port2 -- 10.0.200.100 -> 8.8.8.8: icmp: echo request7.676497 port2 -- 8.8.8.8 -> 10.0.200.100: icmp: echo reply8.698429 port2 -- 10.0.200.100 -> 8.8.8.8: icmp: echo request8.701260 port2 -- 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C8 packets received by filter0 packets dropped by kernel
図7 port2 の ICMP(詳細レベル4)(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

インターフェースを1つに指定したときは、port3 側のパケットは表示されません。方向は in/out ではなく -- と表示されています。

詳細レベルの違い

同じ ICMP の通信(端末 10.0.200.100 と 8.8.8.8)を、詳細レベル 1〜6 で取得して比べます。フィルタを host 10.0.200.100 にしているので、送信元が 10.0.10.117 に変換された port3 側のパケットは表示されません。

レベル1:ヘッダの要約だけ

FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and icmp" 1Using Original Sniffing Modeinterfaces=[any]filters=[host 10.0.200.100 and icmp]111.360552 10.0.200.100 -> 8.8.8.8: icmp: echo request11.363385 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C3 packets received by filter0 packets dropped by kernel
図8 詳細レベル1(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

レベル2:ヘッダと IP 部分のデータ

FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and icmp" 2Using Original Sniffing Modeinterfaces=[any]filters=[host 10.0.200.100 and icmp]13.953709 10.0.200.100 -> 8.8.8.8: icmp: echo request20x0000   4500 003c e897 0000 8001 6fb5 0a00 c864        E..<......o....d0x0010   0808 0808 0800 4d13 0001 0048 6162 6364        ......M....Habcd0x0020   6566 6768 696a 6b6c 6d6e 6f70 7172 7374        efghijklmnopqrst0x0030   7576 7761 6263 6465 6667 6869                  uvwabcdefghi 3.956559 8.8.8.8 -> 10.0.200.100: icmp: echo reply0x0000   4580 003c 0000 0000 6801 6fcd 0808 0808        E..<....h.o.....0x0010   0a00 c864 0000 5513 0001 0048 6162 6364        ...d..U....Habcd0x0020   6566 6768 696a 6b6c 6d6e 6f70 7172 7374        efghijklmnopqrst0x0030   7576 7761 6263 6465 6667 6869                  uvwabcdefghi ^C3 packets received by filter0 packets dropped by kernel
図9 詳細レベル2(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

16進数のデータは IP ヘッダから始まります。たとえば先頭の 4500 は IPv4・ヘッダ長 20 バイトを、0a00 c864 は送信元 10.0.200.100 を表しています。

レベル3:ヘッダとイーサネット部分からのデータ

FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and icmp" 3Using Original Sniffing Modeinterfaces=[any]filters=[host 10.0.200.100 and icmp]121.481327 10.0.200.100 -> 8.8.8.8: icmp: echo request20x0000   0000 0000 0001 0aca b3bb cf03 0800 4500        ..............E.0x0010   003c e89a 0000 8001 6fb2 0a00 c864 0808        .<......o....d..0x0020   0808 0800 4d12 0001 0049 6162 6364 6566        ....M....Iabcdef0x0030   6768 696a 6b6c 6d6e 6f70 7172 7374 7576        ghijklmnopqrstuv0x0040   7761 6263 6465 6667 6869                       wabcdefghi 21.484143 8.8.8.8 -> 10.0.200.100: icmp: echo reply0x0000   0000 0000 0000 0add 47e0 15eb 0800 4580        ........G.....E.0x0010   003c 0000 0000 6801 6fcd 0808 0808 0a00        .<....h.o.......0x0020   c864 0000 5512 0001 0049 6162 6364 6566        .d..U....Iabcdef0x0030   6768 696a 6b6c 6d6e 6f70 7172 7374 7576        ghijklmnopqrstuv0x0040   7761 6263 6465 6667 6869                       wabcdefghi ^C2 packets received by filter0 packets dropped by kernel
図10 詳細レベル3(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

レベル2 との違いは、先頭にイーサネットヘッダ(宛先・送信元 MAC アドレスと、タイプ 0800=IPv4)が付くことです。IP ヘッダの 4500 は、その後ろから始まっています。

レベル4:ヘッダとインターフェース名

FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and icmp" 4Using Original Sniffing Modeinterfaces=[any]filters=[host 10.0.200.100 and icmp]15.429387 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request5.432209 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C2 packets received by filter0 packets dropped by kernel
図11 詳細レベル4(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

レベル5:ヘッダと IP 部分のデータ、インターフェース名

FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and icmp" 5Using Original Sniffing Modeinterfaces=[any]filters=[host 10.0.200.100 and icmp]13.302111 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request20x0000   4500 003c e89c 0000 8001 6fb0 0a00 c864        E..<......o....d0x0010   0808 0808 0800 4d10 0001 004b 6162 6364        ......M....Kabcd0x0020   6566 6768 696a 6b6c 6d6e 6f70 7172 7374        efghijklmnopqrst0x0030   7576 7761 6263 6465 6667 6869                  uvwabcdefghi 3.304917 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply0x0000   4580 003c 0000 0000 6801 6fcd 0808 0808        E..<....h.o.....0x0010   0a00 c864 0000 5510 0001 004b 6162 6364        ...d..U....Kabcd0x0020   6566 6768 696a 6b6c 6d6e 6f70 7172 7374        efghijklmnopqrst0x0030   7576 7761 6263 6465 6667 6869                  uvwabcdefghi ^C2 packets received by filter0 packets dropped by kernel
図12 詳細レベル5(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

レベル6:ヘッダとイーサネット部分からのデータ、インターフェース名

FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and icmp" 6Using Original Sniffing Modeinterfaces=[any]filters=[host 10.0.200.100 and icmp]13.727263 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request20x0000   0000 0000 0001 0aca b3bb cf03 0800 4500        ..............E.0x0010   003c e89d 0000 8001 6faf 0a00 c864 0808        .<......o....d..0x0020   0808 0800 4d0f 0001 004c 6162 6364 6566        ....M....Labcdef0x0030   6768 696a 6b6c 6d6e 6f70 7172 7374 7576        ghijklmnopqrstuv0x0040   7761 6263 6465 6667 6869                       wabcdefghi 3.730082 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply0x0000   0000 0000 0000 0add 47e0 15eb 0800 4580        ........G.....E.0x0010   003c 0000 0000 6801 6fcd 0808 0808 0a00        .<....h.o.......0x0020   c864 0000 550f 0001 004c 6162 6364 6566        .d..U....Labcdef0x0030   6768 696a 6b6c 6d6e 6f70 7172 7374 7576        ghijklmnopqrstuv0x0040   7761 6263 6465 6667 6869                       wabcdefghi ^C2 packets received by filter0 packets dropped by kernel
図13 詳細レベル6(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

取得回数の指定

詳細レベル 1 で 4 パケットだけ取得します。4 パケットを取得すると、自動で止まります。

FortiGate

diagnose sniffer packet any "icmp" 1 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "icmp" 1 4Using Original Sniffing Modeinterfaces=[any]filters=[icmp]115.392633 10.0.200.100 -> 8.8.8.8: icmp: echo request15.392676 10.0.10.117 -> 8.8.8.8: icmp: echo request15.395448 8.8.8.8 -> 10.0.10.117: icmp: echo reply15.395459 8.8.8.8 -> 10.0.200.100: icmp: echo reply
図14 取得回数を4にした例(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

タイムスタンプの指定

UTC 時刻で表示(a)

FortiGate

diagnose sniffer packet any "icmp" 1 0 a
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "icmp" 1 0 aUsing Original Sniffing Modeinterfaces=[any]filters=[icmp]12022-01-13 12:45:23.326051 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:23.326063 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:23.328818 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 12:45:23.328828 8.8.8.8 -> 10.0.200.100: icmp: echo reply2022-01-13 12:45:24.333590 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:24.333610 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:24.336378 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 12:45:24.336394 8.8.8.8 -> 10.0.200.100: icmp: echo reply2022-01-13 12:45:25.349270 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:25.349292 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:25.352078 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 12:45:25.352091 8.8.8.8 -> 10.0.200.100: icmp: echo reply2022-01-13 12:45:26.364840 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:26.364860 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 12:45:26.367621 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 12:45:26.367633 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C16 packets received by filter0 packets dropped by kernel
図15 タイムスタンプ a(UTC)(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

ローカル時刻で表示(l:小文字のエル)

FortiGate

diagnose sniffer packet any "icmp" 1 0 l
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "icmp" 1 0 lUsing Original Sniffing Modeinterfaces=[any]filters=[icmp]12022-01-13 04:46:35.830322 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:35.830366 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:35.833138 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 04:46:35.833150 8.8.8.8 -> 10.0.200.100: icmp: echo reply2022-01-13 04:46:36.838675 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:36.838686 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:36.841449 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 04:46:36.841463 8.8.8.8 -> 10.0.200.100: icmp: echo reply2022-01-13 04:46:37.854357 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:37.854366 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:37.857128 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 04:46:37.857142 8.8.8.8 -> 10.0.200.100: icmp: echo reply2022-01-13 04:46:38.870013 10.0.200.100 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:38.870022 10.0.10.117 -> 8.8.8.8: icmp: echo request2022-01-13 04:46:38.872802 8.8.8.8 -> 10.0.10.117: icmp: echo reply2022-01-13 04:46:38.872816 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C16 packets received by filter0 packets dropped by kernel
図16 タイムスタンプ l(ローカル時刻)(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

取得回数を 0(無制限)にし、その後ろにタイムスタンプを指定しています。a と l で表示される時刻が違うのは、UTC と、FortiGate に設定されたタイムゾーンの時刻の違いです。

よく使うキャプチャ

すべてのインターフェースのすべてのパケット

FortiGate

diagnose sniffer packet any "none" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "none" 4Using Original Sniffing Modeinterfaces=[any]1filters=[none]0.762387 port1 in (伏せています).46148 -> 10.0.100.213.22: ack 8710948810.762403 port1 in (伏せています).46148 -> 10.0.100.213.22: ack 8710949930.770391 port1 in (伏せています).46148 -> 10.0.100.213.22: ack 8710951210.814850 port2 in 10.0.200.100.3389 -> 10.0.200.154.45392: psh 1653567575 ack 575789750.814859 port1 out 10.0.100.250.3389 -> (伏せています).45392: psh 1653567575 ack 575789750.852611 port1 in (伏せています).45392 -> 10.0.100.250.3389: ack 16535676260.852626 port2 out 10.0.200.154.45392 -> 10.0.200.100.3389: ack 16535676261.751417 port1 out 10.0.100.213.22 -> (伏せています).46148: psh 871095121 ack 19634365871.751437 port1 out 10.0.100.213.22 -> (伏せています).46148: psh 871095425 ack 19634365871.831009 port2 in 10.0.200.100.3389 -> 10.0.200.154.45392: psh 1653567626 ack 57578975
図17 すべてのインターフェースのすべてのパケット(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです) 送信元のグローバルアドレスは伏せています

条件を付けないので、管理用の SSH(22)や RDP(3389)など、FortiGate を通るすべてのパケットが表示されます。実際の切り分けでは、次のように条件を付けて絞り込みます。

ホスト間の特定のプロトコル

10.0.200.100 と 8.8.8.8 の間の ICMP パケットです。複数の条件は and や or でつなぎます。

FortiGate

diagnose sniffer packet any "host 10.0.200.100 and host 8.8.8.8 and icmp" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "host 10.0.200.100 and host 8.8.8.8 and icmp" 4Using Original Sniffing Modeinterfaces=[any]1filters=[host 10.0.200.100 and host 8.8.8.8 and icmp]3.314648 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request3.317448 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply4.327059 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request4.329836 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply5.343211 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request5.346024 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply6.359430 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request6.362246 port2 out 8.8.8.8 -> 10.0.200.100: icmp: echo reply^C8 packets received by filter0 packets dropped by kernel
図18 ホスト間の ICMP(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

送信元と宛先を指定

送信元 10.0.200.100、宛先 8.8.8.8 の ICMP パケットです。src host/dst host で向きを指定するので、echo request だけが表示されます。

FortiGate

diagnose sniffer packet any "src host 10.0.200.100 and dst host 8.8.8.8 and icmp" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "src host 10.0.200.100 and dst host 8.8.8.8 and icmp" 4Using Original Sniffing Modeinterfaces=[any]filters=[src host 10.0.200.100 and dst host 8.8.8.8 and icmp]16.279167 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request7.291468 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request8.307598 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request9.323758 port2 in 10.0.200.100 -> 8.8.8.8: icmp: echo request^C4 packets received by filter0 packets dropped by kernel
図19 送信元と宛先を指定(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

ネットワークを指定

10.0.200.100 と 216.58.192.0/19 の間の ICMP パケットです。ネットワークは net で指定します。

FortiGate

diagnose sniffer packet any "host 10.0.200.100 and net 216.58.192.0/19 and icmp" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any " host 10.0.200.100 and net 216.58.192.0/19 and icmp" 4Using Original Sniffing Modeinterfaces=[any]1filters=[ host 10.0.200.100 and net 216.58.192.0/19 and icmp]4.321009 port2 in 10.0.200.100 -> 216.58.197.196: icmp: echo request4.323642 port2 out 216.58.197.196 -> 10.0.200.100: icmp: echo reply5.326381 port2 in 10.0.200.100 -> 216.58.197.196: icmp: echo request5.329041 port2 out 216.58.197.196 -> 10.0.200.100: icmp: echo reply6.342011 port2 in 10.0.200.100 -> 216.58.197.196: icmp: echo request6.344650 port2 out 216.58.197.196 -> 10.0.200.100: icmp: echo reply7.357667 port2 in 10.0.200.100 -> 216.58.197.196: icmp: echo request7.360279 port2 out 216.58.197.196 -> 10.0.200.100: icmp: echo reply^C8 packets received by filter0 packets dropped by kernel
図20 ネットワークを指定(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

TCP のパケットをすべて指定

10.0.200.100 と 216.58.192.0/19 の間の TCP パケットです。

FortiGate

diagnose sniffer packet any "host 10.0.200.100 and net 216.58.192.0/19 and tcp" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any " host 10.0.200.100 and net 216.58.192.0/19 and tcp" 4Using Original Sniffing Modeinterfaces=[any]filters=[ host 10.0.200.100 and net 216.58.192.0/19 and tcp]113.599270 port2 in 10.0.200.100.49770 -> 216.58.220.98.443: syn 56695509813.599520 port2 in 10.0.200.100.49771 -> 216.58.220.98.443: syn 198128002913.599738 port2 in 10.0.200.100.49772 -> 216.58.220.98.443: syn 1823393878213.601649 port2 out 216.58.220.98.443 -> 10.0.200.100.49770: syn 233202821 ack 56695509913.601972 port2 in 10.0.200.100.49770 -> 216.58.220.98.443: ack 233202822
図21 TCP をすべて指定(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)
No.表示意味
1syn端末から SYN(接続の開始)を送っています。数字はシーケンス番号です。
2syn … ack
ack
サーバから SYN/ACK が返り、端末が ACK を返しています。SYN/ACK の ack の値は、端末の SYN のシーケンス番号+1(566955098 → 566955099)です。

TCP のポート番号を指定

10.0.200.100 と 216.58.192.0/19 の間の、TCP 443 番のパケットです。

FortiGate

diagnose sniffer packet any "host 10.0.200.100 and net 216.58.192.0/19 and tcp port 443" 4
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any " host 10.0.200.100 and net 216.58.192.0/19 and tcp port 443" 4Using Original Sniffing Modeinterfaces=[any]filters=[ host 10.0.200.100 and net 216.58.192.0/19 and tcp port 443]18.502193 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: syn 10729496498.505647 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: syn 284435440 ack 10729496508.505957 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: ack 2844354418.506176 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: psh 1072949650 ack 2844354418.509575 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: ack 10729498498.541549 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: 284435441 ack 10729498498.541555 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: 284436871 ack 10729498498.541559 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: 284438301 ack 10729498498.541566 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: psh 284439731 ack 10729498498.541855 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: ack 2844383018.541877 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: ack 2844398948.548281 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: psh 1072949849 ack 2844398948.551899 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: psh 284439894 ack 10729499428.551945 port2 out 216.58.220.98.443 -> 10.0.200.100.49836: psh 284440186 ack 10729499428.552161 port2 in 10.0.200.100.49836 -> 216.58.220.98.443: ack 284440186
図22 TCP の 443 番を指定(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

TCP のフラグ(SYN・RST)を指定

TCP ヘッダの先頭から何バイト目の値がいくつか、という形で条件を書けます。TCP のフラグ(SYN、RST など)は、TCP ヘッダの先頭を 0 として数えた 13 バイト目の1バイトに入っています。

0〜1:送信元ポート2〜3:宛先ポート4〜7:シーケンス番号8〜11:確認応答番号12:ヘッダ長など13:フラグ14〜15:ウィンドウサイズCWR128ECE64URG32ACK16PSH8RST4SYN2FIN1RST:tcp[13] & 4 != 0 / SYN:tcp[13] & 2 != 0 / SYN/ACK:tcp[13] = 18(16+2)
図23 TCP ヘッダのフラグの位置と値

RST のパケット

13 バイト目と 4(RST のビットだけが 1 の値、2進数で 00000100)の論理積が 0 でない、つまり RST のビットが 1 のパケットを取得します。

FortiGate

diagnose sniffer packet any "tcp[13] & 4 != 0"
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "tcp[13] & 4 != 0"Using Original Sniffing Modeinterfaces=[any]filters=[tcp[13] & 4 != 0]116.139252 10.0.200.100.49901 -> 172.217.26.238.443: rst 1341419361 ack 46707338716.139275 10.0.10.117.49901 -> 172.217.26.238.443: rst 1341419361 ack 46707338716.139340 10.0.200.100.49900 -> 142.250.196.132.443: rst 2569455972 ack 59606815516.139355 10.0.10.117.49900 -> 142.250.196.132.443: rst 2569455972 ack 59606815516.139411 10.0.200.100.49899 -> 142.250.196.132.443: rst 1568769699 ack 97261398316.139417 10.0.10.117.49899 -> 142.250.196.132.443: rst 1568769699 ack 97261398316.139435 10.0.200.100.49903 -> 172.217.26.238.443: rst 2347849475 ack 37996619516.139439 10.0.10.117.49903 -> 172.217.26.238.443: rst 2347849475 ack 37996619516.139494 10.0.200.100.49902 -> 172.217.26.238.443: rst 508455418 ack 42071322516.139500 10.0.10.117.49902 -> 172.217.26.238.443: rst 508455418 ack 420713225^C10 packets received by filter0 packets dropped by kernel
図24 RST のパケット(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

SYN のパケット

RST と同じように、SYN のビットだけが 1 の値(2、2進数で 00000010)との論理積が 0 でないパケットを取得します。SYN/ACK も SYN のビットが 1 なので、一緒に表示されます。

FortiGate

diagnose sniffer packet any "tcp[13] & 2 != 0"
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "tcp[13] & 2 != 0"Using Original Sniffing Modeinterfaces=[any]filters=[tcp[13] & 2 != 0]111.839736 10.0.200.100.49904 -> 172.217.175.4.443: syn 197039132411.839759 10.0.10.117.49904 -> 172.217.175.4.443: syn 197039132411.839878 10.0.200.100.49905 -> 172.217.175.4.443: syn 92601414511.839898 10.0.10.117.49905 -> 172.217.175.4.443: syn 926014145211.842188 172.217.175.4.443 -> 10.0.10.117.49904: syn 1236431681 ack 197039132511.842199 172.217.175.4.443 -> 10.0.200.100.49904: syn 1236431681 ack 197039132511.842322 172.217.175.4.443 -> 10.0.10.117.49905: syn 3211768987 ack 92601414611.842331 172.217.175.4.443 -> 10.0.200.100.49905: syn 3211768987 ack 92601414611.938748 10.0.200.100.49906 -> 142.250.207.35.80: syn 328469923511.938765 10.0.10.117.49906 -> 142.250.207.35.80: syn 328469923511.940374 142.250.207.35.80 -> 10.0.10.117.49906: syn 1355397953 ack 328469923611.940383 142.250.207.35.80 -> 10.0.200.100.49906: syn 1355397953 ack 3284699236
図25 SYN のパケット(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

SYN/ACK のパケット

SYN/ACK は SYN(2)と ACK(16)のビットが 1 なので、13 バイト目の値がちょうど 18 のパケットを条件にします。

FortiGate

diagnose sniffer packet any "tcp[13] = 18"
FortiGate CLI画面イメージ
FG1 # diagnose sniffer packet any "tcp[13] = 18"Using Original Sniffing Modeinterfaces=[any]filters=[tcp[13] = 18]110.502364 172.217.175.4.443 -> 10.0.10.117.49911: syn 3935292103 ack 226030104510.502373 172.217.175.4.443 -> 10.0.200.100.49911: syn 3935292103 ack 226030104510.507468 142.250.207.46.443 -> 10.0.10.117.49912: syn 2472893560 ack 100733837210.507474 142.250.207.46.443 -> 10.0.200.100.49912: syn 2472893560 ack 100733837211.378892 142.250.207.46.443 -> 10.0.10.117.49913: syn 2024006869 ack 121233238711.378902 142.250.207.46.443 -> 10.0.200.100.49913: syn 2024006869 ack 1212332387
図26 SYN/ACK のパケット(実際の画面ではなく、元の CLI 表示を書き起こしたイメージです)

まとめ

やりたいことコマンド・操作
pcap で保存GUI の パケットキャプチャ で条件を作り、▶ で開始、■ で停止してダウンロード
入出力を追うdiagnose sniffer packet any "<条件>" 4
中身も見る詳細レベル 2/3(インターフェース名も見るなら 5/6)
数を区切る4番目の引数に取得回数(0 は無制限、Ctrl+C で停止)
時刻を付ける5番目の引数に a(UTC)か l(ローカル時刻)
TCP フラグtcp[13] & 4 != 0(RST)、tcp[13] & 2 != 0(SYN)、tcp[13] = 18(SYN/ACK)

コメント