Fortigateでパケットキャプチャをする方法(コマンドサンプル複数有り)

パケットキャプチャFortigate,パケットキャプチャ

Fortigateのパケットキャプチャ

FortigateはCLIから簡単にパケットキャプチャができます。フィルタ機能もそれなりに備えておりネットワークレイヤーのトラブルシューティング時に活躍してくれます。

以降で代表的なフィルタリングを説明します。

パケットキャプチャ

インターフェスを指定

パケットキャプチャを仕掛けたいインタフェースを指定できます。anyで全インタフェースを指定することも可能ですが、着信と送信のパケットが二重に表示されるので注意が必要です。(「パケットが通過しているか」を確認する際はanyにしてパケットが着信され送信されているかを確認するのは有効です。ただし、単に「通信全体の流れを追うこと」が目的の場合は単一インタフェースで取得した方がわかりやすいです。)

■internal1やwan1を指定
FGT60D # diagnose sniffer packet internal1
FGT60D # diagnose sniffer packet wan1

■全インタフェースを指定
FGT60D # diagnose sniffer packet any

IPアドレスでフィルタリング

IPアドレスによるフィルタリングです。被疑となるホストのIPアドレスや特定のサブネットで通信がうまくいかないトラブルシューティング時に使用します。

■ホスト単位で指定
FGT60D # diagnose sniffer packet any "host 192.168.0.80"

■サブネット単位で指定
FGT60D # diagnose sniffer packet any "net 192.168.0.0 mask 255.255.255.0"

■送信元IP、または送信先IP指定
FGT60D # diagnose sniffer packet any "src 192.168.0.80"
FGT60D # diagnose sniffer packet any "dst 198.51.100.1"

プロトコルを指定

プロトコルによるフィルタリングです。大量の通信が行われている機器上でWeb通信だけ取得したい、といった特定の通信をフィルタリングしたい際に有効です。

■ARP
diagnose sniffer packet any arp

■ICMPを指定
FGT60D # diagnose sniffer packet internal1 icmp

■TCPやUDPを指定
FGT60D # diagnose sniffer packet any "tcp port 443"
FGT60D # diagnose sniffer packet any "udp port 4500"

論理演算

AND・OR・NOTで複数のフィルタリングを組み合わせられます。NOTは運用リモート接続のssh通信を除外しその他の全通信を手っ取り早く取得することが可能なので便利です。

■ANDの例
FGT60D # diagnose sniffer packet any "src 192.168.0.80 and dst 198.51.100.1"
FGT60D # diagnose sniffer packet any "net 192.168.0.0 mask 255.255.255.0 and dst 198.51.100.1"
FGT60D # diagnose sniffer packet any "src 192.168.0.80 and dst 198.51.100.1 and tcp port 443"

■ORの例
FGT60D # diagnose sniffer packet any "host 192.168.0.80 or host 192.168.0.81
FGT60D # diagnose sniffer packet any "tcp port 80 or tcp port 443"

■NOTの例
FGT60D # diagnose sniffer packet any "not tcp port 22"

■複合
diagnose sniffer packet any "src net 192.168.0.0 mask 255.255.255.0 and dst 192.168.100.10 and tcp port 80 or tcp port 443 and not host 192.168.0.80"
※送信元「192.168.0.0/24」から送信先「192.168.100.10」のWeb通信に合致したトラフィック。
 但し、「192.168.0.80」のホスト通信は除外。

パケットキャプチャの詳細レベル(Verbose)

Fortigateのパケットキャプチャは詳細レベル(Verbose)を設定できます。詳細レベルとはイーサネット、パケットの内部情報をどこまで含めて取得するかのレベルのことです。
詳細レベルの設定はパケットキャプチャコマンドの末尾にオプション番号を指定します。オプションは下記の通りで、「1」がIPアドレスやプロトコルだけの取得です。「2」や「3」をつけるとイーサネット、パケットの詳細を取得することが可能です。また、「4」~「6」は「1」~「3」それぞれの詳細レベルに加え、どのインタフェースで採取されたかが分かるようになります。

1: print header of packets
2: print header and data from ip of packets
3: print header and data from ethernet of packets (if available)
4: print header of packets with interface name
5: print header and data from ip of packets with interface name
6: print header and data from ethernet of packets (if available) with intf name

下記で詳細レベル「1」と「4」と「3」の出力結果を表示してみます。

