Tcpdump 示例 – 在 Linux 中捕獲網絡流量

Tcpdump 是一種網絡故障排除命令,也稱為數據包嗅探器,用於捕獲和顯示來自網絡的數據包。 Tcpdump 允許用戶捕獲和顯示通過計算機連接的網絡傳輸或接收的 TCP/IP 和其他數據包(UDP、ARP 或 ICMP)。

您可以對數據包應用過濾器,並可以避免您不想看到的流量。 您可以捕獲通過本地網絡傳輸的所有數據,並將這些數據放入文件中以供日後分析。 要運行 tcpdump 命令,您需要 root 或用戶 sudo 特權。

在本教程中,我們將學習如何使用 tcpdump 命令來分析 Linux 機器上的流量。

1.捕獲接口上的流量

當您使用不帶任何選項的 tcpdump 時,它將分析所有接口上的流量,運行以下命令:

$ sudo tcpdump

您必須按 Ctrl + C 按鈕才能停止它。

要捕獲特定接口上的流量,請使用 -i 選項並將數據包數量限制為 -c 選項:

下面的tcpdump example 分析“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.

如果要分析 ‘ens160’ 網絡接口端口而不是 22,請運行以下命令:

$ sudo tcpdump -i ens160 -nn not port 22

您可以使用一系列端口來捕獲網絡流量。

為了 example,如果要分析ens160網絡接口在端口範圍:從20端口到23端口,執行如下命令:

$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23

4) 從特定協議中捕獲數據包

您可以決定是僅捕獲 ICMP(Internet 控制消息協議)還是 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) Save 登錄到特定文件

可以將捕獲的數據包保存在文件中。 默認情況下,將數據包捕獲到文件中時,它只會保存每個數據包的 68 字節數據。 其餘信息將被忽略。

您可以使用 -s 告訴 tcpdump linux 每個數據包要保存和指定多少字節的選項 0 由於數據包快照長度告訴 tcpdump 保存整個數據包,請使用以下命令:

$ sudo tcpdump -i ens160 -c 5 -nn tcp -w 數據包記錄.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 選項,這很方便捕獲網頁。

$ sudo tcpdump -A -i eth0

tcpdump 還可以以 Hex 和 ASCII 格式顯示數據包內容,然後使用 -X 選項:

$ sudo tcpdump -X -i eth0

10)捕獲IPV6數據包

我們可以使用以下方法捕獲 IPV6 流量 ip6 用於指定 TCP 或 UDP 協議的選項和原型。

proto 6 – TCP

proto 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 選項。

為了 example:

$ 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 分鐘 (-G 1800) 創建一個新的“network-02-30.pcap”文件,文件大小限制為 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 <interface>: 監聽指定的接口。
  • -n: 不要解析主機名。 您可以使用 -nn 不解析主機名或端口名。
  • -t:在每個轉儲行上打印人類可讀的時間戳, -tttt:提供最大程度的人類可讀時間戳輸出。
  • -X: 以 hex 和 ascii 顯示數據包的內容。
  • -v, -vv, -vvv:增加您返回的數據包信息量。
  • -c N: 只得到N個數據包然後停止。
  • -s:以字節為單位定義捕獲的快照長度(大小)。 利用 -s0 獲得一切,除非您有意減少捕獲量。
  • -S: 打印絕對序列號。
  • -q: 顯示較少的協議信息。
  • -w <file name>: 將原始數據包寫入文件而不是

and, or and not 運算符的權力

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 輸出中取出一行以了解其格式。

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(同步數據包)。

seq 188:400 – 序列號指示數據包包含字節“188”到“400”的數據。

win 501 – 該字段是窗口大小,表示接收緩衝區中可用的字節數。

options [nop,nop,TS val 468736347 ecr 335665367] – 這些是 TCP 選項,例如 MSS(最大段大小)或窗口比例。 你可以參考更多 TCP 協議選項.

length 212 – 這表示以字節為單位的有效載荷數據的長度。

結論

儘管數據包嗅探器是有用的診斷工具,但它們也可能被濫用。 例如,不法分子可以運行數據包嗅探器來捕獲其他人通過網絡發送的密碼。 根據您的網絡配置,即使數據包嗅探器未在發送或接收計算機上運行,此技巧也能起作用。

出於這個原因,許多組織都有禁止使用數據包嗅探器的政策,除非在有限的情況下。

我希望你喜歡閱讀 tcpdump 命令,請在下面的評論部分留下你的建議。