1、iptables是什麼,清楚了你也就知道你在學什麼了。那樣你才會有動力
通俗的講,在網絡中有很多資料包在無時無刻的被傳送着。這些資料包很有可能是發給你的,也有可能是你發給别人的。這時你就可以對這些資料包進行處理和玩弄了。
例子:假如你的這台電腦是公司的web伺服器,每天很多人通路(有大量的使用者發給你資料包、當然也可能有爬蟲假冒使用者給你發送資料包,進而擷取你伺服器上的資源。更有可惡人想破壞你的機器向你的伺服器發送很多亂七八糟的資料包進而達到破壞你的伺服器或者控制你的伺服器。這就很危險了)。這時偉大的防火牆就出來了(你可以把它想象成是一道進城的大門),這時你就可以在防火牆上制定各種各樣的标準來控制這些資料包最終的結局(打個比方你就允許溫柔大方善良孝順的姑娘進城,不允許愛慕虛榮不思進取愛臭美的女子進入)。是不是很好玩,關聯到資料包上就是你控制哪些資料包可以通過這個防火牆,哪些不能通過。這樣你的機器就會相對來說安全多了(正常使用者随便通路,爬蟲一旦被你識别出來你就直接拉黑,攻擊你機器的使用者直接拉黑并且加強你的防火牆叫這家夥再也打不着打不穿甚至可以追蹤他,把他挖出來揍他一頓,扔進局子裡。叫他小丫的不老實。)
2、看之前還是先看看必須具備的基礎常識,隻有熟悉了這些常識你才會看得更透。
2.1、Linux防火牆組成:
netfilter:Frame #說得通俗點這個就可以看做你進城的大門 ,大門是不會幫你看誰是好人誰是壞人的。你必須在這扇大門上張貼犯罪嫌疑人的畫像。用畫像來比對進城的每一個資料包
iptables:規則生成的工具 #這個通俗的講就是你用來畫犯罪嫌疑人畫像的那隻畫筆。沒有個筆你叫我拿什麼畫頭像啊?
2.2網絡:IP封包首部,TCP封包首部
這些也是你要熟知的基礎知識,打個比方(你要用iptables畫犯罪嫌疑人的頭像你得知道犯罪嫌疑人眉毛什麼樣、鼻子什麼樣、身高多少、男的女的)。關聯到資料包就是說
這個犯罪資料包的ip是多少啊、端口是多少啊、mac位址是多少啊等等特征來幫助你描述這個資料包。這樣你才能把這個資料包畫出來不是嗎。重點主要是ip位址、端口号、以及基于狀态的TCP封包(SYN、ACK、FIN狀态的資料包,說白了就是三次握手建立連接配接時資料包的樣子。别小看了這點)
IP封包如下:
注釋:IP封包各部分含義
IP version #ip協定版本号
Her Len #資料包首部長度
Type of service #服務類型,這個比較複雜。不過這裡沒涉及到它,想了解的去google
Total Length #資料包總長度
Identification (fragment ID) #資料包分片id,當資料包過大時,網絡中的有些裝置是沒辦法傳送的,這時就必須将大的資料包變為小的資料包來傳送。這就需要标記一下,後邊接收到後才能再組裝起來。
R #等你來添加,我忘記了
D/F #不允許分片,意思就是這個資料包如果過大不能傳送的話。那也不能給我分片。說白了就是别給我分成小片傳送,你直接丢了就算了。
M/F #這個意思就是說你随意幫我分片吧,隻要能傳過去就行了。表示允許分片
Fragment Offset #意思是如果你分片了,那麼每一個分片在原來的資料包中是什麼位置你得記住。友善後邊重組資料包
Time-To-Live #意思就是這個資料包會經過很多路由裝置,當經過一個裝置時這個TTL值就會減少1。這麼做主要是防止那些無主的資料包在網絡中積累造成網絡阻塞。咋們國家的防火牆就是這麼玩你的,他直接把你通路google的資料包在它的裝置上來回跳幾次,就是不給你路由到google的伺服器上。這就造成你給google發送的所有的資料包都累死了。
Protocol #就是你這個資料包是什麼協定的資料包(TCP、UDP、ICMP)這個就是一個數字編号
Header Check sum #頭部校驗和,主要就是起到資料完整性的功能,防止傳輸過程中出現故障或者有人破壞資料包。當然了人家要是能破壞就能給你重新生成一個校驗和。
Source IP Address #原ip位址,這個就不用說了吧。你自己的ip位址
Destination IP Address # 目的ip,你要通路的機器的ip位址
Options #可選選項
Data #資料部分。這才是你傳送的資料。當然這裡邊還有其他的協定頭。比如httpd協定頭、UDP頭、TCP頭等等。自己查查吧這裡用不到。
TCP封包:
注釋:
Source Port Number :源端口号。
Destination Port Number :目标端口号
Sequence Number : 三次握手時第一個資料包的id(随機生成一個數字),比如用N表示
Acknowledgement Number : 三次握手資料包确認包的id,在上邊N的基礎上加1。
Header Length : TCP包首部長度。
Reserved:保留未使用
URG:緊急狀态為,這個如果是1,則下邊的Urgent Pointer有效。表明這個資料包很緊急必須馬上處理别排隊了
ACK:三次握手時确認資料包的這個位是1
PUSH:這個位是1表示資料包不用排隊,直接推送處理
SYN:表示三次握手時首個資料包這個位是1(用戶端和監聽端首個資料包,也就是發起三次握手時一共有兩個資料包這個位是1)
FIN:結束包位,資料傳送玩斷開連接配接是資料包的的這個位是1。等會附上一張圖三次握手過程圖友善了解。
Window Size : 滑動視窗大小,表示一次可以傳送很多資料包,不用一個資料包過去就校驗一次(TCP是基于連接配接的協定)。這樣可以一次傳送很多,之後一次校驗。失敗的傳送會從新傳送。這個大小是伺服器和客戶單協商的,伺服器會告訴用戶端我這個視窗多大,你可以一次傳多少。當伺服器很忙是他就把這個視窗調小。(意思就是你丫的等會我這太忙了,先别傳了)
TCP Checksum :資料包校驗和。保證資料完整性防止傳輸過程中因為 某些原因資料包出問題
Urgent Pointer : 緊急指針。具體這樣的資料包怎麼處理我還不太清楚。以後有機會又到了補充
Options #可選選項
Data ; #資料區
三次握手過程:
注釋:一開始用戶端是處于closed狀态的(學過socket程式設計的童靴應該知道),之後三次握手開始。用戶端伸出手發送第一個SYN=1 ACK=0的資料包(發送完這個資料包後用戶端就轉變成了SYN_SENT狀态),之後服務端接收這個請求資料包并回送一個SYN=1 ACK=1的資料包(會送完後服務端由原來的listen狀态轉化成SYN_RECD狀态),之後用戶端收到服務端的資料包後在最後回複一個ACK=1(這時沒SYN什麼鳥事了) 的資料包給服務端,當服務端收到這個确認包之後就從SYN_RECD狀态轉換成ESTABLISHED。這樣三次握手結束。後邊就是發送資料了。(重點注意這三次握手的時候每次的SYN和ACK的值是多少,後邊要根據這個來描述資料包進而對其進行處理)
三次握手詳細流程:上邊的圖有點潦草。但是最簡單。下邊給出詳細的圖。過程和上邊的草圖是一樣的。自己看看,别怕看不懂,一點都不難。就和1+1=2一樣
四次斷開,剛才寫了三次握手。現在搞TCP的四次斷開(伺服器和用戶端斷開連接配接要經過四步才會完成,是以叫四次斷開):
注釋:首先用戶端發送斷開請求,發送第一個FIN=1的資料包(這時用戶端轉變成TIME_WAIT1狀态),之後服務端收到資料包會送一個ACK=1的資料包(服務端轉換成CLOSE_WAIT狀态),之後用戶端收到資料包後由TIME_WAIT1狀态轉換成TIME_WAIT2狀态并且在這期間服務端會再次發送FIN=1的資料包(此時服務端由CLOSE_WAIT轉換成LAST_ACK狀态等待用戶端最後确認),之後用戶端發送ACK=1的确認包并從TIME_WAIT2轉換成CLOSED狀态(這個狀态轉換需要一段時間,大概兩倍單程資料包傳送時間 )這時服務端會受到資料包最終關閉,用戶端也關閉。##主要看上邊的圖就行了,我說的沒畫的好
2.3、防火牆預設規則。
當預設規則為開放時,我們就需要堵住有害的資料包。##打個比方城門總是開着,我隻需要盤查犯罪嫌疑人就行了
當預設規則為關閉時,我們就西藥疏通正常的資料包 ##城門總是關着,我隻要放行正常的老百姓就行了。
2.4比對标準。這個就是上邊給出那麼多圖的精華,資料包的樣子怎麼描述,就靠下邊的特征。我們就靠這個來找資料包的。找到後就可以處理它
打個比方,人是這樣描述的:某個嫌疑人鼻子長長的,嘴巴漸漸的。而資料包是這樣描述的:某個資料包的ip是什麼什麼樣得,源端口是什麼樣的,目标端口是什麼樣的...。
IP: SIP, DIP
TCP: SPORT, DPORT, SYN=1,FIN=0,RST=0,ACK=0; SYN=1,ACK=1,FIN=0,RST=0; ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)
UDP: SPORT, DPORT
ICMP:icmp-type
2.5、看看netfilter結構是什麼樣子的,資料包是怎樣流動的,這樣我們才能把規則放到正确的地方。
打個比方,就是我們的進城大門都是什麼樣子的,看看老百姓是怎麼經過城門的。我們就知道在哪些大門上張貼犯罪嫌疑人的畫像了。這是很重要的,你畫像畫得再好如果你貼到廁所裡面誰看得見那,怎麼比對犯罪嫌疑人呢。難不成我還要士兵去茅廁裡邊看看畫像再回來比對啊。
注釋:上邊的圖實在太棒了,這張圖一定要記在心中(背下來)。因為你所有的規則都要放到相應的位置。下邊綠色字型部分友善了解這張圖可以看看。
資料包怎麼走的請參考下這位大牛的,我就不寫了:http://blog.csdn.net/huguohu2006/article/details/6453522
由上圖可知,規則鍊一共五個:這五個鍊在核心中就是五個鈎子函數,所有進出的資料包必經之路。
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
我們想要對資料包實作的功能也就那麼幾種:過濾、位址轉換、修改資料包。是以為了友善大家使用上邊的5條規則鍊,大牛們抽象了四張表,我們就不用去直接操作那5條鍊。
這就好比人家給你做好了各個類,你直接用就行了。而不必在自己寫類了。(熟悉java、python的同學應該了解這個意思)。說白了有了java我才懶得用c語言去開發大型的應用程式。那不得累死我啊。大牛們給我們抽象的表就是下邊這幾個。參考下就行了,寫規則的時候直接看上邊的那個漂亮的圖就行了。
filter(過濾):表
INPUT
OUTPUT
FORWARD
nat(位址轉換):表
PREROUTING
OUTPUT
POSTROUTING
mangle(拆開、修改、封裝):表
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
raw():表
PREROUTING
OUTPUT
2.6、有些時候即便是上邊的那些鍊都還是不夠用的,是以有時我們還會自定義些鍊來滿足我們的需要。
打個比方,盤查的城門裡三層外三層,百姓過關的速度太慢了,這時為了優化一下,我們就會簡化下城門,比如我們抽出2個城門,這兩個城門大部分百姓都不用盤查了,隻是符合某些要求的百姓才會被叫過去盤查下(比如長大想李逵那樣的,一看就不像個百姓。當然得拉出去特殊照顧下)。這樣百姓過關的速度就快很多了。
可以使用自定鍊,但隻在被調用時才能發揮作用,而且如果沒有自定義鍊中的任何規則比對,還應該有傳回機制;
用可以删除自定義的空鍊
預設鍊無法删除
2.7寫規則的文法:這個是最後的精華。後邊就可以開始寫規則了(就可以找城門畫嫌疑人的畫像了)。
規則:比對标準,處理動作
iptables [-t TABLE] COMMAND CHAIN [num] 比對标準 -j 處理辦法
比對标準:
通用比對
-s, --src: 指定源位址
-d, --dst:指定目标位址
-p {tcp|udp|icmp}:指定協定
-i INTERFACE: 指定資料封包流入的接口
可用于定義标準的鍊:PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定資料封包流出的接口
可用于标準定義的鍊:OUTPUT,POSTROUTING,FORWARD
擴充比對
隐含擴充:不用特别指明由哪個子產品進行的擴充,因為此時使用-p {tcp|udp|icmp}
顯式擴充:必須指明由哪個子產品進行的擴充,在iptables中使用-m選項可完成此功能
-j TARGET
ACCEPT
DROP
REJECT
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j DROP
2.8、附加内容:重要,下邊參考體會下是不是有道理。體會不到的話也沒啥,後邊寫規則的時候會知道的。這是很簡單的,有啥好怕的。
我們到時候寫的規則會很多,那麼這些規則在放到各個鍊上的時候是有要求的。
1>不能兩種功能的規則穿插着放,就是說PREROUTING鍊上的mangle類型的規則和nat類型的規則不能穿插着放。必須是mangle放到前面,nat類型的放在後邊。其他鍊上的規則書寫順序也必須按照這個原理。看上邊那幅漂亮的圖就行了。按照箭頭的順序寫規則就行了。
2>當同一功能的規則很多時(比如過濾功能的規則),我們應該把那些有特點的規則拿出來。單獨定制一個鍊,這樣大部分的資料包都不必經過這個自定義的鍊,隻有符合要求的資料包才會進入這個鍊進行盤查。
3>當同一功能的規則很多時,我們應該把最容易比對到資料包的鍊放到前面,這樣我們的處理速度會很快。(打個比方,我們把第一道城門關卡上作出規定,凡是強壯的男人都給我抓出來當壯丁。那麼這些後邊的關卡就不用盤問這些猛男了。直接輕松了不少)
4>雖說比對标準(就是描述資料包是什麼樣子的那些東西,比如端口或者ip或者協定。我們經常說ip位址是x.x.x.x的資料包。這不就是在用ip描述資料包嗎。這個形容詞就是比對标準)和鍊沒什麼必然的聯系(在任何鍊上都可以用這些特征描述資料包)。但是還是有些比對标準是有影響的。
-i INTERFACE: 指定資料封包流入的接口(網卡)。 ##這個描述資料包的 ‘’比對标準‘’ 就隻能放在下邊的幾條鍊中。
可用于定義标準的鍊:PREROUTING,INPUT,FORWARD
-o INTERFACE: 指定資料封包流出的接口(網卡) 。 ##這個描述資料包的 ‘’比對标準‘’ 就隻能放在下邊的幾條鍊中。
可用于标準定義的鍊:OUTPUT,POSTROUTING,FORWARD
5>netfilter架構功能已經基本能滿足我們的需要,但是有些情況下還是需要特殊的功能的(比如對mac位址比對标準的資料包。netfilter就沒有這功能。這時就需要使用netfilter的擴充功能子產品來完成任務了。netfilter有很多功能擴充子產品可供我們選擇使用。指令:rpm -ql iptables 檢視所有我們可用的擴充功能子產品。)