TCP標誌位詳解及tcp攔截配置

doubel_山裡娃發表於2020-11-21

http://blog.sina.com.cn/s/blog_6b6bf3830101ag0r.html

TCP標誌位
URG:此標誌表示TCP包的緊急指標域(後面馬上就要說到)有效,用來保證TCP連線不被中斷,並且督促中間層裝置要儘快處理這些資料;

ACK:此標誌表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP資料包中;有兩個取值:0和1,為1的時候表示應答域有效,反之為0;

PSH:這個標誌位表示Push操作。所謂Push操作就是指在資料包到達接收端以後,立即傳送給應用程式,而不是在緩衝區中排隊;

RST:這個標誌表示連線復位請求。用來複位那些產生錯誤的連線,也被用來拒絕錯誤和非法的資料包;

SYN:表示同步序號,用來建立連線。SYN標誌位和ACK標誌位搭配使用,當連線請求的時候,SYN=1,ACK=0;連線被相應的時候,SYN=1,ACK= 1;這個標誌的資料包經常被用來進行埠掃描。掃描者傳送一個只有SYN的資料包,如果對方主機響應了一個資料包回來,就表明這臺主機存在這個埠;但是由於這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個連線嚴格的進行TCP的三次握手;

FIN:表示傳送端已經達到資料末尾,也就是說雙方的資料傳送完成,沒有資料可以傳送了,傳送FIN標誌位的TCP資料包後,連線將被斷開。這個標誌的資料包也經常被用於進行埠掃描。當一個FIN標誌的TCP資料包傳送到一臺計算機的特定埠,如果這臺計算機響應了這個資料,並且反饋回來一個RST標誌的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回話,但對應埠仍處於開放狀態,準備接收後續資料。
.
TCP的幾個狀態對於我們分析所起的作用。
在TCP層,有個FLAGS欄位,這個欄位有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.其中,對於我們日常的分析有用的就是前面的五個欄位。它們的含義是:SYN表示建立連線,FIN表示關閉連線,ACK表示響應,PSH表示有 DATA資料傳輸,RST表示連線重置。其中,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的連線建立和連線關閉,都是通過請求-響應的模式完成的。

瞭解到了TCP標誌位的含義,就可以瞭解TCP的三次握手是怎麼進行的了:傳送端傳送一個SYN=1,ACK=0標誌的資料包給接收端,請求進行連線,這是第一次握手;接收端收到請求並且允許連線的話,就會傳送一個SYN=1,ACK=1標誌的資料包給傳送端,告訴它,可以通訊了,並且讓傳送端傳送一個確認資料包,這是第二次握手;最後,傳送端傳送一個SYN=0,ACK=1的資料包給接收端,告訴它連線已被確認,這就是第三次握手。之後,一個TCP連線建立,開始通訊。
簡述TCP協議連線建立時3次握手的過程。根據TCP頭部,說明下列3個包在連線建立過程中的次序,為什麼?該連線訪問的服務是什麼服務?
0020 00 50 83 aa 46 49 3e dd 33 96 37 a3 a0 12 …P…FI>.3.7…
0030 16 a0 c4 c0 00 00 02 04 05 b4 04 02 08 0a d7 9b …
0040 62 b7 00 56 4a 2a 01 03 03 02 b…VJ*… (1)
0020 83 aa 00 50 33 96 37 a2 00 00 00 00 a0 02 …P3.7…
0030 16 d0 84 1d 00 00 02 04 05 b4 04 02 08 0a 00 56 …V
0040 4a 2a 00 00 00 00 01 03 03 00 J*… (2)
0020 83 aa 00 50 33 96 37 a3 46 49 3e de 80 10 …P3.7.FI>…
0030 16 d0 f3 4b 00 00 01 01 08 0a 00 56 4a 36 d7 9b …K…VJ6…
0040 62 b7 b. (3)
解:
在TCP/IP協議中,TCP協議提供可靠的連線服務,採用三次握手建立一個連線。

第一次握手:建立連線時,客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;

第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;

第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。

