1. 程式人生 > >通俗易懂詳解iptables

通俗易懂詳解iptables

到本機某程序的報文:PREROUTING --> INPUT
由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING
由本機的某程序發出報文(通常為響應報文):OUTPUT --> POSTROUTING
 
 
鏈的概念


現在,我們想象一下,這些"關卡"在iptables中為什麼被稱作"鏈"呢?我們知道,防火牆的作用就在於對經過的報文匹配"規則",然後執行對應的"動作",所以,當報文經過這些關卡的時候,則必須匹配這個關卡上的規則,但是,這個關卡上可能不止有一條規則,而是有很多條規則,當我們把這些規則串到一個鏈條上的時候,就形成了"鏈",所以,我們把每一個"關卡"想象成如下圖中的模樣  ,這樣來說,把他們稱為"鏈"更為合適,每個經過這個"關卡"的報文,都要將這條"鏈"上的所有規則匹配一遍,如果有符合條件的規則,則執行規則對應的動作。

 
 
表的概念


我們再想想另外一個問題,我們對每個"鏈"上都放置了一串規則,但是這些規則有些很相似,比如,A類規則都是對IP和者埠的過濾,B類規則是修改報文,那麼這個時候,我們是不是能把實現相同功能的規則放在一起呢,必須能的。
 
我們把具有相同功能的規則的集合叫做"表",所以說,不同功能的規則,我們可以放置在不同的表中進行管理,而iptables已經為我們定義了4種表,每種表對應了不同的功能,而我們定義的規則也都逃脫不了這4種功能的範圍,所以,學習iptables之前,我們必須先搞明白每種表 的作用。
iptables為我們提供瞭如下規則的分類,或者說,iptables為我們提供瞭如下"表"
 
filter表:負責過濾功能,防火牆;核心模組:iptables_filter
nat表:network address translation,網路地址轉換功能;核心模組:iptable_nat
mangle表:拆解報文,做出修改,並重新封裝 的功能;iptable_mangle
raw表:關閉nat表上啟用的連線追蹤機制;iptable_raw
也就是說,我們自定義的所有規則,都是這四種分類中的規則,或者說,所有規則都存在於這4張"表"中。
 
 
錶鏈關係


但是我們需要注意的是,某些"鏈"中註定不會包含"某類規則",就像某些"關卡"天生就不具備某些功能一樣,比如,A"關卡"只負責打擊陸地敵人,沒有防空能力,B"關卡"只負責打擊空中敵人,沒有防禦步兵的能力,C"關卡"可能比較NB,既能防空,也能防禦陸地敵人,D"關卡"最屌,海陸空都能防。
那讓我們來看看,每個"關卡"都有哪些能力,或者說,讓我們看看每個"鏈"上的規則都存在於哪些"表"中。
我們還是以圖為例,先看看prerouting"鏈"上的規則都存在於哪些表中。
注意:下圖只用於說明prerouting鏈上的規則存在於哪些表中,並沒有描述表的順序。
 

這幅圖是什麼意思呢,它的意思是說,prerouting"鏈"只擁有nat表、raw表和mangle表所對應的功能,所以,prerouting中的規則只能存放於nat表、raw表和mangle表中。
 
那麼,根據上述思路,我們來總結一下,每個"關卡"都擁有什麼功能,
或者說,每個"鏈"中的規則都存在於哪些"表"中。
PREROUTING      的規則可以存在於:raw表,mangle表,nat表。
INPUT          的規則可以存在於:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。
FORWARD         的規則可以存在於:mangle表,filter表。
OUTPUT         的規則可以存在於:raw表mangle表,nat表,filter表。
POSTROUTING      的規則可以存在於:mangle表,nat表。
 
但是,我們在實際的使用過程中,往往是通過"表"作為操作入口,對規則進行定義的,之所以按照上述過程介紹iptables,是因為從"關卡"的角度更容易從入門的角度理解,但是為了以便在實際使用的時候,更加順暢的理解它們,此處我們還要將各"表"與"鏈"的關係羅列出來,
表(功能)<-->   鏈(鉤子):
raw     表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT
mangle  表中的規則可以被哪些鏈使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat     表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter  表中的規則可以被哪些鏈使用:INPUT,FORWARD,OUTPUT
 
