自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux 網(wǎng)絡(luò)分析必備技能:Tcpdump 實(shí)戰(zhàn)詳解

系統(tǒng) Linux
今天要分享的是 tcpdump,它是 Linux 系統(tǒng)中特別有用的網(wǎng)絡(luò)工具,通常用于故障診斷、網(wǎng)絡(luò)分析,功能非常的強(qiáng)大。

 

[[383745]]

今天要分享的是 tcpdump,它是 Linux 系統(tǒng)中特別有用的網(wǎng)絡(luò)工具,通常用于故障診斷、網(wǎng)絡(luò)分析,功能非常的強(qiáng)大。

相對(duì)于其它 Linux 工具而言,tcpdump 是復(fù)雜的。當(dāng)然我也不推薦你去學(xué)習(xí)它的全部,學(xué)以致用,能夠解決工作中的問(wèn)題才是關(guān)鍵。

本文會(huì)從應(yīng)用場(chǎng)景和基礎(chǔ)原理出發(fā),提供豐富的實(shí)踐案例,讓你快速的掌握 tcpdump 的核心使用方法,足以應(yīng)對(duì)日常工作的需求。

應(yīng)用場(chǎng)景

在日常工作中遇到的很多網(wǎng)絡(luò)問(wèn)題都可以通過(guò) tcpdump 優(yōu)雅的解決:

1. 相信大多數(shù)同學(xué)都遇到過(guò) SSH 連接服務(wù)器緩慢,通過(guò) tcpdump 抓包,可以快速定位到具體原因,一般都是因?yàn)?DNS 解析速度太慢。

2. 當(dāng)我們工程師與用戶面對(duì)網(wǎng)絡(luò)問(wèn)題爭(zhēng)執(zhí)不下時(shí),通過(guò) tcpdump 抓包,可以快速定位故障原因,輕松甩鍋,毫無(wú)壓力。

3. 當(dāng)我們新開(kāi)發(fā)的網(wǎng)絡(luò)程序,沒(méi)有按照預(yù)期工作時(shí),通過(guò) tcpdump 收集相關(guān)數(shù)據(jù)包,從包層面分析具體原因,讓問(wèn)題迎刃而解。

4. 當(dāng)我們的網(wǎng)絡(luò)程序性能比較低時(shí),通過(guò) tcpdump 分析數(shù)據(jù)流特征,結(jié)合相關(guān)協(xié)議來(lái)進(jìn)行網(wǎng)絡(luò)參數(shù)優(yōu)化,提高系統(tǒng)網(wǎng)絡(luò)性能。

5. 當(dāng)我們學(xué)習(xí)網(wǎng)絡(luò)協(xié)議時(shí),通過(guò) tcpdump 抓包,分析協(xié)議格式,幫助我們更直觀、有效、快速的學(xué)習(xí)網(wǎng)絡(luò)協(xié)議。

上述只是簡(jiǎn)單羅列幾種常見(jiàn)的應(yīng)用場(chǎng)景,而 tcpdump 在網(wǎng)絡(luò)診斷、網(wǎng)絡(luò)優(yōu)化、協(xié)議學(xué)習(xí)方面,確實(shí)是一款非常強(qiáng)大的網(wǎng)絡(luò)工具,只要存在網(wǎng)絡(luò)問(wèn)題的地方,總能看到它的身影。

熟練的運(yùn)用 tcpdump,可以幫助我們解決工作中各種網(wǎng)絡(luò)問(wèn)題,下邊我們先簡(jiǎn)單學(xué)習(xí)下它的工作原理。

工作原理

tcpdump 是 Linux 系統(tǒng)中非常有用的網(wǎng)絡(luò)工具,運(yùn)行在用戶態(tài),本質(zhì)上是通過(guò)調(diào)用 libpcap 庫(kù)的各種 api 來(lái)實(shí)現(xiàn)數(shù)據(jù)包的抓取功能。

通過(guò)上圖,我們可以很直觀的看到,數(shù)據(jù)包到達(dá)網(wǎng)卡后,經(jīng)過(guò)數(shù)據(jù)包過(guò)濾器(BPF)篩選后,拷貝至用戶態(tài)的 tcpdump 程序,以供 tcpdump 工具進(jìn)行后續(xù)的處理工作,輸出或保存到 pcap 文件。

數(shù)據(jù)包過(guò)濾器(BPF)主要作用,就是根據(jù)用戶輸入的過(guò)濾規(guī)則,只將用戶關(guān)心的數(shù)據(jù)包拷貝至 tcpdump,這樣能夠減少不必要的數(shù)據(jù)包拷貝,降低抓包帶來(lái)的性能損耗。