■詳細レベル1
FGT60D # diagnose sniffer packet internal1 "host 192.168.0.80 and host 192.168.100.10" 1
interfaces=[internal1]
filters=[host 192.168.0.80 and host 192.168.100.10]
4.340867 192.168.0.80.62840 -> 192.168.100.10.443: syn 3570981644
4.390808 192.168.100.10.443 -> 192.168.0.80.62840: syn 1345295623 ack 3570981645
4.519419 192.168.0.80.62840 -> 192.168.100.10.443: ack 1345295624
4.519674 192.168.0.80.62840 -> 192.168.100.10.443: psh 3570981645 ack 1345295624
4.572042 192.168.100.10.443 -> 192.168.0.80.62840: 1345295624 ack 3570982162
4.572690 192.168.100.10.443 -> 192.168.0.80.62840: psh 1345296974 ack 3570982162
4.646817 192.168.0.80.62840 -> 192.168.100.10.443: psh 3570982162 ack 1345296974
4.647015 192.168.0.80.62840 -> 192.168.100.10.443: fin 3570982169 ack 1345296974
4.649169 192.168.0.80.62842 -> 192.168.100.10.443: syn 768197247
4.674822 192.168.0.80.62840 -> 192.168.100.10.443: rst 3570982170 ack 1345297061
4.695928 192.168.100.10.443 -> 192.168.0.80.62840: fin 1345297061 ack 3570982169
■詳細レベル4
FGT60D # diagnose sniffer packet internal1 "host 192.168.0.80 and host 192.168.100.10" 4
interfaces=[internal1]
filters=[host 192.168.0.80 and host 192.168.100.10]
5.207096 internal1 -- 192.168.0.80.62890 -> 192.168.100.10.443: syn 3434994358
5.238490 internal1 -- 192.168.100.10.443 -> 192.168.0.80.62890: syn 4189494339 ack 3434994359
5.241022 internal1 -- 192.168.0.80.62890 -> 192.168.100.10.443: ack 4189494340
5.241394 internal1 -- 192.168.0.80.62890 -> 192.168.100.10.443: psh 3434994359 ack 4189494340
5.270390 internal1 -- 192.168.100.10.443 -> 192.168.0.80.62890: 4189494340 ack 3434994876
5.270811 internal1 -- 192.168.100.10.443 -> 192.168.0.80.62890: psh 4189495690 ack 3434994876
5.306398 internal1 -- 192.168.0.80.62890 -> 192.168.100.10.443: psh 3434994876 ack 4189495690
5.306607 internal1 -- 192.168.0.80.62890 -> 192.168.100.10.443: fin 3434994883 ack 4189495690
5.308798 internal1 -- 192.168.0.80.62890 -> 192.168.100.10.443: rst 3434994884 ack 4189495777
5.329798 internal1 -- 192.168.100.10.443 -> 192.168.0.80.62890: fin 4189495777 ack 3434994883
■詳細レベル3
FGT60D # diagnose sniffer packet internal1 "host 192.168.0.80 and host 192.168.100.10" 3
interfaces=[internal1]
filters=[host 192.168.0.80 and host 192.168.100.10]
4.940763 192.168.0.80.63065 -> 192.168.100.10.443: syn 4070319350
0x0000   085b 0efe 7458 8c70 5a2e 5298 0800 45a0        .[..tX.pZ.R...E.
0x0010   0034 fdde 4000 8006 169a c0a8 0050 c0a8        .4..@........P..
0x0020   640a f659 01bb f29c 24f6 0000 0000 8002        d..Y....$.......
0x0030   faf0 7ecc 0000 0204 05b4 0103 0308 0101        ..~.............
0x0040   0402                                           ..

4.941208 192.168.0.80.63066 -> 192.168.100.10.443: syn 3195164187
0x0000   085b 0efe 7458 8c70 5a2e 5298 0800 45a0        .[..tX.pZ.R...E.
0x0010   0034 fddf 4000 8006 1699 c0a8 0050 c0a8        .4..@........P..
0x0020   640a f65a 01bb be72 561b 0000 0000 8002        d..Z...rV.......
0x0030   faf0 81d0 0000 0204 05b4 0103 0308 0101        ................
0x0040   0402                                           ..

4.988409 192.168.100.10.443 -> 192.168.0.80.63065: syn 3245594055 ack 4070319351
0x0000   8c70 5a2e 5298 085b 0efe 7458 0800 4500        .pZ.R..[..tX..E.
0x0010   0034 641b 4000 3e06 f2fd c0a8 640a c0a8        .4d.@.>.....d...
0x0020   0050 01bb f659 c173 d5c7 f29c 24f7 8012        .P...Y.s....$...
0x0030   ffff e3de 0000 0204 0546 0103 0309 0402        .........F......
0x0040   0000                                           ..

4.988547 192.168.100.10.443 -> 192.168.0.80.63066: syn 3245701383 ack 3195164188
0x0000   8c70 5a2e 5298 085b 0efe 7458 0800 4500        .pZ.R..[..tX..E.
0x0010   0034 641c 4000 3e06 f2fc c0a8 640a c0a8        .4d.@.>.....d...
0x0020   0050 01bb f65a c175 7907 be72 561c 8012        .P...Z.uy..rV...
0x0030   ffff 43a1 0000 0204 0546 0103 0309 0402        ..C......F......
0x0040   0000                                           ..

4.990773 192.168.0.80.63065 -> 192.168.100.10.443: ack 3245594056
0x0000   085b 0efe 7458 8c70 5a2e 5298 0800 45a0        .[..tX.pZ.R...E.
0x0010   0028 fde0 4000 8006 16a4 c0a8 0050 c0a8        .(..@........P..
0x0020   640a f659 01bb f29c 24f7 c173 d5c8 5010        d..Y....$..s..P.
0x0030   0102 2242 0000                                 .."B..

4.990593 192.168.0.80.63065 -> 192.168.100.10.443: psh 4070319351 ack 3245594056
0x0000   085b 0efe 7458 8c70 5a2e 5298 0800 45a0        .[..tX.pZ.R...E.
<省略>
0x0230   0000 0000 0000 0000 0000 00                    ...........

4.992288 192.168.0.80.63066 -> 192.168.100.10.443: ack 3245701384
0x0000   085b 0efe 7458 8c70 5a2e 5298 0800 45a0        .[..tX.pZ.R...E.
<省略>
0x0030   0102 8204 0000                                 ......

4.992649 192.168.0.80.63066 -> 192.168.100.10.443: psh 3195164188 ack 3245701384
0x0000   085b 0efe 7458 8c70 5a2e 5298 0800 45a0        .[..tX.pZ.R...E.
<省略>
0x01e0   0000 0000 0000 0000 0000 0000 0000 0000        ................

詳細レベル「1」「4」は簡易な表示ですが、「3」はより詳細な表示結果となりパケットの解析時などに使用されます。

パケットキャプチャの結果をWiresharkで表示する方法

本当にパケットの内部レベルで解析が必要になった場合、詳細レベル「3」や「6」と言った深いレベルでパケットキャプチャを行っても人間が理解するには難しい表示形式です。
そのため、詳細レベル「3」や「6」で取得した内容をWiresharkで表示することが可能になるツールがFortinet公式で公開されています。

以降でやり方の説明をします。

ツールのダウンロード

まず、下記サイトの最下部に「fgt2eth.exe」が存在するのでダウンロードします。本ツールはFortigateで取得したパケットキャプチャ結果をWireshark形式に変換するためのツールです。

Fortinet公式:「Troubleshooting Tool: Using the FortiOS built-in packet sniffer」
https://kb.fortinet.com/kb/documentLink.do?externalID=11186

Fortigateでパケットキャプチャをする

詳細レベル「3」か「6」でパケットキャプチャをします。
なお、全トラフィックの取得でもフィルタリングで絞った内容でも問題はありませんが、一般的なトラブルシュートの一環であれば全トラフィックを取得しWireshark上でフィルタリングするやり方が一般的です。

下記の通り、パケットキャプチャの結果をテキストファイルに張り付けて保存します。ファイル名は何でもOKです。例では「example-fgt-wireshark.txt」としています。

Wireshark形式に変換

それではWindowsのcmdでツールを使い変換します。コマンドは下記です。
※[出力後のファイル名]は省略することも可能で、その場合はテキストファイル名に.ethの拡張子が付いた状態で出力されます。

>fgt2eth.exe -in [パケットキャプチャ結果を張り付けたテキストファイル] -out [出力後のファイル名]

私の環境で変換作業をしてみます。

すると、ローカルにpcapファイルが生成されたので開いてみると…

正常にWiresharkで開くことができました。

以上です。