• このエントリーをはてなブックマークに追加

【linux豆知識】tcpdump入門

  • このエントリーをはてなブックマークに追加

tcpdump
zaco muraです。

以前【linux豆知識】tcpdumpが重い(表示が遅い)時の対処という記事を書きましたが、tcpdumpコマンドはサーバエンジニアが使う重要なコマンドです。
自分もよく使いますので、オプションなどメモしときます。

前提:tcpdumpとは?

パケットをキャプチャするコマンドです。wiresharkのコマンドライン版、みたいな感じで理解してもらえればよいかと思います。(linux版のwiresharkもありますが)

前提:環境

基本的にlinux全般で使えるとは思いますが、本記事ではCentOS7.1.1503を想定しています。
(以下に出てくる”centos7″というのはホスト名です)

スポンサーリンク
Sponsords Link

どうやって使うの?

基本的に tcpdump <オプション> という構文で使います。rootになることが必須です。
ではよく使うオプションを書いていきます。

インターフェイス指定 : -i

以下の例では、”ens32″というNICを指定してキャプチャしています。

# tcpdump -i ens32
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:42:23.855066 IP host1 > centos7: ICMP echo request, id 1, seq 4799, length 40
12:42:23.855102 IP centos7 > host1: ICMP echo reply, id 1, seq 4799, length 40

インターフェイス指定せず、全インターフェイスでキャプチャ : -i any

上とは逆に、どこのインターフェイスに来るかわからないような場面で使います。

# tcpdump -i any
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
12:21:52.503097 IP centos7.ssh > host1.53698: Flags [P.], seq 21799904:21800144, ack 3372923732, win 162, length 240
12:21:52.504631 IP host1.53698 > centos7.ssh: Flags [.], ack 240, win 251, length 0

ホスト名ではなくIPアドレスで表示 : -n

以下は192.168.0.2のSSHサーバへのパケットキャプチャです。

# tcpdump -i ens32 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:44:36.104944 IP 192.168.0.1.59616 > 192.168.0.2.ssh: Flags [S], seq 1255080635, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
12:44:36.104978 IP 192.168.0.2.ssh > 192.168.0.1.59616: Flags [R.], seq 0, ack 1255080636, win 0, length 0

プロトコル名ではなくポート番号で表示 : -nn

上記ではポート番号が”ssh”と表示されていますが、そこも含めて数値で表示します。

# tcpdump -i ens32 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:46:52.415517 IP 192.168.0.1.59632 > 192.168.0.2.22: Flags [S], seq 2838826163, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
12:46:52.415557 IP 192.168.0.2.22 > 192.168.0.1.59632: Flags [R.], seq 0, ack 2838826164, win 0, length 0

MACアドレスを表示 : -e

IPアドレスに加えてパケットの送信元/宛先MACアドレスを表示します。

# tcpdump -i ens32 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:34:15.726049 00:00:00:11:11:11 (oui Unknown) > 22:22:22:22:22:22 (oui Cisco), ethertype IPv4 (0x0800), length 1514: centos7.ssh > host1.53698: Flags [.], seq 560:2020, ack 1, win 162, length 1460
12:34:15.726060 00:00:00:11:11:11 (oui Unknown) > 22:22:22:22:22:22 (oui Cisco), ethertype IPv4 (0x0800), length 706: centos7.ssh > host1.53698: Flags [P.], seq 2020:2672, ack 1, win 162, length 652
12:34:15.726141 00:00:00:11:11:11 (oui Unknown) > 22:22:22:22:22:22 (oui Cisco), ethertype IPv4 (0x0800), length 566: centos7.ssh > host1.53698: Flags [P.], seq 2672:3184, ack 1, win 162, length 512

パケットをビット列で表示 : -x

パケットの中身を16進数のビット列で表示します