思考:這里分享一個(gè)真實(shí)的面試題

面試官:如果某些數(shù)據(jù)包被 iptables 封禁,是否可以通過(guò) tcpdump 抓到包?

通過(guò)上圖,我們可以很輕易的回答此問(wèn)題。

因?yàn)?Linux 系統(tǒng)中 netfilter 是工作在協(xié)議棧階段的,tcpdump 的過(guò)濾器(BPF)工作位置在協(xié)議棧之前,所以當(dāng)然是可以抓到包了!

我們理解了 tcpdump 基本原理之后,下邊直接進(jìn)入實(shí)戰(zhàn)!

實(shí)戰(zhàn):基礎(chǔ)用法

我們先通過(guò)幾個(gè)簡(jiǎn)單的示例來(lái)介紹 tcpdump 基本用法。

1. 不加任何參數(shù),默認(rèn)情況下將抓取第一個(gè)非 lo 網(wǎng)卡上所有的數(shù)據(jù)包

  1. $ tcpdump  

2. 抓取 eth0 網(wǎng)卡上的所有數(shù)據(jù)包

  1. $ tcpdump -i eth0 

3. 抓包時(shí)指定 -n 選項(xiàng),不解析主機(jī)和端口名。這個(gè)參數(shù)很關(guān)鍵,會(huì)影響抓包的性能,一般抓包時(shí)都需要指定該選項(xiàng)。

  1. $ tcpdump -n -i eth0 

4. 抓取指定主機(jī) 192.168.1.100 的所有數(shù)據(jù)包

  1. $ tcpdump -ni eth0 host 192.168.1.100 

5. 抓取指定主機(jī) 10.1.1.2 發(fā)送的數(shù)據(jù)包

  1. $ tcpdump -ni eth0 src host 10.1.1.2 

6. 抓取發(fā)送給 10.1.1.2 的所有數(shù)據(jù)包

  1. $ tcpdump -ni eth0 dst host 10.1.1.2 

7. 抓取 eth0 網(wǎng)卡上發(fā)往指定主機(jī)的數(shù)據(jù)包,抓到 10 個(gè)包就停止,這個(gè)參數(shù)也比較常用

  1. $ tcpdump -ni eth0 -c 10 dst host 192.168.1.200 

8. 抓取 eth0 網(wǎng)卡上所有 SSH 請(qǐng)求數(shù)據(jù)包,SSH 默認(rèn)端口是 22

  1. $ tcpdump -ni eth0 dst port 22 

9. 抓取 eth0 網(wǎng)卡上 5 個(gè) ping 數(shù)據(jù)包

  1. $ tcpdump -ni eth0 -c 5 icmp 

10. 抓取 eth0 網(wǎng)卡上所有的 arp 數(shù)據(jù)包

  1. $ tcpdump -ni eth0 arp 

11. 使用十六進(jìn)制輸出,當(dāng)你想檢查數(shù)據(jù)包內(nèi)容是否有問(wèn)題時(shí),十六進(jìn)制輸出會(huì)很有幫助。

  1. $ tcpdump -ni eth0 -c 1 arp -X 
  2. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 
  3. 12:13:31.602995 ARP, Request who-has 172.17.92.133 tell 172.17.95.253, length 28 
  4.     0x0000:  0001 0800 0604 0001 eeff ffff ffff ac11  ................ 
  5.     0x0010:  5ffd 0000 0000 0000 ac11 5c85            _.........\. 

12. 只抓取 eth0 網(wǎng)卡上 IPv6 的流量

  1. $ tcpdump -ni eth0 ip6 

13. 抓取指定端口范圍的流量

  1. $ tcpdump -ni eth0 portrange 80-9000 

14. 抓取指定網(wǎng)段的流量

  1. $ tcpdump -ni eth0 net 192.168.1.0/24 

實(shí)戰(zhàn):高級(jí)進(jìn)階

tcpdump 強(qiáng)大的功能和靈活的策略,主要體現(xiàn)在過(guò)濾器(BPF)強(qiáng)大的表達(dá)式組合能力。

本節(jié)主要分享一些常見(jiàn)的所謂高級(jí)用法,希望讀者能夠舉一反三,根據(jù)自己實(shí)際需求,來(lái)靈活使用它。

1. 抓取指定客戶端訪問(wèn) ssh 的數(shù)據(jù)包

  1. $ tcpdump -ni eth0 src 192.168.1.100 and dst port 22 

2. 抓取從某個(gè)網(wǎng)段來(lái),到某個(gè)網(wǎng)段去的流量

  1. $ tcpdump -ni eth0 src net 192.168.1.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16 

