tcpdump
是 Unix/Linux 下的抓包工具瑞筐,在 macOS 上也有實現(xiàn)猪贪。這個命令可以針對指定網(wǎng)卡、端口、協(xié)議進行抓包粱侣,這里記錄下使用方法懂牧。
一巷查、獲取適配器列表
使用 -D
或 --list-interfaces
參數(shù)
$ tcpdump -D
得到如下結(jié)果:
1.en0 [Up, Running]
2.p2p0 [Up, Running]
3.awdl0 [Up, Running]
4.bridge0 [Up, Running]
5.utun0 [Up, Running]
6.en1 [Up, Running]
7.utun1 [Up, Running]
8.en2 [Up, Running]
9.utun2 [Up, Running]
10.lo0 [Up, Running, Loopback]
11.gif0
12.stf0
13.XHC20
其中的適配器名稱部分浮梢,可以使用 -i
參數(shù)監(jiān)聽此適配器的通訊。
二唐含、監(jiān)聽適配器
使用 -i
或 --interface
參數(shù)監(jiān)聽適配器浅浮,適配器可以用序號
或名字
來表示,這些內(nèi)容可以通過 -D
參數(shù)獲取捷枯。macOS 下監(jiān)聽適配器的話滚秩,必須使用 root 權(quán)限。
如果需要詳細查看報內(nèi)容淮捆,可以使用 -X
參數(shù)郁油。
# 監(jiān)聽適配器 en0 的通訊
$ sudo tcpdump -i en0
# 或者使用 --interface 參數(shù)
$ sudo tcpdump --interface en0
# 或者使用 --interface= 參數(shù),效果一樣
$ sudo tcpdump --interface=en0
三攀痊、監(jiān)聽適配器過濾
使用 -D
參數(shù)拿到適配器列表后桐腌,結(jié)合 -i
參數(shù)就可以監(jiān)聽適配器了。但是這樣的話會監(jiān)聽到所有的通訊苟径,可以根據(jù)需要哩掺,針對感興趣的內(nèi)容進行過濾。
1涩笤、過濾主機
- 抓取所有經(jīng)過 eth1嚼吞,目的或源地址是 192.168.1.1 的網(wǎng)絡(luò)數(shù)據(jù)
$ sudo tcpdump -i eth1 host 192.168.1.1
- 源地址
$ sudo tcpdump -i eth1 src host 192.168.1.1
- 目的地址
$ sudo tcpdump -i eth1 dst host 192.168.1.1
2、過濾端口
- 抓取所有經(jīng)過 eth1蹬碧,目的或源端口是 25 的網(wǎng)絡(luò)數(shù)據(jù)
$ sudo tcpdump -i eth1 port 25
- 源端口
$ sudo tcpdump -i eth1 src port 25
- 目的端口
$ sudo tcpdump -i eth1 dst port 25
3舱禽、過濾網(wǎng)段
- 抓取所有經(jīng)過 eth1,目的或源網(wǎng)段是 192.168 的網(wǎng)絡(luò)數(shù)據(jù)
$ sudo tcpdump -i eth1 net 192.168
- 源網(wǎng)段
$ sudo tcpdump -i eth1 src net 192.168
- 目的網(wǎng)段
$ sudo tcpdump -i eth1 dst net 192.168
4恩沽、協(xié)議過濾
$ sudo tcpdump -i eth1 arp
$ sudo tcpdump -i eth1 ip
$ sudo tcpdump -i eth1 tcp
$ sudo tcpdump -i eth1 udp
$ sudo tcpdump -i eth1 icmp
5誊稚、使用表達式
- 與:
&&
或and
- 或:
||
或or
- 非:
!
或not
四、選項
tcpdump 的選項也很多罗心,要想知道所有選項的話里伯,請參考 man tcpdump
,下面只記錄 tcpdump 最常用的選項渤闷。
需要注意的是疾瓮,tcpdump 默認只會截取前 96 字節(jié)的內(nèi)容,要想截取所有的報文內(nèi)容飒箭,可以使用 -s number
狼电, number
就是你要截取的報文字節(jié)數(shù),如果是 0 的話弦蹂,表示截取報文全部內(nèi)容肩碟。
-
-n
表示不要解析域名,直接顯示 ip凸椿。 -
-nn
不要解析域名和端口 -
-X
同時用 hex 和 ascii 顯示報文的內(nèi)容削祈。 -
-XX
同-X
,但同時顯示以太網(wǎng)頭部脑漫。 -
-S
顯示絕對的序列號(sequence number)髓抑,而不是相對編號。 -
-i any
監(jiān)聽所有的網(wǎng)卡 -
-v, -vv, -vvv
:顯示更多的詳細信息 -
-c number
: 截取 number 個報文窿撬,然后結(jié)束 -
-A
: 只使用 ascii 打印報文的全部數(shù)據(jù)启昧,不要和-X
一起使用。截取 http 請求的時候可以用sudo tcpdump -nSA port 80
劈伴!
五密末、Flags
tcpdump Flags:
TCP Flag | tcpdump Flag | Meaning |
---|---|---|
SYN | [S] |
Syn packet, a session establishment request. |
ACK | [A] |
Ack packet, acknowledge sender’s data. |
FIN | [F] |
Finish flag, indication of termination. |
RESET | [R] |
Reset, indication of immediate abort of conn. |
PUSH | [P] |
Push, immediate push of data from sender. |
URGENT | [U] |
Urgent, takes precedence over other data. |
NONE | [.] |
Placeholder, usually used for ACK. |
六、實例
- 抓取所有經(jīng)過 eth1跛璧,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 數(shù)據(jù)
$ sudo tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host
192.168.1.200)))'
- 抓取所有經(jīng)過 eth1严里,目標 MAC 地址是 00:01:02:03:04:05 的 ICMP 數(shù)據(jù)
$ sudo tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
- 抓取所有經(jīng)過 eth1,目的網(wǎng)絡(luò)是 192.168追城,但目的主機不是 192.168.1.200 的 TCP 數(shù)據(jù)
$ sudo tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
- 只抓 SYN 包
$ sudo tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
- 抓 SYN, ACK
$ sudo tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
- 抓 SMTP 數(shù)據(jù)
抓取數(shù)據(jù)區(qū)開始為MAIL
的包刹碾,MAIL
的十六進制為0x4d41494c
。
$ sudo tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
- 抓 HTTP GET 數(shù)據(jù)
GET
(注意后面有空格)的十六進制是0x47455420
$ sudo tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
- 抓 SSH 返回
SSH-
的十六進制是0x5353482D
$ sudo tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
抓老版本的 SSH 返回信息座柱,如 SSH-1.99..
$ sudo tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)'
- 抓 DNS 請求數(shù)據(jù)
$ sudo tcpdump -i eth1 udp dst port 53
- 其他
-c
參數(shù)對于運維人員來說也比較常用迷帜,因為流量比較大的服務(wù)器物舒,靠人工CTRL+C
還是抓的太多,于是可以用-c
參數(shù)指定抓多少個包戏锹。
$ sudo time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null
上面的命令計算抓 10000 個 SYN 包花費多少時間冠胯,可以判斷訪問量大概是多少。
- 實時抓取端口號
8000
的GET
包锦针,然后寫入 GET.log
$ sudo tcpdump -i eth0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log
七荠察、補充說明
測試過程中,發(fā)現(xiàn)本機發(fā)出的請求沒有被抓到奈搜,不知道是參數(shù)設(shè)置問題還是什么悉盆,暫時先把疑問記錄下來。
八馋吗、參考資料
- tcpdump非常實用的抓包實例
- tcpdump高級過濾技巧
- Mac系統(tǒng)下使用tcpdump抓包
- 超級詳細Tcpdump 的用法
- iOS,Android網(wǎng)絡(luò)抓包教程之tcpdump
- 抓包神器 tcpdump 使用介紹
- tcpdump
- Tcpdump使用
(完)