防火牆按照實作方法可以分為軟體防火牆和硬體防火牆
純硬體防火牆是很少的,一般見到的防火牆裝置都是依靠軟體搭配實作
按照功能可以将防火牆分為包過濾防火牆和網關代理型防火牆
包過濾防火牆
工作在網絡層和傳輸層。特點:效率高,安全性不及網關型防火牆
包過濾防火牆又可以分為“狀态檢測型”和“簡單包過濾型”
網關代理型
工作于應用層,位于OSI的最高層。特點:效率低,安全性好
而在linux中,iptables是一款自帶的防火牆軟體,基于核心實作網絡流量的過濾
針對資料包的IP位址,端口,标志位,連接配接狀态定義相應的防火牆規則,比對規則後用指定的處理機制進行處理,可以是允許,可以是丢棄
首先簡單介紹一下一個資料包進入linux後是如何處理的
<a href="http://lustlost.blog.51cto.com/attachment/201207/21/2600869_1342864316XQ1Q.png"></a>
資料包從網卡1進入linux主機後,首先進入核心維護的網絡記憶體空間隊列。核心接手資料包後,會進行一系列的流水線處理
核心的TCP/IP協定棧解封IP頭部後,先是檢測資料包的目的IP,然後對比路由表
如果目标IP是指向自己,于是檢測TCP首部,将資料包遞交給處于核心空間和使用者空間的套接字(即端口),讓使用者空間的程式進行處理。使用者程式從套接字取出資料後,進行處理後,改寫目标IP和源IP,從新遞交給對應的套接字。然後TCP/I協定棧進行資料包的封裝,原路傳回
如果目标IP不是自己,對比路由表,如果是将要從網卡2發送出去的。TCP/IP協定棧就直接将資料從記憶體中取出,交由網卡2發送出去,這一切将都在核心空間完成,無需進入使用者空間
IPtables分為2部分,一部分位于核心中,用來存放規則,稱為NetFilter。還有一段在使用者空間中,用來定義規則,并将規則傳遞到核心中,這段在使用者空間中的程式就叫做iptables。
其中存放規則有5個地方,分别位于 1、2、3、4、5 這5個點
1是由内部主動發往外部的規則,2是由外部發往内部的規則,3是不進入使用者空間,進行路由轉發的規則,4是資料進來,還未查詢路由表之前的規則,5是查詢完路由表,将要出去的規則
在這5個點都可以定義不同的規則,用以實作處理不同流向的資料包
這5個過濾點,在核心中也叫做hook function(鈎子函數)
而這5個鈎子,也有着個自的名字
1:input 2:output 3:forward 4:prerouting 5:postrouting
對于4和5,主要是為了實作NAT功能
真正做資料過濾的地方在123這3個點
具體資料的流向
<a href="http://lustlost.blog.51cto.com/attachment/201207/21/2600869_1342864320Vjh0.jpg"></a>
在這張圖中,raw用的比較少不多做介紹,而mangle主要用以資料包的的修改。在處理資料包時,優先級依次以mangle、nat、filter排序
在iptables中,以鍊為機關定義一組規則,對于不同功能的鍊又組成不同的表
<a href="http://lustlost.blog.51cto.com/attachment/201207/21/2600869_13428643330oXZ.jpg"></a>
鍊也可以自定義建立,但不會直接生效,需要在預設的鍊中建立規則跳轉,可以将資料包的比對檢查跳轉到自定義建立的鍊中。如果在自定義建立的鍊中比對到,就直接進行處理,如果比對不到,就跳轉會預設的鍊中
由于這一切都是在核心中完成的,是以在使用者空間中的iptables傳遞規則給netfliter後,并不會永久有效,在重新開機後規則就會丢失,于是可以将規則寫成腳本,在每次啟動系統時将規則傳遞給核心
而redhat則使用另外一種機制來應用規則和取消規則,具體的實作方法,下篇博文再細細介紹
本文轉自lustlost 51CTO部落格,原文連結:http://blog.51cto.com/lustlost/937471,如需轉載請自行聯系原作者