tsharkをいじってみた

# 今回のお話
* wiresharkがquicに対応したらしい
* 自分の環境でどの程度quicが利用されているのかを見てみたかったので、tsharkを触ってみた
* shellscriptを利用して自分なりに機能追加してみた(mac bookで動作)

## そもそもwiresharkとは
* パケットキャプチャを行う超有名なツール

## ではtsharkとは
* wiresharkのcli版
* 実際にwiresharkインストールすると同時にインストールされる


## tsharkの使い方
* 利用可能なinterfaceを列挙 
``` 
tshark -D
```
* interface, 時間を指定してパケットキャプチャ
```
tshark -i $interface -a duration: $second
```
* ファイルの形式を指定して出力
```
tshark -i $interface -a duration: $second -w $filename
```

その他にも様々なオプションが存在

# 本題
* tsharkでは様々なオプションがある
* ただ、キャプチャしたパケットのプロトコル指定は煩雑(正確には特定のプロトコルだけをキャプチャすることできる)

* 使用されているプロトコルを列挙、プロトコルを指定すれば、割合を表示できるように

以下にコードを掲載
``` newshark.sh
NECESSARY_OPT=false
filename='test.pcap'
duration=3
protocol='QUIC'

function lack_of_necessary_param() {
  echo "-iオプションは必須オプションです．"
  exit 1
}

function usage {
    cat <<EOM
Usage: $(basename "$0") [OPTION]...
  -h            Display help
  -f FILE       file name
  -p TYPE       protocol
  -t SECOND     time to capture
  -i INTERFACE  interface(this is necessary parameter)
EOM

    exit 2
}

while getopts ":f:p:t:i:h" optKey; do
  case "$optKey" in
    f)
      echo "filename is ${OPTARG}"
      filename=${OPTARG}
      ;;
    p)
      echo "protocol is ${OPTARG}"
      protocol=${OPTARG}
      ;;
    t)
      echo "capture time is ${OPTARG}s"
      duration=${OPTARG}
      ;;
    i)
      NECESSARY_OPT=true
      echo "interface is ${OPTARG}"
      interface=${OPTARG}
      ;;
    '-h'|'--help'|* )
      usage
      ;;
  esac
done

if [ "${NECESSARY_OPT}" != true ]; then
    lack_of_necessary_param
fi;

declare -a pro_array
pro_array=()

tshark -i $interface -w $filename -a duration:3
line_num=`tshark -r ${filename} | wc -l`
echo 'whole line number is: ' $line_num

tshark -r ${filename} > 'tmp.txt'

while IFS= read -r line || [[ -n "$line" ]];
do
array=($line)
proto=${array[5]}
pro_array+=("$proto")
done < 'tmp.txt'

# echo ${#pro_array[@]}

protocols=()
protocols=$( printf "%s\n" "${pro_array[@]}" | sort -u )

echo 'The protocols you use: '${protocols[@]}

pro_file=${protocol}'_tmp.txt'
tshark -r ${filename} | grep ${protocol} > $pro_file
pro_line=`cat ${pro_file} | wc -l`
echo 'contained '${protocol}' is: ' ${pro_line}
pro_ratio=$(( (pro_line * 100) / line_num  ))
echo 'the '${protocol}' ratio is: ' ${pro_ratio} '%'
```

## 使用法を説明

コードの冒頭部分は、保存先のファイル名、キャプチャ時間、プロトコル名に初期値を与えている。
本プログラムはキャプチャしたいプロトコルを指定しない場合、QUICを初期値として設定している(完全に私の独断)。
また、パケットをキャプチャするインターフェースの指定は必須。

使用する際には、以下のようにパラメータを指定して、実行する。
```
./newshark.sh -i $interface -f $filename -p $protocol -t $time
```

以下が実行結果になっている。

``` 実行結果
packet_capture % newshark -i en7 -t 5
interface is en7
capture time is 5s
Capturing on 'USB 10/100/1000 LAN: en7'
 ** (tshark:31257) 18:28:17.364949 [Main MESSAGE] -- Capture started.
 ** (tshark:31257) 18:28:17.365425 [Main MESSAGE] -- File: "test.pcap"
3026
tshark:
whole line number is:  3026
The protocols you use: DNS ICMP MDNS QUIC SSDP TCP TLSv1.2 UDP
contained QUIC is:  389
the QUIC ratio is:  12 %
```


# 引用

* wiresharkのquic対応
    * https://www.wireshark.org/docs/dfref/q/quic.html
* tsharkソースコード
    * https://github.com/wireshark/wireshark/blob/master/tshark.c 
* tsharkのオプション
    * https://www.wireshark.org/docs/man-pages/tshark.html