Tcpdumpは、ネットワークトラブルシューティングコマンドであり、パケットスニファとも呼ばれ、ネットワークからのパケットをキャプチャして表示するために使用されます。 Tcpdumpを使用すると、ユーザーは、コンピューターが接続されているネットワークを介して送受信されるTCP / IPおよびその他のパケット(UDP、ARP、またはICMP)をキャプチャして表示できます。
パケットにフィルターを適用して、見たくないトラフィックを回避できます。ローカルネットワークを通過するすべてのデータをキャプチャし、後で分析するためにそのデータをファイルに入れることができます。 tcpdumpコマンドを実行するには、rootまたはsudo権限を持つユーザーが必要です。
このチュートリアルでは、tcpdumpコマンドを使用してLinuxマシンを流れるトラフィックを分析する方法を学習します。
1。インターフェイスでトラフィックをキャプチャする
オプションなしでtcpdumpを使用すると、すべてのインターフェースのトラフィックが分析され、次のコマンドが実行されます。
$ sudo tcpdump
停止するには、Ctrl+Cボタンを押す必要があります。
特定のインターフェースでトラフィックをキャプチャするには、 -i
を使用します オプションで、パケット数を -c
で制限します オプション:
次のtcpdumpの例では、「ens160」インターフェースを分析し、パケットを5に制限しています。
$ sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured
2)特定のホストでトラフィックをキャプチャする
-host
を使用して、特定のホストからの着信パケットと発信パケットをキャプチャできます。 オプション。
$ sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219
これで、要求パケットと応答パケットの両方を確認できます。
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2020-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2020-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2020-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2020-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
3)ポートでパケットを検索
指定されたポート番号へのパケットを検索するには、 -port
を使用します オプション。
'ens160'ネットワークインターフェイスを分析し、ポート22からのパケット数を5に制限すると仮定して、次のコマンドを実行してみましょう。
$ sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
パケットを傍受するときにポートを無視するには、 not port
を使用します 。
22以外の「ens160」ネットワークインターフェイスポートを分析する場合は、次のコマンドを実行します。
$ sudo tcpdump -i ens160 -nn not port 22
ネットワークトラフィックをキャプチャするために、さまざまなポートを使用できます。
たとえば、ポート範囲(ポート20からポート23)でens160ネットワークインターフェイスを分析する場合は、次のコマンドを実行します。
$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23
4)特定のプロトコルからパケットをキャプチャする
ICMP(インターネット制御メッセージプロトコル)またはTCP(伝送制御プロトコル)パケットのみをキャプチャするかどうかを決定できます。次のコマンドは、TCPパケットのみをキャプチャします。
$ sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212
5)ログを特定のファイルに保存
キャプチャしたパケットをファイルに保存することができます。デフォルトでは、パケットをファイルにキャプチャすると、各パケットから68バイトのデータのみが保存されます。残りの情報は無視されます。
-s
を使用できます 各パケットに保存するバイト数をtcpdumplinuxに通知し、 0
を指定するオプション パケットスナップショットの長さはtcpdumpにパケット全体を保存するように指示するため、次のコマンドを使用します。
$ sudo tcpdump -i ens160 -c 5 -nn tcp -w packets-record.pcap -s 0
Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured
6)tcpdumpレコードファイルを読み取ります
'cat'や'less'などの一般的なコマンドでは、tcpdumpパケットを保存するファイルの内容を読み取ることはできませんが、 -r
を使用する必要があります。 tcpdumpコマンドのパラメーター:
$ sudo tcpdump -r packets-record.pcap
これで、tcpdumpレコードファイルの内容を読み取ることができます:
reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0
このpcapファイルを使用して、Wiresharkで表示して分析することもできます。
7)特定の送信元からのパケットをフィルタリングする
特定の送信元IPからのパケットをフィルタリングするには、 src
を使用できます。 オプション。
$ sudo tcpdump src 100.9.8.40
他の方向のトラフィックを確認したい場合も同様に、 dst
を使用します オプション:
$ sudo tcpdump dst 14.249.62.219
8)ネットワークによるパケットのキャプチャ
ネットワークからの着信と発信をキャプチャするには、 -net
を使用します オプション。次のコマンドは、192.168.0.0 / 24ネットワークからのトラフィックをキャプチャします:
$ sudu tcpdump net 192.169.0.0/24
9)ASCIIでパケットをキャプチャする
キャプチャされたパケットをASCIIで表示するには、 -A
を使用します オプション。これは、Webページをキャプチャするのに便利です。
$ sudo tcpdump -A -i eth0
Tcpdumpは、パケットの内容を16進およびASCII形式で表示し、 -X
を使用することもできます。 オプション:
$ sudo tcpdump -X -i eth0
10)IPV6パケットをキャプチャします
ip6
を使用してIPV6トラフィックをキャプチャできます TCPまたはUDPプロトコルを指定するためのオプションとプロト。
プロト6-TCP
プロト17-UDP
以下は、tcpプロトコルを使用してすべてのipv6トラフィックをキャプチャします。
$ sudo tcpdump -nn ip6 proto 6
11)HTTPユーザーエージェントのフィルター
次のコマンドは、httpリクエストヘッダーからHttpユーザーエージェントとホストをフィルタリングします。
$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
Cookieをキャプチャするには、次のコマンドを使用します。
$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'
12)使用可能なインターフェースのリスト
tcpdumpを使用して、 -D
で使用可能なインターフェースを一覧表示できます。 オプション。
例:
$ sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
13)キャプチャファイルをローテーションする
tcpdumpを使用してトラフィックを長期間キャプチャしている場合は、一定のファイルサイズまたは時間に達したときに新しいファイルを作成することをお勧めします。
次のコマンドは、30分ごとに新しい「network-02-30.pcap」ファイル(-G 1800)を作成します。ファイルは100MB(-C 100)に制限され、ファイル数は24(-W 48)です。
$ sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100
Tcpdumpオプション
Tcpdumpは、出力を拡張または変更するいくつかのオプションを提供します。それらのうちのどれかを確認してください。
-
-i
:指定されたインターフェースでリッスンします。 -
-n
:ホスト名を解決しないでください。-nn
を使用できます ホスト名やポート名を解決しないようにします。 -
-t
:各ダンプ行に人間が読めるタイムスタンプを出力します。-tttt
:人間が読める形式のタイムスタンプ出力を最大限に提供します。 -
-X
:パケットの内容を16進数とASCIIの両方で表示します。 -
-v
、-vv
、-vvv
:返されるパケット情報の量を増やします。 -
-c N
:N個のパケットのみを取得して停止します。 -
-s
:キャプチャのスナップ長(サイズ)をバイト単位で定義します。-s0
を使用します 意図的にキャプチャを減らす場合を除いて、すべてを取得します。 -
-S
:絶対シーケンス番号を出力します。 -
-q
:表示するプロトコル情報が少なくなります。 -
-w<ファイル名>
:生のパケットをファイルに書き込む
演算子ではなくand、orの力
Tcpdumpコマンドは、より正確な結果を除外するために、「and」、「or」、および「not」演算子の組み合わせをサポートしています。
10.20.0.0/16からネットワーク10.30.0.0/16に向かうトラフィックをキャプチャします。人間が読める形式のタイムスタンプ(tt)を表示し、ホスト名やポート番号(nn)を解決せず、詳細出力(vv)を使用し、絶対シーケンスを使用します。数字(S):
$ sudo -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16
UDPプロトコルではないソース192.168.0.10からのトラフィックを表示します:
$ sudo tcpdump src 192.168.0.10 and src net and not udp
特定のホストのarpまたはpingトラフィックをキャプチャし、出力をpacketfile.txtという名前のファイルに保存するには:
$ sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt
Tcpdump出力形式
その形式を理解するために、tcpdump出力から1行新しい行を取りましょう。
10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212
場所:
10:31:13.401128
-パケットが現地時間でキャプチャされた時刻。
IP
-パケットプロトコルがIPV4であることを示しています。
Ubuntu.ssh
-これは送信元IPアドレスまたは送信元ホスト名を示し、.sshはポートを意味します(ここでは22になります)。
117.6.129.86.50376
-これは、宛先IPアドレスとドット(。)をポート番号で区切って示します。
フラグ:
[P。]
-これはTCPフラグフィールドです。
[。]
-ACK(確認)。
[S]
-SYN(接続の開始)。
[P]
-PSH(プッシュデータ)。
[F]
-FIN(接続の終了)。
[R]
-RST(接続のリセット)。
[S。]コード> --SYN-ACK(SynAcKパケット)。
seq 188:400
-シーケンス番号は、パケットに「188」から「400」のデータのバイトが含まれていることを示します。
win 501
-このフィールドはウィンドウサイズであり、受信バッファで使用可能なバイト数を表します。
options [nop、nop、TS val 468736347 ecr 335665367]
-これらは、MSS(最大セグメントサイズ)やウィンドウスケールなどのTCPオプションです。 TCPプロトコルオプションの詳細を参照できます。
長さ212
-これは、ペイロードデータの長さをバイト単位で表します。
結論
パケットスニファは便利な診断ツールですが、悪用される可能性もあります。たとえば、悪意のある個人がパケットスニファを実行して、他の人がネットワーク経由で送信するパスワードをキャプチャする可能性があります。ネットワーク構成によっては、送信側コンピューターと受信側コンピューターのどちらでもパケットスニファが実行されていない場合でも、このトリックが機能する可能性があります。
このため、多くの組織では、限られた状況を除いて、パケットスニファの使用を禁止するポリシーがあります。
tcpdumpコマンドをお楽しみいただけたでしょうか。また、以下のコメントセクションに提案を残してください。