3. 抓取來(lái)自某個(gè)主機(jī),發(fā)往非 ssh 端口的流量

  1. $ tcpdump -ni eth0 src 10.0.2.4 and not dst port 22 

4. 當(dāng)構(gòu)建復(fù)雜查詢的時(shí)候,你可能需要使用引號(hào),單引號(hào)告訴 tcpdump 忽略特定的特殊字符,這里的 () 就是特殊符號(hào),如果不用引號(hào)的話,就需要使用轉(zhuǎn)義字符

  1. $ tcpdump -ni eth0 'src 10.0.2.4 and (dst port 3389 or 22)' 

5. 基于包大小進(jìn)行篩選,如果你正在查看特定的包大小,可以使用這個(gè)參數(shù)

小于等于 64 字節(jié):

  1. $ tcpdump -ni less 64 

大于等于 64 字節(jié):

  1. $ tcpdump -ni eth0 greater 64 

等于 64 字節(jié):

  1. $ tcpdump -ni eth0 length == 64 

6. 過(guò)濾 TCP 特殊標(biāo)記的數(shù)據(jù)包

抓取某主機(jī)發(fā)送的 RST 數(shù)據(jù)包:

  1. $ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-rst) != 0' 

抓取某主機(jī)發(fā)送的 SYN 數(shù)據(jù)包:

  1. $ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-syn) != 0' 

抓取某主機(jī)發(fā)送的 FIN 數(shù)據(jù)包:

  1. $ tcpdump -ni eth0 src host 192.168.1.100 and 'tcp[tcpflags] & (tcp-fin) != 0' 

抓取 TCP 連接中的 SYN 或 FIN 包

  1. $ tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' 

7. 抓取所有非 ping 類型的 ICMP 包

  1. $ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' 

8. 抓取端口是 80,網(wǎng)絡(luò)層協(xié)議為 IPv4, 并且含有數(shù)據(jù),而不是 SYN、FIN 以及 ACK 等不含數(shù)據(jù)的數(shù)據(jù)包

  1. $ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' 

解釋一下這個(gè)復(fù)雜的表達(dá)式,具體含義就是,整個(gè) IP 數(shù)據(jù)包長(zhǎng)度減去 IP 頭長(zhǎng)度,再減去 TCP 頭的長(zhǎng)度,結(jié)果不為 0,就表示數(shù)據(jù)包有 data,如果還不是很理解,需要自行補(bǔ)一下 tcp/ip 協(xié)議

9. 抓取 HTTP 報(bào)文,0x4754 是 GET 前兩字符的值,0x4854 是 HTTP 前兩個(gè)字符的值

  1. $ tcpdump  -ni eth0 'tcp[20:2]=0x4745 or tcp[20:2]=0x4854' 

常用選項(xiàng)

通過(guò)上述的實(shí)戰(zhàn)案例,相信大家已經(jīng)掌握的 tcpdump 基本用法,在這里來(lái)詳細(xì)總結(jié)一下常用的選項(xiàng)參數(shù)。

(一)基礎(chǔ)選項(xiàng)

  • -i:指定接口
  • -D:列出可用于抓包的接口
  • -s:指定數(shù)據(jù)包抓取的長(zhǎng)度
  • -c:指定要抓取的數(shù)據(jù)包的數(shù)量
  • -w:將抓包數(shù)據(jù)保存在文件中
  • -r:從文件中讀取數(shù)據(jù)
  • -C:指定文件大小,與 -w 配合使用
  • -F:從文件中讀取抓包的表達(dá)式
  • -n:不解析主機(jī)和端口號(hào),這個(gè)參數(shù)很重要,一般都需要加上
  • -P:指定要抓取的包是流入還是流出的包,可以指定的值 in、out、inout

(二)輸出選項(xiàng)

  • -e:輸出信息中包含數(shù)據(jù)鏈路層頭部信息
  • -t:顯示時(shí)間戳,tttt 顯示更詳細(xì)的時(shí)間
  • -X:顯示十六進(jìn)制格式
  • -v:顯示詳細(xì)的報(bào)文信息,嘗試 -vvv,v 越多顯示越詳細(xì)

過(guò)濾表達(dá)式

tcpdump 強(qiáng)大的功能和靈活的策略,主要體現(xiàn)在過(guò)濾器(BPF)強(qiáng)大的表達(dá)式組合能力。

(一)操作對(duì)象

表達(dá)式中可以操作的對(duì)象有如下幾種:

  • type,表示對(duì)象的類型,比如:host、net、port、portrange,如果不指定 type 的話,默認(rèn)是 host
  • dir:表示傳輸?shù)姆较?,可取的方式為:src、dst。
  • proto:表示協(xié)議,可選的協(xié)議有:ether、ip、ip6、arp、icmp、tcp、udp。

