LoginSignup
1
2

More than 3 years have passed since last update.

【bat】Windows標準コマンドでパケットキャプチャ取得

Last updated at Posted at 2021-03-20

これはなに?

windowsサーバでパケットキャプチャを取得するプログラムです。
採取時間、採取サイズ、対抗先IPアドレスを指定でき、自動でディレクトリを作成&データを格納してくれます。
ついでにetl2pcapngを使ってwiresharkで読める形式にコンバートもしてくれます。(etl2pcapngは別途DL)

使い方

.batなので任意の場所に置いて実行してください。
私はタスクスケジューラに仕込んで使っています。
事前にetl2pcapng./tool配下に設置してください。
etl2pcapngの公式

プログラム本体

packetcap.bat
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
rem ********************************************
rem ファイル名:packetcap.bat
rem 目的      :Windowsサーバでパケットを採取する
rem ********************************************

rem ■カレントディレクトリ変更
set "CURRENT_DIR=%CD%"
cd /d %~dp0

rem ■現在時刻取得
set TIME2=%time: =0%
rem 例.)20201027_105710
set NOW_DATE=%date:~0,4%%date:~5,2%%date:~8,2%_%TIME2:~0,2%%TIME2:~3,2%%TIME2:~6,2%

rem ■パラメータ設定
rem --------------------------------------------
rem SIZE:採取するパケットの総サイズ(MB)
rem OUTPUT_DIR:採取したパケットの出力先
rem OUTPUT_FILENAME:出力ファイル名
rem DST_ADDR:対向先のIPアドレスを指定
rem EXEC_TIME:パケットの採取時間を指定(秒)
rem LOG_DIR:ログ出力ディレクトリ
rem LOG_NAME:ログファイル名
rem CONV_TOOL:wreshark用にコンバートするツールの格納先
rem --------------------------------------------
set SIZE=500
set OUTPUT_DIR=output\%NOW_DATE%\
set OUTPUT_FILENAME="%OUTPUT_DIR%%NOW_DATE%.etl"
set OUTPUT_CONVFILE="%OUTPUT_DIR%%NOW_DATE%.pcapng"
set DST_ADDR="xx.xx.xx.xx"
set EXEC_TIME=60
set LOG_DIR=log\
set LOG_NAME="%LOG_DIR%%NOW_DATE%.log"
set CONV_TOOL="tool\etl2pcapng\x86\etl2pcapng.exe"

rem ■出力先の確認
rem --------------------------------------------
rem [ディレクトリ構成]
rem バッチファイル本体.bat -> output -> 実行日時 -> .cab
rem                                             .etl
rem                                             .pcapng
rem                        -> log -> 実行日時.log
rem                        -> tool -> etl2pcapng
rem --------------------------------------------

rem パケット
if not exist %OUTPUT_DIR% (
 mkdir %OUTPUT_DIR%
)

rem ログ
if not exist %LOG_DIR% (
 mkdir %LOG_DIR%
)
echo %date% %time% info:バッチ起動 >> %LOG_NAME%

rem ■パケットキャプチャ処理
echo %date% %time% info:パケット採取開始 >> %LOG_NAME%
netsh trace start capture=yes maxsize=%SIZE% tracefile=%OUTPUT_FILENAME% IPv4.Address=%DST_ADDR% >> %LOG_NAME% 2>&1

if %errorlevel% == 0 (
  rem 正常系の処理
) else (
  rem 異常系の処理
  echo %date% %time% error:パケット採取開始が失敗しました 戻り値:%errorlevel% >> %LOG_NAME%
  endlocal
  exit /b %errorlevel%
)

rem テスト用の処理
rem ping %DST_ADDR% > nul 2>&1

netsh trace show status >> %LOG_NAME% 2>&1

echo %date% %time% info:パケット採取時間は %EXEC_TIME% 秒です >> %LOG_NAME%
timeout /t %EXEC_TIME% > nul

echo %date% %time% info:パケット採取を終了します >> %LOG_NAME%
netsh trace stop >> %LOG_NAME% 2>&1

if %errorlevel% == 0 (
  rem 正常系の処理
  echo %date% %time% info:パケット採取終了 >> %LOG_NAME%
) else (
  rem 異常系の処理
  echo %date% %time% error:パケット採取終了に失敗しました 戻り値:%errorlevel% >> %LOG_NAME%
  endlocal
  exit /b %errorlevel%
)

rem ■コンバート処理
rem 出力ファイルが.etlのため、wiresharkで確認できる形式に変換する
echo %date% %time% info:コンバート開始 >> %LOG_NAME%
%CONV_TOOL% %OUTPUT_FILENAME% %OUTPUT_CONVFILE%

if %errorlevel% == 0 (
  rem 正常系の処理
  echo %date% %time% info:コンバート終了 >> %LOG_NAME%
) else (
  rem 異常系の処理
  echo %date% %time% error:コンバート処理に失敗しました 戻り値:%errorlevel% >> %LOG_NAME%
  endlocal
  exit /b %errorlevel%
)

rem ■終了処理
endlocal
exit /b 0

おわりに

powershell使うべきだったかしら。。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2