tcpdump与Wireshark抓包分析
1 起因#
前段時間,一直在調線上的一個問題:線上應用接受POST請求,請求body中的參數獲取不全,存在丟失的狀況。這個問題是偶發性的,大概發生的幾率為5%-10%左右,這個概率已經相當高了。在排查問題的過程中使用到了tcpdump和Wireshark進行抓包分析。感覺這兩個工具搭配起來干活,非常完美。所有的網絡傳輸在這兩個工具搭配下,都無處遁形。
為了更好、更順手地能夠用好這兩個工具,特整理本篇文章,希望也能給大家帶來收獲。為大家之后排查問題,添一利器。
2 tcpdump與Wireshark介紹#
在網絡問題的調試中,tcpdump應該說是一個必不可少的工具,和大部分linux下優秀工具一樣,它的特點就是簡單而強大。它是基于Unix系統的命令行式的數據包嗅探工具,可以抓取流動在網卡上的數據包。
默認情況下,tcpdump不會抓取本機內部通訊的報文。根據網絡協議棧的規定,對于報文,即使是目的地是本機,也需要經過本機的網絡協議層,所以本機通訊肯定是通過API進入了內核,并且完成了路由選擇?!颈热绫緳C的TCP通信,也必須要socket通信的基本要素:src ip port dst ip port】
如果要使用tcpdump抓取其他主機MAC地址的數據包,必須開啟網卡混雜模式,所謂混雜模式,用最簡單的語言就是讓網卡抓取任何經過它的數據包,不管這個數據包是不是發給它或者是它發出的。一般而言,Unix不會讓普通用戶設置混雜模式,因為這樣可以看到別人的信息,比如telnet的用戶名和密碼,這樣會引起一些安全上的問題,所以只有root用戶可以開啟混雜模式,開啟混雜模式的命令是:ifconfig en0 promisc, en0是你要打開混雜模式的網卡。
Linux抓包原理:
Linux抓包是通過注冊一種虛擬的底層網絡協議來完成對網絡報文(準確的說是網絡設備)消息的處理權。當網卡接收到一個網絡報文之后,它會遍歷系統中所有已經注冊的網絡協議,例如以太網協議、x25協議處理模塊來嘗試進行報文的解析處理,這一點和一些文件系統的掛載相似,就是讓系統中所有的已經注冊的文件系統來進行嘗試掛載,如果哪一個認為自己可以處理,那么就完成掛載。
當抓包模塊把自己偽裝成一個網絡協議的時候,系統在收到報文的時候就會給這個偽協議一次機會,讓它來對網卡收到的報文進行一次處理,此時該模塊就會趁機對報文進行窺探,也就是把這個報文完完整整的復制一份,假裝是自己接收到的報文,匯報給抓包模塊。
Wireshark是一個網絡協議檢測工具,支持Windows平臺、Unix平臺、Mac平臺,一般只在圖形界面平臺下使用Wireshark,如果是Linux的話,直接使用tcpdump了,因為一般而言Linux都自帶的tcpdump,或者用tcpdump抓包以后用Wireshark打開分析。
在Mac平臺下,Wireshark通過WinPcap進行抓包,封裝的很好,使用起來很方便,可以很容易的制定抓包過濾器或者顯示過濾器,具體簡單使用下面會介紹。Wireshark是一個免費的工具,只要google一下就能很容易找到下載的地方。
所以,tcpdump是用來抓取數據非常方便,Wireshark則是用于分析抓取到的數據比較方便。
3 tcpdump使用#
3.1 語法##
?
tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ][ -C file_size ] [ -G rotate_seconds ] [ -F file ][ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] [ -T type ] [ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ] [ -z postrotate-command ] [ -Z user ][ expression ]host(缺省類型): 指明一臺主機,如:host 210.27.48.2
net: 指明一個網絡地址,如:net 202.0.0.0
port: 指明端口號,如:port 23
src: src 210.27.48.2, IP包源地址是210.27.48.2
dst: dst net 202.0.0.0, 目標網絡地址是202.0.0.0
dst or src(缺省值)
dst and src
fddi
ip
arp
rarp
tcp
udp
gateway
broadcast
less
greater
非 : ! or "not" (去掉雙引號)
且 : && or "and"
或 : || or "or"
3.2 選項##
?
-A:以ASCII編碼打印每個報文(不包括鏈路層的頭),這對分析網頁來說很方便; -a:將網絡地址和廣播地址轉變成名字; -c<數據包數目>:在收到指定的包的數目后,tcpdump就會停止; -C:用于判斷用 -w 選項將報文寫入的文件的大小是否超過這個值,如果超過了就新建文件(文件名后綴是1、2、3依次增加); -d:將匹配信息包的代碼以人們能夠理解的匯編格式給出; -dd:將匹配信息包的代碼以c語言程序段的格式給出; -ddd:將匹配信息包的代碼以十進制的形式給出; -D:列出當前主機的所有網卡編號和名稱,可以用于選項 -i; -e:在輸出行打印出數據鏈路層的頭部信息; -f:將外部的Internet地址以數字的形式打印出來; -F<表達文件>:從指定的文件中讀取表達式,忽略其它的表達式; -i<網絡界面>:監聽主機的該網卡上的數據流,如果沒有指定,就會使用最小網卡編號的網卡(在選項-D可知道,但是不包括環路接口),linux 2.2 內核及之后的版本支持 any 網卡,用于指代任意網卡; -l:如果沒有使用 -w 選項,就可以將報文打印到 標準輸出終端(此時這是默認); -n:顯示ip,而不是主機名; -N:不列出域名; -O:不將數據包編碼最佳化; -p:不讓網絡界面進入混雜模式; -q:快速輸出,僅列出少數的傳輸協議信息; -r<數據包文件>:從指定的文件中讀取包(這些包一般通過-w選項產生); -s<數據包大小>:指定抓包顯示一行的寬度,-s0表示可按包長顯示完整的包,經常和-A一起用,默認截取長度為60個字節,但一般ethernet MTU都是1500字節。所以,要抓取大于60字節的包時,使用默認參數就會導致包數據丟失; -S:用絕對而非相對數值列出TCP關聯數; -t:在輸出的每一行不打印時間戳; -tt:在輸出的每一行顯示未經格式化的時間戳記; -T<數據包類型>:將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議); -v:輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息; -vv:輸出詳細的報文信息; -x/-xx/-X/-XX:以十六進制顯示包內容,幾個選項只有細微的差別,詳見man手冊; -w<數據包文件>:直接將包寫入文件中,并不分析和打印出來; expression:用于篩選的邏輯表達式;3.3 命令實踐##
?
tcpdump控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump Password: tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 11:00:19.788139 IP 10.37.63.3.50809 > 10.37.253.32.socks: Flags [.], ack 151417909, win 4096, length 0 11:00:19.790267 IP 10.37.253.32.socks > 10.37.63.3.50809: Flags [.], ack 1, win 560, options [nop,nop,TS val 1323324836 ecr 501713973], length 0 11:00:19.851362 IP 10.37.63.53.57443 > 239.255.255.250.ssdp: UDP, length 133 11:00:19.851367 IP 10.37.63.107.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:00:19.851369 IP 10.37.63.138.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:00:20.060087 IP 10.37.63.71.54616 > 239.255.255.250.ssdp: UDP, length 133?
tcpdump -i en0如果不指定網卡,默認tcpdump只會監視第一個網絡接口,一般是eth0,下面的例子都沒有指定網絡接口。
控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 11:04:31.780759 IP 10.37.63.100.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST?
tcpdump -i en0 host 10.37.63.255控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump host 10.37.63.255 tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 11:07:23.807683 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:23.913143 IP 10.37.63.95.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:24.538785 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:24.643311 IP 10.37.63.95.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:24.747672 IP 10.37.63.87.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): REGISTRATION; REQUEST; BROADCAST 11:07:25.374527 IP 10.37.63.95.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:26.209995 IP 10.37.63.86.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:07:26.210530 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST?
tcpdump host 10.37.63.255 and \(10.37.63.61 or 10.37.63.95 \)控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump host 10.37.63.255 and \(10.37.63.61 or 10.37.63.95 \) tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 11:10:38.395320 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:39.234047 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:39.962286 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:48.422443 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:49.153630 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:49.894146 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 11:10:52.600297 IP 10.37.63.61.netbios-ns > 10.37.63.255.netbios-ns: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST?
tcpdump -n host 10.37.63.255 and ! 10.37.63.61控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -n host 10.37.63.255 and ! 10.37.63.61 tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 15:54:33.921068 IP 10.37.63.86.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:34.025490 IP 10.37.63.86.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:34.025492 IP 10.37.63.86.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:34.338753 IP 10.37.63.56.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:35.174516 IP 10.37.63.88.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:35.204268 IP 10.37.63.56.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 15:54:35.592199 IP 10.37.63.135.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST?
tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61 Password: tcpdump: data link type PKTAP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes 16:02:48.168264 IP 10.37.63.107.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.272626 IP 10.37.63.28.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586137 IP 10.37.63.75.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586140 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586201 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.586202 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:48.690751 IP 10.37.63.103.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.004792 IP 10.37.63.28.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.212622 IP 10.37.63.88.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.317969 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.317972 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST 16:02:49.318301 IP 10.37.63.48.137 > 10.37.63.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST?
tcpdump -i en0 src host 10.37.63.3 (注意數據流向)控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 src host 10.37.63.3 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:08:05.698674 IP 10.37.63.3.51503 > 101.201.169.146.https: Flags [.], ack 3067697680, win 4096, length 0 16:08:06.225543 IP 10.37.63.3.56531 > 10.37.253.51.domain: 49330+ PTR? 3.63.37.10.in-addr.arpa. (41) 16:08:06.228851 IP 10.37.63.3.56781 > 10.37.253.51.domain: 9247+ PTR? 146.169.201.101.in-addr.arpa. (46) 16:08:07.247441 IP 10.37.63.3.53716 > 10.37.253.51.domain: 60009+ PTR? 51.253.37.10.in-addr.arpa. (43) 16:08:08.198285 IP 10.37.63.3.newoak > 123.151.13.85.irdmi: UDP, length 47 16:08:08.254488 IP 10.37.63.3.51134 > 10.37.253.51.domain: 52763+ PTR? 85.13.151.123.in-addr.arpa. (44) 16:08:08.917142 IP 10.37.63.3.51815 > 106.11.4.88.https: Flags [P.], seq 341932595:341932930, ack 4196579612, win 65535, length 335 16:08:08.918050 IP 10.37.63.3.51815 > 106.11.4.88.https: Flags [P.], seq 335:804, ack 1, win 65535, length 469 16:08:08.984637 IP 10.37.63.3.51815 > 106.11.4.88.https: Flags [.], ack 292, win 65535, length 0?
tcpdump -i en0 dst host 10.37.63.3 (注意數據流向)控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 dst host 10.37.63.3 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:10:00.120346 IP 123.151.13.85.irdmi > 10.37.63.3.newoak: UDP, length 47 16:10:00.447742 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [.], ack 3563461726, win 62712, length 0 16:10:00.449252 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [P.], seq 0:291, ack 1, win 62712, length 291 16:10:00.590941 IP 10.37.253.51.domain > 10.37.63.3.62089: 38134 NXDomain 0/1/0 (101) 16:10:00.593145 IP 10.37.253.51.domain > 10.37.63.3.56987: 19136 NXDomain* 0/0/0 (41) 16:10:01.598164 IP 10.37.253.51.domain > 10.37.63.3.63380: 43688 NXDomain* 0/0/0 (43) 16:10:03.194440 IP 123.151.13.85.irdmi > 10.37.63.3.newoak: UDP, length 79 16:10:03.880803 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [.], ack 806, win 63784, length 0 16:10:03.883452 IP 106.11.4.88.https > 10.37.63.3.51840: Flags [P.], seq 291:582, ack 806, win 63784, length 291 16:10:04.051402 IP dns15.online.tj.cn.irdmi > 10.37.63.3.terabase: UDP, length 87?
tcpdump -i en0 host 10.37.63.3 and tcp port 80控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host 10.37.63.3 and tcp port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:13:34.869399 IP 10.37.63.3.51843 > cncln.online.ln.cn.http: Flags [.], ack 3148173637, win 8192, length 0 16:13:34.890175 IP cncln.online.ln.cn.http > 10.37.63.3.51843: Flags [.], ack 1, win 31, length 0 16:13:49.497784 IP 10.37.63.3.51845 > 27.221.81.19.http: Flags [.], ack 3932049450, win 4096, length 0 16:13:49.497786 IP 10.37.63.3.51844 > 27.221.81.19.http: Flags [.], ack 3635221024, win 4096, length 0 16:13:49.513952 IP 27.221.81.19.http > 10.37.63.3.51845: Flags [.], ack 1, win 122, options [nop,nop,TS val 4035158002 ecr 876369829], length 0 16:13:49.518587 IP 27.221.81.19.http > 10.37.63.3.51844: Flags [.], ack 1, win 122, options [nop,nop,TS val 4035158002 ecr 876369829], length 0?
tcpdump -i en0 host 10.37.63.3 and dst port 80控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host 10.37.63.3 and dst port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:19:36.187617 IP 10.37.63.3.51901 > 180.149.132.47.http: Flags [P.], seq 219000907:219001688, ack 4212585623, win 8192, length 781: HTTP: GET / HTTP/1.1 16:19:36.194163 IP 10.37.63.3.51901 > 180.149.132.47.http: Flags [.], ack 292, win 8182, length 0 16:19:36.194292 IP 10.37.63.3.51901 > 180.149.132.47.http: Flags [.], ack 453, win 8186, length 0?
tcpdump -i en0 port 25# 源端口 tcpdump -i en0 src port 25 # 目的端口 tcpdump -i en0 dst port 25網絡過濾?
tcpdump -i en0 net 192.168 tcpdump -i en0 src net 192.168 tcpdump -i en0 dst net 192.168 tcpdump -i en0 net 192.168.1 tcpdump -i en0 net 192.168.1.0/24?
tcpdump -i en0 arp tcpdump -i en0 ip tcpdump -i en0 tcp tcpdump -i en0 udp tcpdump -i en0 icmp?
tcpdump -i en0 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'?
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'?
tcpdump -i en0 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'?
tcpdump -i en0 'tcp[tcpflags] = tcp-syn'?
tcpdump -i en0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'?
tcpdump -i en0 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'?
tcpdump -i en0 'tcp[(tcp[12]>>2):4] = 0x47455420'# 0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT" tcpdump -XvvennSs 0 -i en0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854?
tcpdump -i en0 'tcp[(tcp[12]>>2):4] = 0x5353482D'# 抓老版本的 SSH 返回信息,如"SSH-1.99.." tcpdump -i en0 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)'如前兩個的包頭過濾,首先了解如何從包頭過濾信息:
?
proto[x:y] : 過濾從x字節開始的y字節數。比如ip[2:2]過濾出3、4字節(第一字節從0開始排) proto[x:y] & z = 0 : proto[x:y]和z的與操作為0 proto[x:y] & z !=0 : proto[x:y]和z的與操作不為0 proto[x:y] & z = z : proto[x:y]和z的與操作為z proto[x:y] = z : proto[x:y]等于z操作符 : >, <, >=, <=, =, !=
抓取端口大于1024的TCP數據包:
?
tcpdump -i en0 'tcp[0:2] > 1024'?
tcpdump -i en0 udp dst port 53-c 參數對于運維人員來說也比較常用,因為流量比較大的服務器,靠人工 CTRL+C 還是抓的太多,于是可以用-c 參數指定抓多少個包。
?
time tcpdump -nn -i en0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null上面的命令計算抓 10000 個 SYN 包花費多少時間,可以判斷訪問量大概是多少。
實時抓取端口號8000的GET包,然后寫入GET.log
?
tcpdump -i en0 '((port 8000) and (tcp[(tcp[12]>>2):4]=0x47455420))' -nnAl -w /tmp/GET.log3.4 抓個網站練練##
想抓取訪問某個網站時的網絡數據。比如網站 http://www.baidu.com/ 怎么做?
?
tcpdump -i en0 host www.baidu.com控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host www.baidu.com tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes?
wget www.baidu.cn控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -i en0 host www.baidu.com tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:43:08.444405 IP 10.37.63.3.52302 > 61.135.169.121.http: Flags [S], seq 3066364056, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 878169772 ecr 0,sackOK,eol], length 0 16:43:08.446470 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [S.], seq 3537377541, ack 3066364057, win 65535, options [mss 1440,nop,wscale 7,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,sackOK,eol], length 0 16:43:08.446517 IP 10.37.63.3.52302 > 61.135.169.121.http: Flags [.], ack 1, win 8192, length 0 16:43:08.446553 IP 10.37.63.3.52302 > 61.135.169.121.http: Flags [P.], seq 1:142, ack 1, win 8192, length 141: HTTP: GET / HTTP/1.1 16:43:08.450529 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [.], ack 142, win 202, length 0 16:43:08.451264 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [P.], seq 1:962, ack 142, win 202, length 961: HTTP: HTTP/1.1 200 OK 16:43:08.451270 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [.], seq 962:2402, ack 142, win 202, length 1440: HTTP 16:43:08.451318 IP 61.135.169.121.http > 10.37.63.3.52302: Flags [.], seq 2402:3842, ack 142, win 202, length 1440: HTTP確認序列號ack為何是1。這是相對值,如何顯示絕對值
?
tcpdump -S -i en0 host www.baidu.com再次訪問這個網站
?
wget www.baidu.com控制臺輸出:
?
taomingkais-MacBook-Pro:~ TaoBangren$ sudo tcpdump -S -i en0 host www.baidu.com tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes 16:50:11.911342 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [S], seq 1888894292, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 878592161 ecr 0,sackOK,eol], length 0 16:50:11.916158 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [S.], seq 2526934941, ack 1888894293, win 65535, options [mss 1440,nop,wscale 7,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,nop,sackOK,eol], length 0 16:50:11.916208 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [.], ack 2526934942, win 8192, length 0 16:50:11.916308 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [P.], seq 1888894293:1888894434, ack 2526934942, win 8192, length 141: HTTP: GET / HTTP/1.1 16:50:11.919124 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [.], ack 1888894434, win 202, length 0 16:50:11.922055 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [P.], seq 2526934942:2526935943, ack 1888894434, win 202, length 1001: HTTP: HTTP/1.1 200 OK 16:50:11.922060 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [.], seq 2526935943:2526937383, ack 1888894434, win 202, length 1440: HTTP 16:50:11.922115 IP 61.135.169.121.http > 10.37.63.3.52346: Flags [.], seq 2526937383:2526938823, ack 1888894434, win 202, length 1440: HTTP?
tcpdump -A -i en0 host www.baidu.com將抓取的結果存到文件,比如文件 file1
?
tcpdump -A -i en0 -w file1 host www.baidu.com如何讀取這個文件的基本信息
?
tcpdump -r file1想要了解更多,比如上面的http報文
?
tcpdump -A -r file1也同時想要將確認序列號ack打印成絕對值
?
tcpdump -AS -r file1注:
無參數的選項比如 -A, -S, -e, 等。均可以共用一個減號
'src host www.baidu.cn' 屬于 expression ,如果太長,可以用單引號括起來:
?
tcpdump -i en0 'src host www.baidu.com'?
16:50:11.916308 IP 10.37.63.3.52346 > 61.135.169.121.http: Flags [P.], seq 1888894293:1888894434, ack 2526934942, win 8192, length 141: HTTP: GET / HTTP/1.1第一列是時間戳:時、分、秒、微秒
第二列是網際網路協議的名稱
第三列是報文發送方的十進制的網際網路協議地址,以及緊跟其后的端口號(偶爾會是某個協議名如 http ,如果在此處仍然顯示端口號加上 -n 選項)
第四列是大于號
第五列是報文接收方的十進制的網際網路協議地址,以及緊跟其后的端口號(偶爾會是某個協議名如 http ,如果在此處仍然顯示端口號加上 -n 選項)
第六列是冒號
第七列是 Flags 標識,可能的取值是 [S.] [.] [P.] [F.]
第八、九、十……列 是tcp協議報文頭的一些變量值:
seq 是 請求同步的 序列號ack 是 已經同步的 序列號win 是 當前可用窗口大小length 是 tcp協議報文體的長度如果加入了-S選項,會看到的 seq, ack 是 兩個冒號分割的值,分別表示變更前、后的值。4 tcpdump抓取TCP包分析#
TCP傳輸控制協議是面向連接的可靠的傳輸層協議,在進行數據傳輸之前,需要在傳輸數據的兩端(客戶端和服務器端)創建一個連接,這個連接由一對插口地址唯一標識,即是在IP報文首部的源IP地址、目的IP地址,以及TCP數據報首部的源端口地址和目的端口地址。TCP首部結構如下:
輸入圖片說明
注意:通常情況下,一個正常的TCP連接,都會有三個階段:1、TCP三次握手;2、數據傳送;3、TCP四次揮手
其中在TCP連接和斷開連接過程中的關鍵部分如下:
源端口號:即發送方的端口號,在TCP連接過程中,對于客戶端,端口號往往由內核分配,無需進程指定;
目的端口號:即發送目的的端口號;
序號:即為發送的數據段首個字節的序號;
確認序號:在收到對方發來的數據報,發送確認時期待對方下一次發送的數據序號;
SYN:同步序列編號,Synchronize Sequence Numbers;
ACK:確認編號,Acknowledgement Number;
FIN:結束標志,FINish;
4.1 TCP三次握手##
三次握手的過程如下:
輸入圖片說明
step1. 由客戶端向服務器端發起TCP連接請求。Client發送:同步序列編號SYN置為1,發送序號Seq為一個隨機數,這里假設為X,確認序號ACK置為0;
step2. 服務器端接收到連接請求。Server響應:同步序列編號SYN置為1,并將確認序號ACK置為X+1,然后生成一個隨機數Y作為發送序號Seq(因為所確認的數據報的確認序號未初始化);
step3. 客戶端對接收到的確認進行確認。Client發送:將確認序號ACK置為Y+1,然后將發送序號Seq置為X+1(即為接收到的數據報的確認序號);
對于step3的作用,假設一種情況,客戶端A向服務器B發送一個連接請求數據報,然后這個數據報在網絡中滯留導致其遲到了,雖然遲到了,但是服務器仍然會接收并發回一個確認數據報。但是A卻因為久久收不到B的確認而將發送的請求連接置為失效,等到一段時間后,接到B發送過來的確認,A認為自己現在沒有發送連接,而B卻一直以為連接成功了,于是一直在等待A的動作,而A將不會有任何的動作了。這會導致服務器資源白白浪費掉了,因此,兩次握手是不行的,因此需要再加上一次,對B發過來的確認再進行一次確認,即確認這次連接是有效的,從而建立連接。
有的系統中是顯式的初始化序號是0,但是這種已知的初始化值是非常危險的,因為這會使得一些黑客鉆漏洞,發送一些數據報來破壞連接。因此,初始化序號因為取隨機數會更好一些,并且是越隨機越安全。
tcpdump抓TCP三次握手抓包分析:
?
sudo tcpdump -n -S -i lo0 host 10.37.63.3 and tcp port 8080# 接著再運行: curl http://10.37.63.3:8080/atbg/doc控制臺輸出:
?
# TCP三次握手 start 16:00:13.486776 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [S], seq 1944916150, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 906474698 ecr 0,sackOK,eol], length 0 16:00:13.486850 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [S.], seq 1119565918, ack 1944916151, win 65535, options [mss 16344,nop,wscale 5,nop,nop,TS val 906474698 ecr 906474698,sackOK,eol], length 0 16:00:13.486860 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119565919, win 12759, options [nop,nop,TS val 906474698 ecr 906474698], length 0 16:00:13.486868 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [.], ack 1944916151, win 12759, options [nop,nop,TS val 906474698 ecr 906474698], length 0 # TCP三次握手 end# 傳輸數據 start 16:00:13.486923 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [P.], seq 1944916151:1944916238, ack 1119565919, win 12759, options [nop,nop,TS val 906474698 ecr 906474698], length 87: HTTP: GET /atbg/doc HTTP/1.1 16:00:13.486944 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [.], ack 1944916238, win 12756, options [nop,nop,TS val 906474698 ecr 906474698], length 0 16:00:13.489750 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [P.], seq 1119565919:1119571913, ack 1944916238, win 12756, options [nop,nop,TS val 906474701 ecr 906474698], length 5994: HTTP: HTTP/1.1 200 OK 16:00:13.489784 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119571913, win 12572, options [nop,nop,TS val 906474701 ecr 906474701], length 0 # 傳輸數據 end# TCP四次揮手 start 16:00:13.490836 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [F.], seq 1944916238, ack 1119571913, win 12572, options [nop,nop,TS val 906474702 ecr 906474701], length 0 16:00:13.490869 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [.], ack 1944916239, win 12756, options [nop,nop,TS val 906474702 ecr 906474702], length 0 16:00:13.490875 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119571913, win 12572, options [nop,nop,TS val 906474702 ecr 906474702], length 0 16:00:13.491004 IP 10.37.63.3.8080 > 10.37.63.3.61725: Flags [F.], seq 1119571913, ack 1944916239, win 12756, options [nop,nop,TS val 906474702 ecr 906474702], length 0 16:00:13.491081 IP 10.37.63.3.61725 > 10.37.63.3.8080: Flags [.], ack 1119571914, win 12572, options [nop,nop,TS val 906474702 ecr 906474702], length 0 # TCP四次揮手 end每一行中間都有這個包所攜帶的標志:
S=SYN,發起連接標志。
P=PUSH,傳送數據標志。
F=FIN,關閉連接標志。
ack,表示確認包。
RST=RESET,異常關閉連接。
.,表示沒有任何標志。
第1行:16:00:13.486776,從10.37.63.3(client)的臨時端口61725向10.37.63.3(server)的8080監聽端口發起連接,client初始包序號seq為1944916150,滑動窗口大小為65535字節(滑動窗口即tcp接收緩沖區的大小,用于tcp擁塞控制),mss大小為16344(即可接收的最大包長度,通常為MTU減40字節,IP頭和TCP頭各20字節)?!緎eq=1944916150,ack=0,syn=1】
第2行:16:00:13.486850,server響應連接,同時帶上第一個包的ack信息,為client端的初始包序號seq加1,即1944916151,即server端下次等待接受這個包序號的包,用于tcp字節流的順序控制。Server端的初始包序號seq為1119565918,mss也是16344?!緎eq=1119565918,ack=1944916151,syn=1】
第3行:15:46:13.084161,client再次發送確認連接,tcp連接三次握手完成,等待傳輸數據包?!綼ck=1119565919,seq=1944916151】
4.2 TCP四次揮手##
連接雙方在完成數據傳輸之后就需要斷開連接。由于TCP連接是屬于全雙工的,即連接雙方可以在一條TCP連接上互相傳輸數據,因此在斷開時存在一個半關閉狀態,即有有一方失去發送數據的能力,卻還能接收數據。因此,斷開連接需要分為四次。主要過程如下:
輸入圖片說明
step1. 主機A向主機B發起斷開連接請求,之后主機A進入FIN-WAIT-1狀態;
step2. 主機B收到主機A的請求后,向主機A發回確認,然后進入CLOSE-WAIT狀態;
step3. 主機A收到B的確認之后,進入FIN-WAIT-2狀態,此時便是半關閉狀態,即主機A失去發送能力,但是主機B卻還能向A發送數據,并且A可以接收數據。此時主機B占主導位置了,如果需要繼續關閉則需要主機B來操作了;
step4. 主機B向A發出斷開連接請求,然后進入LAST-ACK狀態;
step5. 主機A接收到請求后發送確認,進入TIME-WAIT狀態,等待2MSL之后進入CLOSED狀態,而主機B則在接受到確認后進入CLOSED狀態;
主要作用有兩個:
第一,確保主機A最后發送的確認能夠到達主機B。如果處于LAST-ACK狀態的主機B一直收不到來自主機A的確認,它會重傳斷開連接請求,然后主機A就可以有足夠的時間去再次發送確認。但是這也只能盡最大力量來確保能夠正常斷開,如果主機A的確認總是在網絡中滯留失效,從而超過了2MSL,最后也無法正常斷開;
第二,如果主機A在發送了確認之后立即進入CLOSED狀態。假設之后主機A再次向主機B發送一條連接請求,而這條連接請求比之前的確認報文更早地到達主機B,則會使得主機B以為這條連接請求是在舊的連接中A發出的報文,并不看成是一條新的連接請求了,即使得這個連接請求失效了,增加2MSL的時間可以使得這個失效的連接請求報文作廢,這樣才不影響下次新的連接請求中出現失效的連接請求。
因為在TCP連接過程中,確認的發送有一個延時(即經受延時的確認),一端在發送確認的時候將等待一段時間,如果自己在這段事件內也有數據要發送,就跟確認一起發送,如果沒有,則確認單獨發送。而我們的抓包實驗中,由服務器端先斷開連接,之后客戶端在確認的延遲時間內,也有請求斷開連接需要發送,于是就與上次確認一起發送,因此就只有三個數據報了。
5 Wireshark分析tcpdump抓包結果#
?
tcpdump -i lo0 -s 0 -n -S host 10.37.63.3 and port 8080 -w ./Desktop/tcpdump_10.37.63.3_8080_20160525.cap# 然后再執行curl curl http://10.37.63.3:8080/atbg/doc輸入圖片說明
No. 1-4 行:TCP三次握手環節;
No. 5-8 行:TCP傳輸數據環節;
No. 9-13 行:TCP四次揮手環節;
輸入圖片說明
彈窗如下圖所示,上面紅色部分為請求信息,下面藍色部分為響應信息:
輸入圖片說明
以上是Wireshark分析tcpdump的簡單使用,Wireshark更強大的是過濾器工具,大家可以自行去多研究學習Wireshark,用起來還是比較爽的。
推薦幾個關于Wireshark的文章:
Wireshark基本介紹和學習TCP三次握手
一站式學習Wireshark
鏈接:https://www.jianshu.com/p/a62ed1bb5b20
?
總結
以上是生活随笔為你收集整理的tcpdump与Wireshark抓包分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员发展职业规划_梁胜博士:写给程序员
- 下一篇: 一些粗糙集的学习感悟