這篇文章會盡可能以通俗易懂的方式描述iptables的相關概念,請耐心的讀完它。web
此處先描述一些相關概念。centos
從邏輯上講。防火牆能夠大致分爲主機防火牆和網絡防火牆。安全
主機防火牆:針對於單個主機進行防禦。服務器
網絡防火牆:每每處於網絡入口或邊緣,針對於網絡入口進行防禦,服務於防火牆背後的本地局域網。網絡
網絡防火牆和主機防火牆並不衝突,能夠理解爲,網絡防火牆主外(集體), 主機防火牆主內(我的)。框架
從物理上講,防火牆能夠分爲硬件防火牆和軟件防火牆。tcp
硬件防火牆:在硬件級別實現部分防火牆功能,另外一部分功能基於軟件實現,性能高,成本高。工具
軟件防火牆:應用軟件處理邏輯運行於通用硬件平臺之上的防火牆,性能低,成本低。post
那麼在此處,咱們就來聊聊Linux的iptables性能
iptables其實不是真正的防火牆,咱們能夠把它理解成一個客戶端代理,用戶經過iptables這個代理,將用戶的安全設定執行到對應的"安全框架"中,這個"安全框架"纔是真正的防火牆,這個框架的名字叫netfilter
netfilter纔是防火牆真正的安全框架(framework),netfilter位於內核空間。
iptables實際上是一個命令行工具,位於用戶空間,咱們用這個工具操做真正的框架。
netfilter/iptables(下文中簡稱爲iptables)組成Linux平臺下的包過濾防火牆,與大多數的Linux軟件同樣,這個包過濾防火牆是免費的,它能夠代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。
Netfilter是Linux操做系統核心層內部的一個數據包處理模塊,它具備以下功能:
網絡地址轉換(Network Address Translate)
數據包內容修改
以及數據包過濾的防火牆功能
因此說,雖然咱們使用service iptables start啓動iptables"服務",可是其實準確的來講,iptables並無一個守護進程,因此並不能算是真正意義上的服務,而應該算是內核提供的功能。
咱們知道iptables是按照規則來辦事的,咱們就來講說規則(rules),規則其實就是網絡管理員預約義的條件,規則通常的定義爲"若是數據包頭符合這樣的條件,就這樣處理這個數據包"。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工做就是添加、修改和刪除這些規則。
這樣說可能並不容易理解,咱們來換個容易理解的角度,從頭提及.
當客戶端訪問服務器的web服務時,客戶端發送報文到網卡,而tcp/ip協議棧是屬於內核的一部分,因此,客戶端的信息會經過內核的TCP協議傳輸到用戶空間中的web服務中,而此時,客戶端報文的目標終點爲web服務所監聽的套接字(IP:Port)上,當web服務須要響應客戶端請求時,web服務發出的響應報文的目標終點則爲客戶端,這個時候,web服務所監聽的IP與端口反而變成了原點,咱們說過,netfilter纔是真正的防火牆,它是內核的一部分,因此,若是咱們想要防火牆可以達到"防火"的目的,則須要在內核中設置關卡,全部進出的報文都要經過這些關卡,通過檢查後,符合放行條件的才能放行,符合阻攔條件的則須要被阻止,因而,就出現了input關卡和output關卡,而這些關卡在iptables中不被稱爲"關卡",而被稱爲"鏈"。
其實咱們上面描述的場景並不完善,由於客戶端發來的報文訪問的目標地址可能並非本機,而是其餘服務器,當本機的內核支持IP_FORWARD時,咱們能夠將報文轉發給其餘服務器,因此,這個時候,咱們就會提到iptables中的其餘"關卡",也就是其餘"鏈",他們就是 "路由前"、"轉發"、"路由後",他們的英文名是
PREROUTING、FORWARD、POSTROUTING
也就是說,當咱們啓用了防火牆功能時,報文須要通過以下關卡,也就是說,根據實際狀況的不一樣,報文通過"鏈"可能不一樣。若是報文須要轉發,那麼報文則不會通過input鏈發往用戶空間,而是直接在內核空間中通過forward鏈和postrouting鏈轉發出去的。
因此,根據上圖,咱們可以想象出某些經常使用場景中,報文的流向:
到本機某進程的報文: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的規則,以前打過一個比方,每條"鏈"都是一個"關卡",每一個經過這個"關卡"的報文都要匹配這個關卡上的規則,若是匹配,則對報文進行對應的處理,好比說,你我二人此刻就好像兩個"報文",你我二人此刻都要入關,但是城主有命,只有器宇軒昂的人才能入關,不符合此條件的人不能入關,因而守關將士按照城主制定的"規則",開始打量你我二人,最終,你順利入關了,而我已被拒之門外,由於你符合"器宇軒昂"的標準,因此把你"放行"了,而我不符合標準,因此沒有被放行,其實,"器宇軒昂"就是一種"匹配條件","放行"就是一種"動做","匹配條件"與"動做"組成了規則。
瞭解了規則的概念,那咱們來聊聊規則的組成部分,此處只是大概的將規則的結構列出,後面的文章中會單獨對規則進行總結。
規則由匹配條件和處理動做組成。
匹配條件分爲基本匹配條件與擴展匹配條件
基本匹配條件:
源地址Source IP,目標地址 Destination IP
上述內容均可以做爲基本匹配條件。
擴展匹配條件:
除了上述的條件能夠用於匹配,還有不少其餘的條件能夠用於匹配,這些條件泛稱爲擴展條件,這些擴展條件其實也是netfilter中的一部分,只是以模塊的形式存在,若是想要使用這些條件,則須要依賴對應的擴展模塊。
源端口Source Port, 目標端口Destination Port
上述內容均可以做爲擴展匹配條件
處理動做在iptables中被稱爲target(這樣說並不許確,咱們暫且這樣稱呼),動做也能夠分爲基本動做和擴展動做。
此處列出一些經常使用的動做,以後的文章會對它們進行詳細的示例與總結:
ACCEPT:容許數據包經過。
DROP:直接丟棄數據包,不給任何迴應信息,這時候客戶端會感受本身的請求泥牛入海了,過了超時時間纔會有反應。
REJECT:拒絕數據包經過,必要時會給數據發送端一個響應的信息,客戶端剛請求就會收到拒絕的信息。
SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,適用於動態的、臨時會變的ip上。
DNAT:目標地址轉換。
REDIRECT:在本機作端口映射。
LOG:在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則,也就是說除了記錄之外不對數據包作任何其餘操做,仍然讓下一條規則去匹配。
好了,iptables的概念暫時總結到這裏,懂得概念以後,再結合實際的命令去練習,搞定iptables絕對妥妥的。
iptables的實際操做咱們會另外總結爲其餘文章。
最後說一句,客官您的評論、收藏、推薦是兄弟我寫博客的最大動力,但願親之後多捧場哦,麼麼噠~~~~