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 命令,請在下面的評論部分留下你的建議。