本文首發於個人公衆號 Linux雲計算網絡(id: cloud_dev),專一於乾貨分享,號內有 10T 書籍和視頻資源,後臺回覆 「1024」便可領取,歡迎你們關注,二維碼文末能夠掃。
[TOC]express
這篇文章我總結得比較詳盡,能夠當字典查,建議收藏,不過別光顧着收藏,點贊什麼的鼓勵我一下,這能讓我更有動力給你們輸出更好的內容。編程
tcpdump 是一款 Linux 平臺的抓包工具。它能夠抓取涵蓋整個 TCP/IP 協議族的數據包,支持針對網絡層、協議、主機、端口的過濾,並提供 and、or、not 等邏輯語句來過濾無用的信息。vim
tcpdump 是一個很是複雜的工具,掌握它的方方面面實屬不易,也不推薦,可以用它來解決平常工做問題纔是關係。網絡
tcpdump 有不少命令選項,想了解全部選項能夠 Linux 命令行輸入 tcpdump -h
,man tcpdump
查看每一個選項的意思。tcp
[root@by ~]# tcpdump -h tcpdump version 4.9.2 libpcap version 1.5.3 OpenSSL 1.0.2k-fips 26 Jan 2017 Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ] [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ] [ -Q|-P in|out|inout ] [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ] [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
下面列舉一些經常使用選項:工具
-X
一塊兒使用,獲取 http 能夠用 tcpdump -nSA port 80
-i any
顯示全部網卡-s 0
的話,會截取所有內容。網絡報文是不少的,不少時候咱們在主機上抓包,會抓到不少咱們並不關心的無用包,而後要從這些包裏面去找咱們須要的信息,無疑是一件費時費力的事情,tcpdump 提供了靈活的語法能夠精確獲取咱們關心的數據,這些語法說得專業點就是過濾器。post
過濾器簡單可分爲三類:協議(proto)、傳輸方向(dir)和類型(type)。測試
通常的 表達式格式 爲:ui
測試環境 IP:172.18.82.173雲計算
抓取主機 172.18.82.173 上全部收到(DST_IP)和發出(SRC_IP)的全部數據包
tcpdump host 172.18.82.173
抓取通過指定網口 interface ,而且 DST_IP 或 SRC_IP 是 172.18.82.173 的數據包
tcpdump -i eth0 host 172.18.82.173
篩選 SRC_IP,抓取通過 interface 且從 172.18.82.173 發出的包
tcpdump -i eth0 src host 172.18.82.173
篩選 DST_IP,抓取通過 interface 且發送到 172.18.82.173 的包
tcpdump -i eth0 dst host 172.18.82.173
抓取主機 200.200.200.1 和主機 200.200.200.2 或 200.200.200.3 通訊的包
tcpdump host 200.200.200.1 and \(200.200.200.2 or 200.200.200.3\)
抓取主機 200.200.200.1 和除了主機 200.200.200.2 以外全部主機通訊的包
tcpdump ip host 200.200.200.1 and ! 200.200.200.2
抓取全部端口,顯示 IP 地址
tcpdump -nS
抓取某端口上的包
tcpdump port 22
抓取通過指定 interface,而且 DST_PORT 或 SRC_PORT 是 22 的數據包
tcpdump -i eth0 port 22
篩選 SRC_PORT
tcpdump -i eth0 src port 22
篩選 DST_PORT
tcpdump -i eth0 dst port 22
好比但願查看發送到 host 172.18.82.173 的網口 eth0 的 22 號端口的包
[root@by ~]# tcpdump -i eth0 -nnt dst host 172.18.82.173 and port 22 -c 1 -vv tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes IP (tos 0x14, ttl 114, id 27674, offset 0, flags [DF], proto TCP (6), length 40) 113.98.59.61.51830 > 172.18.82.173.22: Flags [.], cksum 0x7fe3 (correct), seq 19775964, ack 1564316089, win 2053, length 0
抓取通過指定 interface,而且 DST_NET 或 SRC_NET 是 172.18.82 的包
tcpdump -i eth0 net 172.18.82
篩選 SRC_NET
tcpdump -i eth0 src net 172.18.82
篩選 DST_NET
tcpdump -i eth0 dst net 172.18.82
tcpdump -i eth0 icmp tcpdump -i eth0 ip tcpdump -i eth0 tcp tcpdump -i eth0 udp tcpdump -i eth0 arp
抓取通過 interface eth0 發送到 host 200.200.200.1 或 200.200.200.2 的 TCP 協議 22 號端口的數據包
tcpdump -i eth0 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 200.200.200.1) or (dst host 200.200.200.2)))'
PS:對於複雜的過濾器表達式,爲了邏輯清晰,可使用 ()
,不過默認狀況下,tcpdump 會將 ()
當作特殊字符,因此必須使用 ''
來消除歧義。
抓取通過 interface eth0, DST_MAC 或 SRC_MAC 地址是 00:16:3e:12:16:e7 的 ICMP 數據包
tcpdump -i eth0 '((icmp) and ((ether host 00:16:3e:12:16:e7)))' -nnvv
抓取通過 interface eth0,目標網絡是 172.18 但目標主機又不是 172.18.82.173 的 TCP 且非 22 號端口號的數據包
tcpdump -i eth0 -nntvv '((dst net 172.18) and (not dst host 172.18.82.173) and (tcp) and (not port 22))'
抓取流入 interface eth0,host 爲 172.18.82.173 且協議爲 ICMP 的數據包
tcpdump -i eth0 -nntvv -P in host 172.18.82.173 and icmp
抓取流出 interface eth0,host 爲 172.18.82.173 且協議爲 ICMP 的數據包
tcpdump -i eth0 -nntvv -P out host 172.18.82.173 and icmp
tcpdump 抓包的時候,默認是打印到屏幕輸出,若是是抓取包少還好,若是包不少,不少行數據,刷刷刷從眼前一閃而過,根原本不及看清內容。不過,tcpdump 提供了將抓取的數據保存到文件的功能,查看文件就方便分析多了,並且還能與其餘圖形工具一塊兒配合分析,好比 wireshark、Snort 等。
tcpdump -w capture_file.pcap port 80 # 把全部 80 端口的數據導出到文件
tcpdump -nXr capture_file.pcap host host1
PS:.pcap
格式的文件須要用 wireshark、Snort 等工具查看,使用 vim
或 cat
會出現亂碼。
tcpdump 的輸出格式整體上爲:
系統時間 源主機.端口 > 目標主機.端口 數據包參數
好比下面的例子,顯示了 TCP 的三次握手過程:
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64) 192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0 21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44) 124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0 21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40) 192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
第一條是 SYN
報文,經過 Flags[S]
看出。第二條是 [S.]
,表示 SYN-ACK
報文。常見的 TCP 報文的 Flags 以下:
[S]
: SYN(開始鏈接)[.]
: 沒有 Flag[P]
: PSH(推送數據)[F]
: FIN (結束鏈接)[R]
: RST(重置鏈接)本文能夠當字典查閱,記住一些經常使用的 tcpdump 抓包案例,其餘的用到再經過 man tcpdump
輔助編寫。和 wireshark 等圖形化工具配合使用,能更加深理解。
後臺回覆「<font color=red>加羣</font>」,帶你進入高手如雲交流羣
參考
https://blog.csdn.net/Jmilk/a...
https://danielmiessler.com/st...
http://bencane.com/2014/10/13...
個人公衆號 「Linux雲計算網絡」(id: cloud_dev) ,號內有 10T 書籍和視頻資源,後臺回覆 「1024」 便可領取,分享的內容包括但不限於 Linux、網絡、雲計算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術等內容,歡迎你們關注。