完成三次握手,客戶端與伺服器開始傳送資料。
(2)是第一次握手,flags位上為02,二進位制是0000 0010,即表示有syn沒有ack。
(1)是第二次握手,flags位上為12,二進位制是0001 0010,即表示有syn和ack。
(3)是第三次握手,flags位上為10,二進位制是0001 0000,即表示有ack沒有syn。
該連線訪問的是80埠,是為HTTP(HyperText Transport Protocol,超文字傳輸協議)開放的

TCP攔截即TCP intercept,大多數的路由器平臺都引用了該功能,其主要作用就是防止SYN泛洪攻擊。SYN攻擊利用的是TCP的三次握手機制,攻擊端利用偽造的IP地址向被攻擊端發出請求,而被攻擊端發出的響應報文將永遠傳送不到目的地,那麼被攻擊端在等待關閉這個連線的過程中消耗了資源,如果有成千上萬的這種連線,主機資源將被耗盡,從而達到攻擊的目的。我們可以利用路由器的TCP攔截功能,使網路上的主機受到保護(以Cisco路由器為例)。

開啟TCP攔截分為三個步驟:

1. 設定TCP攔截的工作模式

TCP攔截的工作模式分為攔截和監視。在攔截模式下,路由器稽核所有的TCP連線,自身的負擔加重,所以我們一般讓路由器工作在監視模式,監視TCP連線的時間和數目,超出預定值則關閉連線。

格式:ip tcp intercept mode (intercept|watch)

預設為intercept

2. 設定訪問表,以開啟需要保護的主機

格式:access-list [100-199] [deny|permit] tcp source source-wildcard

destination destination-wildcard

舉例:要保護219.148.150.126這臺主機

access-list 101 permit tcp any host 219.148.150.126

3. 開啟TCP攔截

ip tcp intercept list access-list-number

示例:我們有兩臺伺服器219.148.150.126和219.148.150.125需要進行保護,可以這樣配置:

ip tcp intercept list 101

ip tcp intercept mode watch

ip access-list 101 permit tcp any host 219.148.150.125

ip access-list 101 permit tcp any host 219.148.150.126

經過這樣的配置後,我們的主機就在一定程度上受到了保護。

TCP(Transmission Control Protocol) 傳輸控制協議
TCP 是主機對主機層的傳輸控制協議, 提供可靠的連線服務, 採用三次握手確認建立一個連線:
位碼即 tcp 標誌位, 有 6 種標示:SYN(synchronous 建立聯機) ACK(acknowledgement 確認)
PSH(push 傳送) FIN(finish 結束) RST(reset 重置) URG(urgent 緊急)
Sequence number(順序號碼) Acknowledge number(確認號碼)
第一次握手:主機 A 傳送位碼為 syn=1, 隨機產生 seq number=1234567 的資料包到伺服器, 主
機 B 由 SYN=1 知道, A 要求建立聯機;
第二次握手:主機 B 收到請求後要確認聯機資訊,向 A 傳送 ack number=(主機 A 的
seq+1),syn=1,ack=1, 隨機產生 seq=7654321 的包
第三次握手:主機 A 收到後檢查 ack number 是否正確,即第一次傳送的 seq number+1, 以及位
碼 ack 是否為 1,若正確,主機 A 會再傳送 ack number=(主機 B 的 seq+1),ack=1,主機 B 收到
後確認 seq 值與 ack=1 則連線建立成功。
完成三次握手,主機 A 與主機 B 開始傳送資料。
在 TCP/IP 協議中, TCP 協議提供可靠的連線服務,採用三次握手建立一個連線。
第一次握手:建立連線時,客戶端傳送 syn 包(syn=j) 到伺服器,並進入 SYN_SEND 狀態,等待
伺服器確認;
第二次握手:伺服器收到 syn 包,必須確認客戶的 SYN(ack=j+1),同時自己也傳送一個 SYN
包(syn=k),即 SYN+ACK 包,此時伺服器 進入 SYN_RECV 狀態; 第三次握手:客戶端收到服
務器的 SYN+ACK 包,向伺服器傳送確認包 ACK(ack=k+1),此包傳送完畢,客戶端和伺服器進
入 ESTABLISHED 狀態,完成三次握手。 完成三次握手,客戶端與伺服器開始傳送資料.
例項:
IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1
第一次握手:192.168.1.116 傳送位碼 syn=1, 隨機產生 seq number=3626544836 的資料包到
192.168.1.123,192.168.1.123 由 SYN=1 知道 192.168.1.116 要求建立聯機;
第二次握手:192.168.1.123 收到請求後要確認聯機資訊,向 192.168.1.116 傳送 ack
number=3626544837,syn=1,ack=1, 隨機產生 seq=1739326486 的包;
第 三次握手:192.168.1.116 收到後檢查 acknumber 是否正確, 即第一次傳送的 seqnumber+1,
以及位碼 ack 是否為 1,若正確,192.168.1.116 會再傳送 ack number=1739326487,ack=1,
192.168.1.123 收到後確認 seq=seq+1,ack=1 則連線建立成功。
圖解:
一個三次握手的過程(圖 1,圖 2)

