【 實戰筆記 -- iptables 概念 1 】linux
一. 防火牆相關概念web
# 從邏輯上講,防火牆能夠分爲主機防火牆和網絡防火牆。centos
1> 主機防火牆: 針對於單個主機進行防禦安全
2> 網絡防火牆: 每每處於網絡入口或邊緣,針對於網絡入口進行防禦,服務於防火牆背後的本地局域網。服務器
3> 網絡防火牆和主機防火牆並不衝突,能夠理解爲,網絡防火牆主外(集體)網絡
主機防火牆主內(我的)框架
# 從物理上講,防火牆能夠分爲硬件防火牆和軟件防火牆tcp
1> 硬件防火牆:在硬件級別實現部分防火牆功能,另外一部分功能基於軟件實現,性能高,成本高。工具
2> 軟件防火牆: 應用軟件處理邏輯運行於通用硬件平臺之上的防火牆,性能低,成本低性能
二. Linux iptables
Iptables 其實不是真正的防火牆,咱們能夠把它理解成一個客戶端代理,用戶經過iptables 這個代理,將用戶的安全設定執行到對應的「安全框架」中,這個「安全框架」纔是真正的防火牆,這個框架的名字叫netfilter
Netfilter 纔是防火牆真正的安全框架(framework),netfilter 位於內核空間。
Iptables 實際上是一個命令行工具,位於用戶空間,咱們這個工具操做真正的框架。
Netfilter 是linux 操做系統核心層內部的一個數據包處理模塊,它具備以下功能:
1> 網絡地址轉換(Network address translate)
2> 數據包內容修改
3> 以及數據包過濾的防火牆功能
三. 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中被稱爲「鏈」。
其實咱們上面的描述的場景並不完善,由於客戶端發來的報文訪問的目標地址可能並非本機,而是其餘服務器,當本機的內核支持FORWARD 時,咱們能夠將報文轉發給其餘服務器,因此,這個時候,咱們就會提到iptables中的其餘「關卡」,也就是其餘鏈,他們就是「路由前--PREROUTING」,「轉發--FORWARD」,「路由後--POSTROUTING」。當咱們啓用防火牆時,根據實際狀況不一樣,報文通過「鏈」可能不一樣。若是報文須要轉發,那麼報文則不會通過input 鏈發往用戶空間,而是直接在內核空間中通過FORWARD鏈和POSTROUTING鏈轉發出去的。
因此,根據上圖,咱們可以想象出來某些 經常使用場景中,報文的流向:
到本機某進程的報文:PREROUTING--> INPUT
由本機轉發的報文: PREROUTING ---> FORWARD ---> POSTROUTING
由本機的某進程發出報文(一般爲相應報文): OUTPUT ---> POSTROUTING
四. 鏈的概念
如今,咱們想象一下,這些「關卡」在iptables 中爲何被稱做「鏈」呢?咱們知道防火牆的做用就在於對通過的報文匹配「規則」,而後執行對應的「動做」,因此,當報文通過這些關卡的時候,則必須匹配這個關卡上的規則,可是,這個關卡可能不止有一條規則,而是有不少條規則,當咱們把這些規則串到一個鏈條上的時候,就造成了「鏈」,因此,咱們把每個「關卡」想象成以下圖中的模樣,這樣來講,把他們稱爲「鏈」更爲合適,每一個通過這個關卡的報文,都要講這條「鏈」的全部規則匹配一遍,若是有符合的規則,則執行規則對應的動做。
五. 表的概念
咱們對每一個「鏈」上都放置了一串規則,可是這些規則有些很類似,好比,A類規則都是對IP或者端口的過濾,B類規則是修改報文,那麼這個時候,咱們是否是能把實現相同功能的規則放在一塊兒呢,這是必須能的。
咱們把具備相同功能的規則的集合叫作「表」,因此說,不一樣功能的規則,咱們能夠放置在不一樣的表中進行管理,而iptables 已經爲咱們定義了4種表,每種表對應了不一樣的功能iptables 爲咱們提供了以下規則的分類,或者說,iptables 爲咱們提供了以下「表」。
Filter表: 負責過濾功能,防火牆;內核模塊:iptables_filter
Nat 表: 網絡地址轉換(network address translation);內核模塊:iptables_nat
Mangle 表: 拆解報文,作出修改,並從新封裝的功能;
Raw: 關閉,nat表上啓用的鏈接追蹤機制;iptable_raw
也就是說,咱們自定義的全部規則,都是這四種分類中規則,或者說,全部規則都存在於這4張「表」中。
六.錶鏈關係
可是咱們須要注意的是,某些「鏈」 中註定不會包含「某類規則」,就像某些「關卡」天生就不具有某些功能同樣,好比,A「關卡」只負責打擊陸地敵人,沒有防控能力,B 「關卡」只負責打擊空中敵人,沒有防護步兵的能力,C 「關卡」可能比較NB,既能防空,也能防護陸地敵人,D「關卡」最屌,海陸空都能防。
那讓咱們來看看,每一個「關卡」都有哪些能力,或者說,讓咱們看看每一個「鏈」
上的規則都存在於哪些「表」中。
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 表 中規則能夠被哪些鏈使用: PREOUTING OUTPUT POSTROUTING(centos 7 中還有INPUT, centos6 中沒有)
Filter 表中的規則能夠被哪些鏈使用: INPUT FORWARD OUTPUT
七. 數據通過防火牆的流程
結合上述全部的描述,咱們能夠將數據包經過防火牆的流程總結爲下圖:
咱們在寫iptable 規則的時候,要時刻牢記這張路由次序圖,靈活配置規則
將常常用到的對應關係從新寫在此處,方便對應圖例查看。
鏈的規則存放於哪些表中(從鏈到表的對應關係):
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
八. 規則的概念
規則:根據指定的匹配條件來嘗試匹配每一個流經此處的報文,一旦匹配成功,則由規則後面指定的處理動做進行處理。
那麼咱們來通俗的解釋一下什麼時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 文件記錄日誌信息,而後將數據包傳遞給下一條規則,也就是說除了記錄之外不對數據包走任何其餘操做,仍然讓下一條規則去匹配。