<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 4962字,需瀏覽 10分鐘

           ·

          2022-04-30 00:15

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

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

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

          應(yīng)用場景

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

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

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

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

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

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

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

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

          工作原理

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

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

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

          思考:這里分享一個真實的面試題

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

          通過上圖,我們可以很輕易的回答此問題。

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

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

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

          我們先通過幾個簡單的示例來介紹 tcpdump 基本用法。

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

          $?tcpdump?

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

          $?tcpdump?-i?eth0

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

          $?tcpdump?-n?-i?eth0

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

          $?tcpdump?-ni?eth0?host?192.168.1.100

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

          $?tcpdump?-ni?eth0?src?host?10.1.1.2

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

          $?tcpdump?-ni?eth0?dst?host?10.1.1.2

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

          $?tcpdump?-ni?eth0?-c?10?dst?host?192.168.1.200

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

          $?tcpdump?-ni?eth0?dst?port?22

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

          $?tcpdump?-ni?eth0?-c?5?icmp

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

          $?tcpdump?-ni?eth0?arp

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

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

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

          $?tcpdump?-ni?eth0?ip6

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

          $?tcpdump?-ni?eth0?portrange?80-9000

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

          $?tcpdump?-ni?eth0?net?192.168.1.0/24

          實戰(zhàn):高級進階

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

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

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

          $?tcpdump?-ni?eth0?src?192.168.1.100?and?dst?port?22

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

          $?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. 抓取來自某個主機,發(fā)往非 ssh 端口的流量

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

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

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

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

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

          $?tcpdump?-ni?less?64

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

          $?tcpdump?-ni?eth0?greater?64

          等于 64 字節(jié):

          $?tcpdump?-ni?eth0?length?==?64

          6. 過濾 TCP 特殊標記的數(shù)據(jù)包

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

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

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

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

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

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

          抓取 TCP 連接中的 SYNFIN

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

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

          $?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ù)包

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

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

          9. 抓取 HTTP 報文,0x4754GET 前兩字符的值,0x4854HTTP 前兩個字符的值

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

          常用選項

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

          (一)基礎(chǔ)選項

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

          (二)輸出選項

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

          過濾表達式

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

          (一)操作對象

          表達式中可以操作的對象有如下幾種:

          • type,表示對象的類型,比如:hostnetportportrange,如果不指定 type 的話,默認是 host
          • dir:表示傳輸?shù)姆较颍扇〉姆绞綖椋?code style="font-size: 14px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(248, 35, 117);background: rgb(248, 248, 248);">src、dst
          • proto:表示協(xié)議,可選的協(xié)議有:etheripip6arpicmptcpudp

          (二)條件組合

          表達對象之間還可以通過關(guān)鍵字 andornot 進行連接,組成功能更強大的表達式。

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

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

          經(jīng)驗

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

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

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

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

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

          5. 抓包時,盡可能不要使用 any 接口來抓包。

          6. 抓包時,盡可能指定詳細的數(shù)據(jù)包過濾表達式,減少無用數(shù)據(jù)包的拷貝。

          7. 抓包時,盡量指定 -n 選項,減少解析主機和端口帶來的性能開銷。

          最后

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

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

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

          ~~~ End?~~~


          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  а√中文官网在线8 | 操碰视频在线 | 日韩欧美一级操逼大片 | 成人亚洲精品777777大片 | 99精品视频免费观看, |