(圖 1)

(圖 2)
第一次握手的標誌位(圖 3)
我們可以看到標誌位裡面只有個同步位,也就是在做請求(SYN)

(圖 3)
第二次握手的標誌位(圖 4)
我們可以看到標誌位裡面有個確認位和同步位,也就是在做應答(SYN + ACK)

(圖 4)
第三次握手的標誌位(圖 5)
我們可以看到標誌位裡面只有個確認位,也就是再做再次確認(ACK)

(圖 5)
一個完整的三次握手也就是 請求—應答—再次確認
四次分手:
由於 TCP 連線是全雙工的, 因此每個方向都必須單獨進行關閉。 這個原則是當一方完成它的
資料傳送任務後就能傳送一個 FIN 來終止這個方向的連線。 收到一個 FIN 只意味著這一方向上
沒有資料流動,一個 TCP 連線在收到一個 FIN 後仍能傳送資料。首先進行關閉的一方將執行主
動關閉,而另一方執行被動關閉。
(1)客戶端 A 傳送一個 FIN,用來關閉客戶 A 到伺服器 B 的資料傳送(報文段 4)。
(2)伺服器 B 收到這個 FIN,它發回一個 ACK,確認序號為收到的序號加 1(報文段 5)。
和 SYN 一樣,一個 FIN 將佔用一個序號。
(3)伺服器 B 關閉與客戶端 A 的連線,傳送一個 FIN 給客戶端 A(報文段 6)。
(4)客戶端 A 發回 ACK 報文確認,並將確認序號設定為收到序號加 1(報文段 7)。
1.為什麼建立連線協議是三次握手,而關閉連線卻是四次握手呢?
這是因為服務端的 LISTEN 狀態下的 SOCKET 當收到 SYN 報文的建連請求後,它可以把 ACK
和 SYN(ACK 起應答作用, 而 SYN 起同步作用) 放在一個報文裡來傳送。 但關閉連線時, 當收到
對方的 FIN 報文通知時,它僅僅表示對方沒有資料傳送給你了;但未必你所有的資料都全部發
送給對方了,所以你可以未必會馬上會關閉 SOCKET, 也即你可能還需要傳送一些資料給對方之
後,再傳送 FIN 報文給對方來表示你同意現在可以關閉連線了,所以它這裡的 ACK 報文和 FIN
報文多數情況下都是分開傳送的。
2.為什麼 TIME_WAIT 狀態還需要等 2MSL 後才能返回到 CLOSED 狀態?
這是因為雖然雙方都同意關閉連線了, 而且握手的 4 個報文也都協調和傳送完畢, 按理可以
直接回到 CLOSED 狀態(就好比從 SYN_SEND 狀態到 ESTABLISH 狀態那樣);但是因為我們必須
要假想網路是不可靠的,你無法保證你最後傳送的 ACK 報文會一定被對方收到,因此對方處於
LAST_ACK 狀態下的 SOCKET 可能會因為超時未收到 ACK 報文,而重發 FIN 報文,所以這個
TIME_WAIT 狀態的作用就是用來重發可能丟失的 ACK 報文。

相關文章