其實我們還需要注意一點,因為資料包經過一個"鏈"的時候,會將當前鏈的所有規則都匹配一遍,但是匹配時總歸要有順序,我們應該一條一條的去匹配,而且我們說過,相同功能型別的規則會匯聚在一張"表"中,那麼,哪些"表"中的規則會放在"鏈"的最前面執行呢,這時候就需要有一個優先順序的問題,我們還拿prerouting"鏈"做圖示。

prerouting鏈中的規則存放於三張表中,而這三張表中的規則執行的優先順序如下:
raw --> mangle --> nat
 
但是我們知道,iptables為我們定義了4張"表",當他們處於同一條"鏈"時,執行的優先順序如下。
優先順序次序(由高而低):
raw --> mangle --> nat --> filter
但是我們前面說過,某些鏈天生就不能使用某些表中的規則,所以,4張表中的規則處於同一條鏈的目前只有output鏈,它就是傳說中海陸空都能防守的關卡。
 
為了更方便的管理,我們還可以在某個表裡面建立自定義鏈,將針對某個應用程式所設定的規則放置在這個自定義鏈中,但是自定義連結不能直接使用,只能被某個預設的鏈當做動作去呼叫才能起作用,我們可以這樣想象,自定義鏈就是一段比較"短"的鏈子,這條"短"鏈子上的規則都是針對某個應用程式制定的,但是這條短的鏈子並不能直接使用,而是需要"焊接"在iptables預設定義鏈子上,才能被IPtables使用,這就是為什麼預設定義的"鏈"需要把"自定義鏈"當做"動作"去引用的原因。這是後話,後面再聊,在實際使用時我們即可更加的明白。
 
 
資料經過防火牆流程


結合上述所有的描述,我們可以將資料包通過防火牆的流程總結為下圖:

 
 
我們在寫Iptables規則的時候,要時刻牢記這張路由次序圖,靈活配置規則。
 
 
我們將經常用到的對應關係重新寫在此處,方便對應圖例檢視。
鏈的規則存放於哪些表中(從鏈到表的對應關係):
PREROUTING   的規則可以存在於:raw表,mangle表,nat表。
INPUT        的規則可以存在於:mangle表,filter表,(centos7中還有nat表,centos6中沒有)。
FORWARD      的規則可以存在於:mangle表,filter表。
OUTPUT       的規則可以存在於:raw表mangle表,nat表,filter表。
POSTROUTING  的規則可以存在於:mangle表,nat表。
 
 
表中的規則可以被哪些鏈使用(從表到鏈的對應關係):
raw     表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT
mangle  表中的規則可以被哪些鏈使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat     表中的規則可以被哪些鏈使用:PREROUTING,OUTPUT,POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter  表中的規則可以被哪些鏈使用:INPUT,FORWARD,OUTPUT
下圖中nat表在centos7中的情況就不再標明。
 
 
 
 
規則的概念


說了一圈又說回來了,在上述描述中我們一直在提規則,可是沒有細說,現在說說它。
 
先說說規則的概念,然後再通俗的解釋它。
規則:根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則後面指定的處理動作進行處理;
 
那麼我們來通俗的解釋一下什麼是iptables的規則,之前打過一個比方,每條"鏈"都是一個"關卡",每個通過這個"關卡"的報文都要匹配這個關卡上的規則,如果匹配,則對報文進行對應的處理,比如說,你我二人此刻就好像兩個"報文",你我二人此刻都要入關,可是城主有命,只有器宇軒昂的人才能入關,不符合此條件的人不能入關,於是守關將士按照城主制定的"規則",開始打量你我二人,最終,你順利入關了,而我已被拒之門外,因為你符合"器宇軒昂"的標準,所以把你"放行"了,而我不符合標準,所以沒有被放行,其實,"器宇軒昂"就是一種"匹配條件","放行"就是一種"動作","匹配條件"與"動作"組成了規則。
 
瞭解了規則的概念,那我們來聊聊規則的組成部分,此處只是大概的將規則的結構列出,後面的文章中會單獨對規則進行總結。
規則由匹配條件和處理動作組成。