B級システムエンジニアの備忘録

インフラ・プログラミングなんでもやるぞ雑用エンジニアブログ

CentOS Linux サーバー システム・技術情報 ネットワーク

tcpdumpを使ってみた(TCP,UDP通信の確認)

更新日:

WEBサーバーの各ポート宛の通信を監視したかったり、不正なアクセスの特定に苦労したことありませんか??

自分は最近までApacheだったりするとアクセスログでわかるのですが、
Memcached(11211)やZabbix等(10050,10051)のポートを監視する方法がわからず悩んでいました。

もちろんIPの特定も可能なので、攻撃の監視にも利用できます!

そこでtcpdumpというソフトウェアを発見し、感動を覚えました。
なので備忘録替わりに記事にしたいと思います。

インストール方法

コマンドリファレンス

オプションが多いため参考サイトより抜粋

tcpdump [ オプション ] [ EXPRESSION ]
-a ネットワークアドレスとブロードキャストアドレスを名前解決する
-c COUNT COUNT個のパケットを受信したら終了する
-d コンパイル済みパケットマッチングコードを、人が読める形式で標準出力に出力し終了する
-dd パケットマッチングコードをC言語プログラムの一部として使える形式でダンプする
-e リンクレベルヘッダをそれぞれの出力行に表示する
-f 外部のIPv4アドレスをシンボルではなく数値で表示する
-i INTERFACE ネットワーク・インターフェースINTERFACEを監視する
-l 標準出力をバッファリングする
-m MODULE SMI MIBモジュールをファイルMODULEから読み込む
-p プロミスキャスモード(無差別透過モード)にしない
-q 簡易的な出力とする
-r FILE パケットをファイルFILEから読み込んで処理する(「-」なら標準入力から読み込む)
-s SNAPLEN 出力するバイト数をSNAPLENバイトとする
-t 時間情報を出力しない
-tt 時間情報を整形せずUNIX時間で表示する
-ttt 時間情報を直前の行との差分で表示する
-v やや詳細に出力する(TTLやサービス種別なども表示される)
-vv -vよりも詳細に出力する(NFS応答パケットの追加フィールドなども表示される)
-vvv -vvよりも詳細に出力する(telnet SBオプションなども表示される)
-w FILE 生パケットをそのままファイルFILEに出力する(-rオプションで読み込める)
-x パケットを16進数で表示する(リンクレベルヘッダを除く)
-A パケットをASCII文字で表示する
-B BUFFERSIZE OSのバッファサイズをBUFFERSIZEとする
-C FILESIZE 出力ファイルの最大サイズをFILESIZEメガバイト(MiB)とし、超えた場合は別ファイルにローテートする
-D tcpdumpで利用できるネットワークインターフェースをリスト表示する
-F FILE 条件式が書かれたファイルFILEを読み込んで利用する(これ以後の引数の条件式は無視)
-G ROTATE_SECONDS ファイル書き込みをROTATE_SECONDS秒でローテートする
-N ドメイン名を表示せずホスト名のみ表示する
-S TCPシーケンス番号を絶対値で表示する
-T TYPE 条件にマッチしたパケットをTYPE(rpc、rtp、rtcp、snmp、vat、wb)で指定したタイプで翻訳する
-X パケットの16進数表示の際にASCII文字列も表示する
-W FILECOUNT ローテート回数がFILECOUNTに達したら終了する
-Z USER root権限ではなくユーザーUSER権限で動作する
EXPRESSION パケットマッチングの条件式を指定する
-n IPアドレスの名前解決は行わない(DNS lookupを行わない)
-nn IPアドレス及びポート表示をサービス名表示しない(DNS lookupを行わない)

使い方

まず、気を付けていただきたいことがありますが、
tcpdumpを使う際に2点ほど。。。
まず、スーパーユーザーもしくはsudoで実行する必要があります。
一般ユーザーは使用できません!
そして、もう一つが-nnオプションです。
これをつけないと、DNS lookupに時間がかかり非常に遅くなりますので、ご注意ください。
-nnにするとポートサービス名も番号のまま表示されます。
必要がない場合は付けたほうが良いオプションです。

フラグ一覧

[S]クライアントからのSYNパケット送信(通信開始)
[S.]受信後サーバーからクライアントへSYNとACKを送信
[.]クライアントがACKを送信
[F.]クライアントもしくはサーバーのFINとACK送信
[P]PUSHを送信(即時データ要求となりバッファリングせずに上位アプリケーションへデータを渡す)
[R]RESET 通信の強制切断及び接続拒否

TCP通信の流れ(通信終了まで)

通常のTCP通信の流れ
クライアント[S]

サーバー[S.]

クライアント[.]

クライアント[F.]

サーバー[.] ※ここでHTMLだったり画像だったりが送信されます。

サーバー[F.]

クライアント[.]

(例)IPアドレスに対して名前解決を行わずeth0宛のHTTPの通信を見る
※xxx.xxx.xxx.xxx等はIPとして置き換えください。

HTTP通信のHEADER情報やパケットの中身を見たい場合

例)HEADER情報を表示(ASCII表示)
この方法を使うとデバッグの役に立ちます。
ブラウザ側やApacheが保有している環境変数等と照合ができます。(PHPだったら$_SERVERですね)
またSetEnvIf等のApache側のHEADER情報を使用した分岐処理をする際なども、HEADERの情報を確認しながら調整が取れるので便利ですね!

tcpdump -nn -s0 -A port 80 -i eth0

HTTPSの通信は見れるのか??

最近何かと話題になる暗号化通信ですが、
HTTPSでのWEBサイト構築は必須になりつつありますね!
でも、何が違うの??と思う人もいると思います。
実際にデータの暗号化をするということはtcpdumpコマンドを使用すると実感できます。
以下のデータは先ほどのHTTP通信と同様の環境での通信結果になります。

いかがでしょうか?
通信をもし見られたとしても中身を解読することは非常に困難であることがわかります。
また、この中身を復号する為にはサーバーが持っている秘密鍵が必要になります。
実際にはデバッグ目的で以下のようなツールが存在します。

wireshark
※Windows用ツール
このツールへtcpdumpを使用して通信ログを出力し、それをWindowsマシンでwiresharkを使用して、
解析が可能です。
wiresharkへはサーバーの秘密鍵を登録する必要があるため、事前にサーバーの秘密鍵をWindowsマシンへ保管してください。

最近ではwifiのWPA2が脆弱性問題等おきていたりと、人々の関心がセキュリティ関連にむいているので、
いまだHTTP通信でサイト構築をされている方がいらっしゃたら、この機会にHTTPS通信に切り替えてみてはどうでしょうか?

その他

vrrp通信を見る(マルチキャスト)

icmp通信を見る

特定のIPからのhttpへのtcp通信のみ表示

arp通信を見る

tcpdumpのその他記事

tcpdumpを使ってSQLをリアルタイム監視

336

336

-CentOS, Linux, サーバー, システム・技術情報, ネットワーク

Copyright© B級システムエンジニアの備忘録 , 2021 All Rights Reserved.