ネットワークの障害を切り分けるときに、FortiGate を通るパケットをキャプチャできます。キャプチャは GUI でも CLI でも取れます。GUI では pcap ファイルとして保存して Wireshark で見られ、CLI ではその場でパケットのヘッダを表示して、パケットが通っているかを確かめられます。
この記事では、GUI でのキャプチャの手順と、CLI の diagnose sniffer packet の使い方を、実際の表示とあわせて確認します。検証時の FortiOS は 7.0.3 です。
- GUI でパケットキャプチャを取り、pcap ファイルをダウンロードする手順
- CLI の diagnose sniffer packet の書式と、詳細レベル・取得回数・タイムスタンプの違い
- ホスト、ネットワーク、プロトコル、TCP フラグでのフィルタの書き方
検証の構成
端末(10.0.200.100)は FortiGate(FG1)の LAN(port2)につながり、wan1(port3)からインターネットに出ます。port3 から出るときは、送信元が port3 のアドレス 10.0.10.117 に変換されます。
GUI での取得
キャプチャの条件を作る
port2 を通るパケットを取得します。ネットワーク ›› パケットキャプチャ を開き、新規作成 をクリックします。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
| 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 |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | インターフェース | パケットを取得するインターフェースです。今回は LAN (port2) を選びます。 |
| 2 | 最大キャプチャ パケット数 | 取得するパケットの上限です。今回は表示された値(4000)のままにします。 |
| 3 | フィルタ | 有効にして、ホスト に端末の 10.0.200.100 を入力します。取得できる数に上限があるので、IP アドレスやポート番号で絞って取得するのがおすすめです。 |
OK をクリックすると、一覧に条件が追加されます。この時点では、まだキャプチャは始まっていません(停止中)。
| インターフェース | ホストフィルタ | 最大パケットカウント | ステータス |
|---|---|---|---|
| 1LAN (port2) | 10.0.200.100 | 4,000 | 停止中 |
キャプチャを開始・停止する
一覧の LAN (port2) をダブルクリックすると、キャプチャ中 の項目が表示されます。▶(開始)をクリックするとキャプチャが始まり、最大キャプチャパケット数に対して何パーセントまで取得したかが表示されます。止めるときは ■(停止)をクリックします。
| インターフェース | LAN (port2) |
| 最大キャプチャパケット数 | 4000 |
| 1キャプチャ中 | 60% ■(停止) |
| 2(停止後) | 63% ▶ ⟳ ⤓(ダウンロード) |
| フィルタ ホスト | 10.0.200.100 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | キャプチャ中 | 取得中は、最大キャプチャパケット数に対する割合(例:60%)が表示されます。■ で停止します。 |
| 2 | ダウンロード | 停止したあと、ダウンロードボタンで pcap ファイルを保存できます。 |
pcap ファイルを Wireshark で開く
ダウンロードすると、port2.root.1.pcap という名前のファイルが保存されます。このファイルを Wireshark で開くと、キャプチャしたパケットを確認できます。今回は、端末 10.0.200.100 との RDP(3389)の通信が記録されていました。
| No. | Source | Destination | Protocol | Info |
|---|---|---|---|---|
| 1 | 10.0.200.100 | 10.0.200.154 | TLSv1… | Application Data |
| 2 | 10.0.200.154 | 10.0.200.100 | TCP | 50100 → 3389 [ACK] Seq=1 Ack=52 Win=4095 Len=0 |
| 3 | 10.0.200.100 | 10.0.200.154 | TLSv1… | Application Data |
| 4 | 10.0.200.154 | 10.0.200.100 | TCP | 50100 → 3389 [ACK] Seq=1 Ack=103 Win=4095 Len=0 |
| 5 | 10.0.200.100 | 10.0.200.154 | TLSv1… | Application Data |
| 6 | 10.0.200.154 | 10.0.200.100 | TCP | 50100 → 3389 [ACK] Seq=1 Ack=154 Win=4095 Len=0 |
新しいバージョンの 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
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | port2 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
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
インターフェースを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:ヘッダの要約だけ
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
レベル2:ヘッダと IP 部分のデータ
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
16進数のデータは IP ヘッダから始まります。たとえば先頭の 4500 は IPv4・ヘッダ長 20 バイトを、0a00 c864 は送信元 10.0.200.100 を表しています。
レベル3:ヘッダとイーサネット部分からのデータ
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
レベル2 との違いは、先頭にイーサネットヘッダ(宛先・送信元 MAC アドレスと、タイプ 0800=IPv4)が付くことです。IP ヘッダの 4500 は、その後ろから始まっています。
レベル4:ヘッダとインターフェース名
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
レベル5:ヘッダと IP 部分のデータ、インターフェース名
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
レベル6:ヘッダとイーサネット部分からのデータ、インターフェース名
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
取得回数の指定
詳細レベル 1 で 4 パケットだけ取得します。4 パケットを取得すると、自動で止まります。
FortiGate
diagnose sniffer packet any "icmp" 1 4
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
タイムスタンプの指定
UTC 時刻で表示(a)
FortiGate
diagnose sniffer packet any "icmp" 1 0 a
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
ローカル時刻で表示(l:小文字のエル)
FortiGate
diagnose sniffer packet any "icmp" 1 0 l
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
取得回数を 0(無制限)にし、その後ろにタイムスタンプを指定しています。a と l で表示される時刻が違うのは、UTC と、FortiGate に設定されたタイムゾーンの時刻の違いです。
よく使うキャプチャ
すべてのインターフェースのすべてのパケット
FortiGate
diagnose sniffer packet any "none" 4
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
条件を付けないので、管理用の 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
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
送信元と宛先を指定
送信元 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
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
ネットワークを指定
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
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
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
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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | syn | 端末から SYN(接続の開始)を送っています。数字はシーケンス番号です。 |
| 2 | syn … 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
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
TCP のフラグ(SYN・RST)を指定
TCP ヘッダの先頭から何バイト目の値がいくつか、という形で条件を書けます。TCP のフラグ(SYN、RST など)は、TCP ヘッダの先頭を 0 として数えた 13 バイト目の1バイトに入っています。
RST のパケット
13 バイト目と 4(RST のビットだけが 1 の値、2進数で 00000100)の論理積が 0 でない、つまり RST のビットが 1 のパケットを取得します。
FortiGate
diagnose sniffer packet any "tcp[13] & 4 != 0"
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
SYN のパケット
RST と同じように、SYN のビットだけが 1 の値(2、2進数で 00000010)との論理積が 0 でないパケットを取得します。SYN/ACK も SYN のビットが 1 なので、一緒に表示されます。
FortiGate
diagnose sniffer packet any "tcp[13] & 2 != 0"
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
SYN/ACK のパケット
SYN/ACK は SYN(2)と ACK(16)のビットが 1 なので、13 バイト目の値がちょうど 18 のパケットを条件にします。
FortiGate
diagnose sniffer packet any "tcp[13] = 18"
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
まとめ
| やりたいこと | コマンド・操作 |
|---|---|
| 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) |
コメント