iptables的基礎(chǔ)知識(shí)-iptables中TCP三次握手
iptables的基礎(chǔ)知識(shí)-iptables中TCP三次握手:
一個(gè)TCP連接是通過三次握手的方式完成的。首先,客戶程序發(fā)出一個(gè)同步請(qǐng)求(發(fā)出一個(gè)SYN分組);接著,服務(wù)器端回應(yīng)一個(gè)SYN|ACK分組;最后返回一個(gè)ACK分組,連接完成,一共需要三個(gè)步驟,整個(gè)iptables過程如下所示:
- Client Server
- 1 SYN --->
- 2 <--- SYN+ACK
- 3 ACK --->
- <--- ACK
- ACK --->
接下來我們看具體iptables的過程,假設(shè)client(192.168.10.7)要訪問server(192.168.10.100,同時(shí)啟用iptables)的WEB主頁。
1 client首先發(fā)出一個(gè)SYN的連線請(qǐng)求(注意ack,rst等的值),源端口是1286,目的端口是80。
2 Server收到著請(qǐng)求后應(yīng)答一個(gè)SYN+ACK,因?yàn)槭荢ERVER應(yīng)答client,所以源端口是80,目的端口是1286。
3 client再答復(fù)一個(gè)ACK,至此三步握手的過程結(jié)束,一個(gè)正常的連接建立。
從以上的三步中可以看到,一個(gè)正常的tcp連接建立的過程。值得注意的是一個(gè)正常的tcp發(fā)起的請(qǐng)求,tcp中包頭中SYN位是1,這就意味著如果一個(gè)新的包但是SYN卻不置位,這個(gè)包肯定有問題。
為了跟蹤一個(gè)TCP連接的狀態(tài),我們?cè)赟ERVER使用了如下命令:
- iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
- iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
接著看在連接建立過程中iptables狀態(tài)表的變化:
1> 由于CLIENT和SERVER之前沒有任何連接,CLIENT發(fā)送的SYN(此時(shí)的TCP狀態(tài)是SYN_SENT)請(qǐng)求進(jìn)入iptables 的INPUT鏈,發(fā)現(xiàn)是一個(gè)新包,那么此時(shí)iptables將此狀態(tài)定義為NEW,因?yàn)槲覀兊囊?guī)則允許,這個(gè)請(qǐng)求包被接受。
2> server返回一個(gè)SYN+ACK的包(此時(shí)的TCP狀態(tài)是SYN_RECIV),這個(gè)包要經(jīng)過OUTPUT鏈(因?yàn)檫@個(gè)包是從本機(jī)發(fā)出的,目的地址是client),由于之前曾經(jīng)收到一個(gè)包,此時(shí)個(gè)狀態(tài),已經(jīng)變成了ESTABLISHED,按照規(guī)則,這個(gè)包成功發(fā)送出去。
3> 接下來client發(fā)送一個(gè)ACK,同樣由于INPUT中允許,server接受這個(gè)包,至此連接完成,在整個(gè)過程中狀態(tài)從NEW變?yōu)镋STABLISHED(此時(shí)的TCP也是established)
注意:在第二步的時(shí)候,server上TCP的狀態(tài)是SYN_RECVD,對(duì)于iptables來講,狀態(tài)已經(jīng)是established,但此時(shí)的三次握手并沒有完成,實(shí)際是半連接(對(duì)與TCP來講,必須是三次握手完成以后,狀態(tài)才是established)。所以iptables面對(duì)SYNFLOOD攻擊,可以通過控制SYN流量結(jié)合tc等實(shí)現(xiàn)。但是對(duì)于SYN攻擊,即便能保護(hù)服務(wù)器,對(duì)于帶寬的消耗也是沒有辦法的,因?yàn)楣粽呦牧四愦蟛糠謳挕>唧w連接過程中TCP狀態(tài)是如何變化可參考看TCP/IP V1等著作(douglas E.comer或者Steven Richard等的經(jīng)典之作)。
注意iptables狀態(tài)機(jī)制在用戶空間里的部分不會(huì)查看TCP包的標(biāo)志位(也就是說TCP標(biāo)志對(duì)它而言是透明的)。如果我們想讓NEW狀態(tài)的包通過防火墻,就要指定NEW狀態(tài),我們理解的NEW狀態(tài)的意思就是指SYN包,可是iptables又不查看這些標(biāo)志位。這就是問題所在。有些沒有設(shè)置SYN或ACK的包,也會(huì)被看作NEW狀態(tài)的。這樣的包可能會(huì)被冗余防火墻用到,但對(duì)只有一個(gè)防火墻的網(wǎng)絡(luò)是很不利的(可能會(huì)被攻擊哦)。那我們?cè)鯓硬拍懿皇苓@樣的包的影響呢?可以使用tcp-flags進(jìn)行檢查。
上一節(jié):iptables中的狀態(tài)檢測(cè) 下一節(jié):iptables中的ICMP。
【編輯推薦】