# tcpdump -i ens32 -x
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:32:24.299568 IP centos7.ssh > host1.53698: Flags [P.], seq 22627408:22627648, ack 3372954644, win 162, length 240
        0x0000:  4510 0118 99a2 4000 4006 def8 0afe a12d
        0x0010:  0ae9 0a21 0390 d1c2 0159 4450 c90b 3414
        0x0020:  5018 00a2 c23f 0000 111b 62b5 2365 8eb8
        0x0030:  2622 4c74 6f48 7378 b9e2 1914 1e89 9275
        0x0040:  259b bb94 366f 31d6 14db 55c6 350e b056
        0x0050:  10e5 0f93 2816 c9b9 e710 52d8 9fc9 0aaf

wiresharkで読み込める形式でファイルに出力 : -w “出力ファイル名”

サーバでキャプチャしてパソコンで見る場合などに使います。
なお、デフォルトではパケットの一部のみをキャプチャするので、合わせて ” -s 0 ” というオプションも付けると良いです。

# tcpdump -i ens32 -s 0 -w /tmp/capture.pcap
tcpdump: listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes

プロトコルを指定 : -p “プロトコル名”

表示したいプロトコルを指定します。プロトコル名には ip/arp/icmp/tcp/udp などが指定できます。

# tcpdump -i ens32 -p icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:36:27.355676 IP  host1 > centos7: ICMP echo request, id 2, seq 24653, length 40
12:36:27.355754 IP centos7 >  host1: ICMP echo reply, id 2, seq 24653, length 40

IPアドレスを指定 : host “IPアドレス(FQDNも可)”

表示したいIPアドレスを指定します。hostで指定した場合、送信元/宛先のどちらかに指定ホストが入れば表示されます。

# tcpdump -i ens32 host 192.168.0.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:40:32.324676 IP 192.168.0.2 > centos7: ICMP echo request, id 2, seq 24653, length 40
12:40:32.367754 IP centos7 > 192.168.0.2: ICMP echo reply, id 2, seq 24653, length 40

送信元IPアドレスを指定 : src “IPアドレス(FQDNも可)”

表示したいIPアドレスを指定します。送信元のみに指定ホストが入れば表示されます。

# tcpdump -i ens32 src 192.168.0.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:40:32.324676 IP 192.168.0.2 > centos7: ICMP echo request, id 2, seq 24653, length 40

宛先IPアドレスを指定 : dst “IPアドレス(FQDNも可)”

表示したいIPアドレスを指定します。宛先のみに指定ホストが入れば表示されます。

# tcpdump -i ens32 dst 192.168.0.2
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:40:32.367754 IP centos7 > 192.168.0.2: ICMP echo reply, id 2, seq 24653, length 40

ポート番号を指定 : port “ポート番号(プロトコル名も可)”

表示したいポート番号を指定します。デフォルトではtcp、udp共通です。また送信元/宛先も両方共表示されます。
またウェルノウンなポート番号(SSHなら22、HTTPなら80など)ならプロトコル名でもOKです。

# tcpdump -i ens32 port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:51:51.475653 IP centos7.ssh > host1.53698: Flags [P.], seq 23108672:23108912, ack 3372973860, win 162, length 240
12:51:51.476882 IP host1.53698 > centos7.ssh: Flags [.], ack 240, win 254, length 0

# tcpdump -i ens32 port ssh
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:51:55.193812 IP centos7.ssh > host1.53698: Flags [P.], seq 23108692:23109912, ack 3372973811, win 162, length 240
12:51:55.193832 IP host1.53698 > centos7.ssh: Flags [.], ack 240, win 254, length 0

なお、-p や host , port を複数条件で使う場合、間を “and” や “or” でつなぐことで実現できます。

### and条件
# tcpdump -i ens32 -p icmp and dst centos7
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes

### or条件
# tcpdump -i ens32 -p icmp or dst centos7
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens32, link-type EN10MB (Ethernet), capture size 65535 bytes
12:42:21.347242 IP 192.168.0.100.domain > centos7.34792: 28576 NXDomain 0/1/0 (100)
スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link