C言語で開発されたネットワークアナライザ「Wireshark」を教えて!
こういった悩みにお答えします.
本記事の信頼性
- リアルタイムシステムの研究歴12年.
- 東大教員の時に,英語でOS(Linuxカーネル)の授業.
- 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
- プログラミング歴15年以上,習得している言語: C/C++,Python,Solidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,ARM).
- 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」をGitHubにオープンソースとして公開.
- 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
- 最近は自然言語処理AIとイーサリアムに関する有益な情報発信に従事.
- (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
- (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.
こういった私から学べます.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!
目次
Wireshark
Wiresharkは,C言語で開発されたネットワークアナライザです.
Wiresharkは,IP,DHCPなど800以上のプロトコルを解析できる機能があります.
対応しているOSは,Windows,Linux,BSD,macOS等です.
WiresharkをLinux(Ubuntu 22.04 LTS)でインストールする方法は以下になります.
WiresharkはGUI,tsharkはWiresharkのCUIです.
1 |
$ sudo apt-get install wireshark tshark |
インストール中に以下の画面になるので「Yes」を選択します.
もし間違えて「No」を選択した場合は以下のコマンドを実行して「Yes」に変更して下さい.
1 |
$ sudo dpkg-reconfigure wireshark-common |
dumpcapコマンドの実行権限はrootとwiresharkのグループにしかありません.
1 2 |
$ ls -l /usr/bin/dumpcap -rwxr-xr-- 1 root wireshark 129696 Mar 5 2022 /usr/bin/dumpcap* |
なので,その他のユーザの実行権限を追加します.
1 2 3 |
$ sudo chmod +x /usr/bin/dumpcap $ ls -l /usr/bin/dumpcap -rwxr-xr-x 1 root wireshark 129696 Mar 5 2022 /usr/bin/dumpcap* |
Wiresharkの使い方
Wiresharkの使い方を紹介します.
Wiresharkの使い方の詳細は以下が参考になります.
WiresharkのGUIの使い方
WiresharkのGUIの使い方は以下の動画がわかりやすいです.
WiresharkのCUI「tshark」の使い方
WiresharkのCUI「tshark」の使い方を紹介します.
tsharkですべてのネットワークパケットをキャプチャしたい場合は以下のコマンドを実行します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ tshark Capturing on 'ens33' ** (tshark:4109) 13:38:54.805438 [Main MESSAGE] -- Capture started. ** (tshark:4109) 13:38:54.805487 [Main MESSAGE] -- File: "/tmp/wireshark_ens33DIVCU1.pcapng" 1 0.000000000 192.168.112.135 ? 192.168.112.1 SSH 294 Server: Encrypted packet (len=240) 2 0.000276988 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=241 Win=4095 Len=0 3 0.608338263 VMware_c0:00:08 ? Broadcast ARP 60 Who has 192.168.112.2? Tell 192.168.112.1 4 0.731701430 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 5 0.774257469 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=497 Win=4100 Len=0 6 1.179184749 VMware_c0:00:08 ? Broadcast ARP 60 Who has 192.168.112.2? Tell 192.168.112.1 7 1.249006969 192.168.112.135 ? 192.168.112.1 SSH 406 Server: Encrypted packet (len=352) 8 1.290740278 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=849 Win=4099 Len=0 9 1.761779684 192.168.112.135 ? 192.168.112.1 SSH 406 Server: Encrypted packet (len=352) 10 1.803829665 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=1201 Win=4097 Len=0 11 2.179161502 VMware_c0:00:08 ? Broadcast ARP 60 Who has 192.168.112.2? Tell 192.168.112.1 12 2.272379514 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 13 2.314824581 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=1457 Win=4096 Len=0 14 2.786585320 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 15 2.786903582 192.168.112.135 ? 192.168.112.1 SSH 214 Server: Encrypted packet (len=160) 16 2.787711144 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=1873 Win=4095 Len=0 17 3.294159877 192.168.112.135 ? 192.168.112.1 SSH 294 Server: Encrypted packet (len=240) 18 3.294497732 192.168.112.135 ? 192.168.112.1 SSH 214 Server: Encrypted packet (len=160) 19 3.295243857 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=2273 Win=4100 Len=0 20 3.804372321 192.168.112.135 ? 192.168.112.1 SSH 406 Server: Encrypted packet (len=352) 21 3.846983734 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=2625 Win=4099 Len=0 22 4.321314289 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 23 4.363033806 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=2881 Win=4098 Len=0 24 4.833909909 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 25 4.876723507 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=3137 Win=4097 Len=0 26 5.345643121 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 27 5.389244710 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=3393 Win=4096 Len=0 28 5.858258707 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 29 5.901866898 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=3649 Win=4095 Len=0 30 6.370605799 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 31 6.414610472 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=3905 Win=4100 Len=0 32 6.882077213 192.168.112.135 ? 192.168.112.1 SSH 198 Server: Encrypted packet (len=144) 33 6.882311545 192.168.112.135 ? 192.168.112.1 SSH 214 Server: Encrypted packet (len=160) 34 6.882964513 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=4209 Win=4099 Len=0 |
上記の場合は無限にネットワークパケットをキャプチャしてしまいます.
例えば,キャプチャ数を10個にしたい場合は以下のコマンドを実行します.
-cは合計キャプチャ数なので,実際のキャプチャ数は少ない場合があることに注意して下さい.
以下の例では,10個のパケットをキャプチャしていることがわかります.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ tshark -c 10 Capturing on 'ens33' ** (tshark:4161) 13:40:08.449982 [Main MESSAGE] -- Capture started. ** (tshark:4161) 13:40:08.450031 [Main MESSAGE] -- File: "/tmp/wireshark_ens33LMWMU1.pcapng" 1 0.000000000 192.168.112.135 ? 192.168.112.1 SSH 294 Server: Encrypted packet (len=240) 2 0.000244453 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=241 Win=4097 Len=0 3 0.501612737 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 4 0.545921549 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=497 Win=4096 Len=0 5 1.014216563 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 6 1.057346815 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=753 Win=4095 Len=0 7 1.525758761 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 8 1.567542480 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=1009 Win=4100 Len=0 9 2.036680066 192.168.112.135 ? 192.168.112.1 SSH 310 Server: Encrypted packet (len=256) 10 2.079179138 192.168.112.1 ? 192.168.112.135 TCP 60 54674 ? 22 [ACK] Seq=1 Ack=1265 Win=4099 Len=0 10 packets captured |
IPアドレスの宛先が192.168.112.1の場合で合計キャプチャ数が10個の場合は以下のコマンドを実行します.
以下の例では,5個のパケットをキャプチャしていることがわかります.
1 2 3 4 5 6 7 8 9 10 |
$ tshark -c 10 -Y "ip.dst==192.168.112.1" Capturing on 'ens33' ** (tshark:4356) 13:44:10.495780 [Main MESSAGE] -- Capture started. ** (tshark:4356) 13:44:10.495848 [Main MESSAGE] -- File: "/tmp/wireshark_ens33OTVNU1.pcapng" 1 0.000000000 192.168.112.135 ? 192.168.112.1 SSH 294 Server: Encrypted packet (len=240) 3 0.502903602 192.168.112.135 ? 192.168.112.1 SSH 198 Server: Encrypted packet (len=144) 5 1.014429617 192.168.112.135 ? 192.168.112.1 SSH 198 Server: Encrypted packet (len=144) 7 1.527084168 192.168.112.135 ? 192.168.112.1 SSH 198 Server: Encrypted packet (len=144) 9 2.039170730 192.168.112.135 ? 192.168.112.1 SSH 198 Server: Encrypted packet (len=144) 5 packets captured |
参考:Wiresharkのライブラリ「libwireshark」を利用したC言語のアプリケーションの開発?
Wiresharkのライブラリ「libwireshark」を利用したC言語のアプリケーションの開発は一般的ではありません.
こちらで議論されていますが,libwiresharkはWiresharkの外部で使うことを想定していないとのことです.
なので,Wiresharkを利用する際は,基本的にはwiresharkコマンド(GUI)やtsharkコマンド(CUI)を利用しましょう.
もしWiresharkに独自機能を追加したい場合は,Wiresharkのコードを修正してビルドとインストールする方向になります.
例えば,tsharkに独自オプションを追加したい場合はtshark.cを修正します.
まとめ
C言語で開発されたネットワークアナライザ「Wireshark」を紹介しました.
WiresharkではGUIとCUI(tshark)でネットワークパケットをキャプチャできることがわかりました.
Linuxカーネルのnetfilterと呼ばれる機能を利用して,自作のカーネルモジュールでネットワークパケットをキャプチャすることができます.
netfilterを含むLinuxカーネル「ソケット通信(TCP/UDP/IP)」を知りたいあなたはこちらからどうぞ.
C言語を独学で習得することは難しいです.
私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.
私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!
独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!