(二)條件組合

表達(dá)對(duì)象之間還可以通過(guò)關(guān)鍵字 and、or、not 進(jìn)行連接,組成功能更強(qiáng)大的表達(dá)式。

  • or:表示或操作
  • and:表示與操作
  • not:表示非操作

建議看到這里后,再回頭去看實(shí)戰(zhàn)篇章的示例,相信必定會(huì)有更深的理解。如果是這樣,那就達(dá)到了我預(yù)期的效果了!

經(jīng)驗(yàn)

到這里就不再加新知識(shí)點(diǎn)了,分享一些工作中總結(jié)的經(jīng)驗(yàn):

1. 我們要知道 tcpdump 不是萬(wàn)能藥,并不能解決所有的網(wǎng)絡(luò)問(wèn)題。

2. 在高流量場(chǎng)景下,抓包可能會(huì)影響系統(tǒng)性能,如果是在生產(chǎn)環(huán)境,請(qǐng)謹(jǐn)慎使用!

3. 在高流量場(chǎng)景下,tcpdump 并不適合做流量統(tǒng)計(jì),如果需要,可以使用交換機(jī)鏡像的方式去分析統(tǒng)計(jì)。

4. 在 Linux 上使用 tcpdump 抓包,結(jié)合 wireshark 工具進(jìn)行數(shù)據(jù)分析,能事半功倍。

5. 抓包時(shí),盡可能不要使用 any 接口來(lái)抓包。

6. 抓包時(shí),盡可能指定詳細(xì)的數(shù)據(jù)包過(guò)濾表達(dá)式,減少無(wú)用數(shù)據(jù)包的拷貝。

7. 抓包時(shí),盡量指定 -n 選項(xiàng),減少解析主機(jī)和端口帶來(lái)的性能開(kāi)銷。

最后

通過(guò)上述內(nèi)容,我們知道 tcpdump 是一款功能強(qiáng)大的故障診斷、網(wǎng)絡(luò)分析工具。在我們的日常工作中,遇到的網(wǎng)絡(luò)問(wèn)題總是能夠通過(guò) tcpdump 來(lái)解決。

不過(guò) tcpdump 相對(duì)于其它 Linux 命令來(lái)說(shuō),會(huì)復(fù)雜很多,但鑒于它強(qiáng)大功能的誘惑力,我們多花一些時(shí)間是值得的。要想很好地掌握 tcpdump,需要對(duì)網(wǎng)絡(luò)報(bào)文(TCP/IP協(xié)議)有一定的了解。

當(dāng)然,對(duì)于簡(jiǎn)單的使用來(lái)說(shuō),只要有網(wǎng)絡(luò)基礎(chǔ)概念就行,掌握了 tcpdump 常用方法,就足以應(yīng)付工作中大部分網(wǎng)絡(luò)相關(guān)的疑難雜癥了。

本文轉(zhuǎn)載自微信公眾號(hào)「編程修養(yǎng)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系編程修養(yǎng)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 編程修養(yǎng)
相關(guān)推薦

2021-02-23 10:05:39

Linux網(wǎng)絡(luò)分析tcpdump

2013-12-18 10:56:48

Linux運(yùn)維運(yùn)維技能

2021-01-21 10:50:03

僵尸網(wǎng)絡(luò)FreakOutLinux 系統(tǒng)

2010-05-25 14:32:09

Linux tcpdu

2009-08-13 21:51:18

2022-07-05 10:50:56

運(yùn)維Linuxtcpdump

2015-07-06 10:06:57

網(wǎng)絡(luò)分析高級(jí)運(yùn)營(yíng)分析

2009-11-17 17:26:03

2009-11-17 18:55:44

2016-10-15 00:03:59

社交網(wǎng)絡(luò)分析SNA

2009-12-31 10:36:48

網(wǎng)絡(luò)分析高彥剛

2013-08-26 10:10:23

2011-04-11 13:58:09

TCP

2013-04-09 09:51:25

科來(lái)網(wǎng)絡(luò)分析

2009-11-18 16:44:58

2017-05-03 08:59:07

網(wǎng)絡(luò)分析數(shù)據(jù)

2015-12-11 10:09:38

2016-02-23 13:16:08

網(wǎng)絡(luò)監(jiān)控網(wǎng)絡(luò)可用性監(jiān)控系統(tǒng)

2022-10-18 10:00:09

Linuxtcpdump命令

2010-04-02 22:19:40

網(wǎng)絡(luò)分析產(chǎn)品安全防御科來(lái)軟件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)