Linuxのサーバがあり、クライアントから何故か上手くサービスを利用できない。そんな時にそもそもクライアントからのパケットがLinuxサーバに届いているのかを確認する。方法として、Linux サーバ側から tcpdump コマンドを実行して、サーバ側に流れているパケットをキャプチャをする。
tcpdump コマンド
tcpdump コマンドでパケットキャプチャを行う。よく利用する使い方に絞って記載している。
パッケージインストール
tcpdumpコマンドを実行してみて、コマンドがありませんと表示される場合は、必要パッケージをyumやdnf コマンドでインストールする。
# dnf install tcpdump
使い方
tcpdump と叩けば一応はパケットが出力されるが、出力量が多いのでオプションで欲しい情報を極力絞って不要な情報を排除することがポイントとなる。
よく使うオプションは下記の通り
オプション | |
-v | やや詳細に(TTLやサービス種別なども表示される) |
-vv | -vよりさらに詳細に(NFS応答パケットの追加フィールドなども表示される) |
-vvv | -vvよりも詳細に出力する(telnet SBオプションなども表示される) |
-n | IPアドレスやポート番号を名前に変換しない |
-nn | IPアドレス、ポート番号をプロトコル名に変換(80 を http など)しない |
not port XX | XXで指定したPortへの通信は出力しないようにする |
not arp | APRパケット情報を除外する |
-i <インターフェース> | インターフェース指定 eth0 や ens192 などを指定する。 |
src <ホスト> | 接続元のホストを限定する。 |
dst <ホスト> | 接続先ホストを限定する。 |
-A | アスキー表示(SQL分などを見れる) |
-w <出力ファイル> | 生データをファイルに書き込む |
192.168.10.100 から到着するパケットをキャプチャする。元先両方取得する場は src や dst は指定しない。
# tcpdump -vvv -n src host 192.168.10.1
インターフェース追加。指定無しだと一番上のインターフェースが指定される。全てのインターフェースのパケットキャプチャを取得したい場合は -i any とすればよい。
# tcpdump -vvv -n -i eth0 src host 192.168.10.1
port 指定追加、この場合は22番ポート(SSH)に対する通信に絞る
# tcpdump -vvv -n port 22 -i eth0 src host 192.168.10.1
複数条件の場合は and または or でつなぐ。キャプチャ結果をファイルに出力する際は -w でパスを指定する。
# tcpdump -vvv -i any port 22 and host 192.168.10.1 -w /tmp/tcpdump-%F-%T.pcap
コメント