轉自:http://www.aichengxu.com/view/47568linux
Tcp抓包以及tcp狀態解釋,有須要的朋友能夠參考下。ios
發送端發送一個SYN=1,ACK=0標誌的數據包給接收端,請求進行鏈接,這是第一次握手;接收端收到請求而且容許鏈接的話,就會發送一個SYN=1,ACK=1標誌的數據包給發送端,告訴它,能夠通信了,而且讓發送端發送一個確認數據包,這是第二次握手;最後,發送端發送一個SYN=0,ACK=1的數據包給接收端,告訴它鏈接已被確認,這就是第三次握手。以後,一個TCP鏈接創建,開始通信。
服務器
SYN:同步標誌。同步序列編號(Synchronize Sequence Numbers)欄有效。該標誌僅在三次握手創建TCP鏈接時有效。它提示TCP鏈接的服務端檢查序列編號,該序列編號爲TCP鏈接初始端(通常是客戶端)的初始序列編號。在這裏,能夠把 TCP序列編號看做是一個範圍從0到4,294,967,295的32位計數器。經過TCP鏈接交換的數據中每個字節都通過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節的序列編號。網絡
ACK:確認標誌。確認編號(Acknowledgement Number)欄有效。大多數狀況下該標誌位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1,Figure-1)爲下一個預期的序列編號,同時提示遠端系統已經成功接收全部數據。
RST:復位標誌。復位標誌有效。用於復位相應的TCP鏈接。
URG:緊急標誌。緊急(The urgent pointer) 標誌有效。緊急標誌置位,
PSH:推標誌。該標誌置位時,接收端不將該數據進行隊列處理,而是儘量快將數據轉由應用處理。在處理 telnet 或 rlogin 等交互模式的鏈接時,該標誌老是置位的。
FIN:結束標誌。帶有該標誌置位的數據包用來結束一個TCP回話,但對應端口仍處於開放狀態,準備接收後續數據。less
.TCP的幾個狀態對於咱們分析所起的做用。在TCP層,有個FLAGS字段,這個字段有如下幾個標識:SYN, FIN, ACK, PSH, RST, URG.其中,對於咱們平常的分析有用的就是前面的五個字段。它們的含義是:tcp
其中,ACK是可能與SYN,FIN等同時使用的,好比SYN和ACK可能同時爲1,它表示的就是創建鏈接以後的響應,若是隻是單個的一個SYN,它表示的只是創建鏈接。TCP的幾回握手就是經過這樣的ACK表現出來的。但SYN與FIN是不會同時爲1的,由於前者表示的是創建鏈接,然後者表示的是斷開鏈接。RST通常是在FIN以後纔會出現爲1的狀況,表示的是鏈接重置。通常地,當出現FIN包或RST包時,咱們便認爲客戶端與服務器端斷開了鏈接;而當出現SYN和SYN+ACK包時,咱們認爲客戶端與服務器創建了一個鏈接。PSH爲1的狀況,通常只出如今
DATA內容不爲0的包中,也就是說PSH爲1表示的是有真正的TCP數據包內容被傳遞。TCP的鏈接創建和鏈接關閉,都是經過請求-響應的模式完成的。
工具
在linux下tcpdump是一個很強大的tcp抓包工具,可是因爲linux分析不方便,所以能夠將抓包數據保存到.cap文件中,而後在windos下使用wireshark進行分析,很是方便。
spa
tcpdump tcp -i eth2 -s 0 and port 20058 -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -t -s 0 -c 100 and port 20058 -w /home/pjroot/attence.cap
tcpdump tcp -i eth2 -s 0 and port 20058 and host 125.77.252.211 -w ./attence.cap
-i eth2 指定數據包通過的網卡code
-s 0 抓取數據包時默認抓取長度爲68字節。加上-S 0 後能夠抓到完整的數據包
blog
port 指定端口 能夠加上src 和dst表示如今爲源端口仍是目的端口
host 指定主機能夠加上src和dst表示源地址仍是目的地址
-w 表示要寫入到文件中
-t 表示不顯示時間戳
-c 100 表示只抓取初始的100個數據包
打印全部進入或離開sundown的數據包.
tcpdump host sundown
也能夠指定ip,例如截獲全部210.27.48.1的主機收到的和發出的全部的數據包
tcpdump host 210.27.48.1
打印helios 與 hot 或者與 ace 之間通訊的數據包
tcpdump host helios and \( hot or ace \)
截獲主機210.27.48.1和主機210.27.48.2或210.27.48.3的通訊
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
打印ace與任何其餘主機之間通訊的IP 數據包, 但不包括與helios之間的數據包.
tcpdump ip host ace and not helios
若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截獲主機hostname發送的全部數據
tcpdump -i eth0 src host hostname
監視全部送到主機hostname的數據包
tcpdump -i eth0 dst host hostname
若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令
tcpdump tcp port 23 and host 210.27.48.1
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 爲"GET"前兩個字母"GE",0x4854 爲"HTTP"前兩個字母"HT"。
-i any : 監聽全部接口-n : 不解析主機名-nn : 不解析主機名和端口名-X : 以16進制和ascii格式顯示包-XX : 和-X同樣,但會顯示以太網頭-v, -vv, -vvv : 獲取包含信息量更多的包-c : 獲取指定數量的包,達到該數量後tcpdump中止-S : 顯示絕對序列號-e : 獲取以太網頭-q : 顯示少許的協議信息-E : 經過密鑰來解密IPSEC交互-s : 設置snaplength(snaplength是抓取的字節數)- host // 根據ip地址查詢交互(不用"-n"也能根據主機名查詢交互)# tcpdump host 1.2.3.4- src,dst // 找出指定源地址或目的地址的交互# tcpdump src 2.3.4.5# tcpdump dst 3.4.5.6- net // 根據網絡號抓取整個網絡# tcpdump net 1.2.3.0/24- proto // 工做在tcp,udp,和icmp。注意你不用必須輸入proto。# tcpdump icmp- port // 查看通過指定端口的交互# tcpdump port 3389- src,dst port // 找出指定源端口或目的端口的交互# tcpdump src port 1025# tcpdump dst port 389- src/dst, port, protocol // 將三個聯合在一塊兒# tcpdump src port 1025 and tcp# tcpdump udp and src port 53你也能夠用選項來找出多個端口而不用一一指定,也能夠僅查看大於或小於某一字節大小的包。- Port Ranges // 查看通過範圍內端口的交互tcpdump portrange 21-23- Packet Size Filter // 查看大於或小於某一字節大小的包tcpdump less 32tcpdump greater 128也能夠用符號來代替tcpdump > 32tcpdump <= 128寫到一個文件tcpdump用"-w"選項能夠將抓到的內容存入文件,再用"-r"選項讀回來,這個功能很是好,能夠抓取原始交互以後再用其餘工具運行它。以這種方式抓取到的交互會存成tcpdump格式的文件,如今網絡分析圈內基本都用這種格式,所以文件能夠被全部工具讀取,包括Wireshark, Snort等。- 抓取全部通過端口80的交互存入一個文件# tcpdump -s 1514 port 80 -w capture_file- 之後能夠再讀回來# tcpdump -r capture_file更多的例子# 從10.5.2.3到端口3389的tcp交互tcpdump -nnvvS and src 10.5.2.3 and dst port 3389# 從網絡192.168到網絡10或172.16的交互tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16# 從192.168.0.2到網絡172.16的非icmp交互tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net and not icmp# 從Mars或Pluto到非SSH端口的交互tcpdump -vv src Mars or Pluto and not dst port 22分組若是你試圖運行這個原本很是有用的命令,由於括號的緣由會報錯,能夠對括號進行轉義(前面加"/")或者將整個命令放在單引號中:# 從10.0.2.4到端口3389或22的交互(正確的表達)tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'