tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854linux
0x4745 爲"GET"前兩個字母"GE"apache
0x4854 爲"HTTP"前兩個字母"HT"ubuntu
說明: 一般狀況下:一個正常的TCP鏈接,都會有三個階段:一、TCP三次握手;二、數據傳送;三、TCP四次揮手windows
裏面的幾個概念:服務器
SYN: (同步序列編號,Synchronize Sequence Numbers)cookie
ACK: (確認編號,Acknowledgement Number)網絡
FIN: (結束標誌,FINish)less
客戶端發起一個和服務建立TCP連接的請求,這裏是SYN(J)tcp
服務端接受到客戶端的建立請求後,返回兩個信息: SYN(K) + ACK(J+1)工具
客戶端在接受到服務端的ACK信息校驗成功後(J與J+1),返回一個信息:ACK(K+1)
服務端這時接受到客戶端的ACK信息校驗成功後(K與K+1),再也不返回信息,後面進入數據通信階段
客戶端/服務端 read/write數據包
客戶端發起關閉請求,發送一個信息:FIN(M)
服務端接受到信息後,首先返回ACK(M+1),代表本身已經收到消息。
服務端在準備好關閉以前,最後發送給客戶端一個 FIN(N)消息,詢問客戶端是否準備好關閉了
客戶端接受到服務端發送的消息後,返回一個確認信息: ACK(N+1)
最後,服務端和客戶端在雙方都獲得確認時,各自關閉或者回收對應的TCP連接。
SYN_SEND
客戶端嘗試連接服務端,經過open方法。也就是TCP三次握手中的第1步以後,注意是客戶端狀態
sysctl -w net.ipv4.tcp_syn_retries = 2 ,作爲客戶端能夠設置SYN包的重試次數,默認5次(大約180s)引用校長的話:僅僅重試2次,現代網絡夠了
SYN_RECEIVED
服務接受建立請求的SYN後,也就是TCP三次握手中的第2步,發送ACK數據包以前
注意是服務端狀態,通常15個左右正常,若是很大,懷疑遭受SYN_FLOOD攻擊
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 , 設置該狀態的等待隊列數,默認1024,調大後可適當防止syn-flood,可參見man 7 tcp
sysctl -w net.ipv4.tcp_syncookies=1 , 打開syncookie,在syn backlog隊列不足的時候,提供一種機制臨時將syn連接換出
sysctl -w net.ipv4.tcp_synack_retries = 2 ,作爲服務端返回ACK包的重試次數,默認5次(大約180s)引用校長的話:僅僅重試2次,現代網絡夠了
ESTABLISHED
客戶端接受到服務端的ACK包後的狀態,服務端在發出ACK在必定時間後即爲ESTABLISHED
sysctl -w net.ipv4.tcp_keepalive_time = 1200 ,默認爲7200秒(2小時),系統針對空閒連接會進行心跳檢查,若是超過net.ipv4.tcp_keepalive_probes * net.ipv4.tcp_keepalive_intvl = 默認11分,終止對應的tcp連接,可適當調整心跳檢查頻率
目前線上的監控 waring:600 , critial : 800
FIN_WAIT1
主動關閉的一方,在發出FIN請求以後,也就是在TCP四次握手的第1步
CLOSE_WAIT
被動關閉的一方,在接受到客戶端的FIN後,也就是在TCP四次握手的第2步
FIN_WAIT2
主動關閉的一方,在接受到被動關閉一方的ACK後,也就是TCP四次握手的第2步
sysctl -w net.ipv4.tcp_fin_timeout=30, 能夠設定被動關閉方返回FIN後的超時時間,有效回收連接,避免syn-flood.
LASK_ACK
被動關閉的一方,在發送ACK後一段時間後(確保客戶端已收到),再發起一個FIN請求。也就是TCP四次握手的第3步
TIME_WAIT
主動關閉的一方,在收到被動關閉的FIN包後,發送ACK。也就是TCP四次握手的第4步
sysctl -w net.ipv4.tcp_tw_recycle = 1 , 打開快速回收TIME_WAIT,Enabling this option is not recommended since this causes problems when working with NAT (Network Address Translation)
sysctl -w net.ipv4.tcp_tw_reuse =1, 快速回收並重用TIME_WAIT的連接, 貌似和tw_recycle有衝突,不能重用就回收?
net.ipv4.tcp_max_tw_buckets: 處於time_wait狀態的最多連接數,默認爲180000.
相關說明
|
默認值: min=4096 default=87380 max=4194304
默認值: min=4096 default=16384 max=4194304
tcpdump是linux系統自帶的抓包工具,主要經過命令行的方式,比較適合在線上服務器進行抓包操做,若是是windows或者ubuntu徹底可 以選擇一些圖形化的工具,ubuntu比較推薦用wireshark,安裝方式很簡單sudo apt一下便可。
tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ][ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ][ -T 類型 ] [ -w 文件名 ] [表達式 ]
-l 使標準輸出變爲緩衝行形式;
-n 不把網絡地址轉換成名字;
-c 在收到指定的包的數目後,tcpdump就會中止;
-i 指定監聽的網絡接口;
-w 直接將包寫入文件中,並不分析和打印出來;
-s 指定記錄package的大小,常見 -s 0 ,表明最大值65535,一半linux傳輸最小單元MTU爲1500,足夠了
-X 直接輸出package data數據,默認不設置,只能經過-w指定文件進行輸出
關於類型的關鍵字,主要包括host,net,port
傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src
協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'||'
其餘重要的關鍵字以下:gateway, broadcast,less,greater
tcpdump tcp port 80 -n -X -s 0 指定80端口進行輸出
tcpdump tcp port 80 -n -s 0 -w /tmp/tcp.cap
對應的/tmp/tcp.cap基本靠肉眼已經能看一下信息,好比http Header , content信息等
tcpdump tcp port 80 -n -s 0 -X -l | grep xxxx
這樣能夠實時對數據包進行字符串匹配過濾
線上服務器apache+jetty,經過apache mod_proxy進行一個反向代理,80 apache端口, 7001 jetty端口
apache端口數據抓包: tcpdump tcp port 80 -n -s 0 -X -i eth0 注意:指定eth0網絡接口
jetty端口數據抓包: tcpdump tcp port 7001 -n -s 0 -X -i lo 注意:指定Loopback網絡接口
tcpdump tcp host 10.16.2.85 and port 2100 -s 0 -X
須要使用tcp表達式的組合,這裏是host指示只監聽該ip
操做:
在服務器上進行tcpdump -w /tmp/tcp.cap 指定輸出外部文件
scp /tmp/tcp.cap 拷貝文件到你本地
wireshark & 啓動wireshark
經過 File -> Open 打開拷貝下來的文件,這樣就能夠利用進行數據包分析了
剩下來的事就很是方便了
注意:
wireshark若是要開啓網絡監控,須要經過root方式啓動,不然沒法直接經過網卡進行數據抓包
X11的反向輸出,須要客戶機支持X11協議,若是是ubuntu天生支持很方便,若是是windows須要安裝個軟件