之前的博文己說明了ip、tcp封包格式,深入了解其報文格式,對于這次說明 iptables的原理將有很大幫助。
前言
如果你運行的是linux操作系統,那么很有可以遇到過iptables防火墻,因為iptables提供了一個有效的手斷來控制誰可以且如何通過網絡連接到linux系統。部署一個嚴格的iptables過濾策略是維護一個強大實體的第一步。
一、iptables與netfilter
如果一說iptables就表示防火墻,其實這樣說并不準確;iptables防火墻由Netfilter項目開發,自2001年1月linux2.4內核發布以來,它就成了linux的一部分了。由linux提供的所有包過慮和包修改設施的官方項目名為Netfilter,但這個術語同時也指linux內核中的一個框架,它可以用于在不同的階段將函數掛接進網絡棧。另一個方面,iptables使用netfilter框架旨在將對數據包執行操作(如過慮)的函數掛進網絡棧,你可以認為netfilter提供了一框架,iptables在它之上建立了防火墻功能。nterfilter本身并不對數據包進行過慮———它只是允許可以過慮數據包的函數掛接到內核中適當的位置。netfilter項目還在內核中提供了一些基礎設施,如連接跟蹤和志記錄,任何iptables策略都可以使用這些設施來執行對特定的數據包處理。
二、iptables過濾
iptables的策略是如何定義的?其實iptabels就是一個過濾器,它可根據數據來源和去向進定限定。ip過慮主要工作于tcp/ip的協議的第二層,當然iptables有工作在第三層的能力。iptables嚴格按照tcp/ip協議處理報文流,但iptables是基于逐包的原則上處理的,它跟蹤的序列號,端口號等等,來確定了一個唯一的流,這個就是所謂的連接跟蹤,在連接的跟蹤的基礎之上,我們就可以做一些其它的操作,例如NAT,或者是基于狀態的包過慮。
三、ip過濾的術語
1、DROP
當一個報文被丟棄或者拒絕的時個,它是被簡單的釋放,沒有更多的后續工作,不會發送一個回應告訴主機這個報文被丟棄了,接收主機也不會被告知這個報文丟棄了,這個報文從此消失。
2、REJECT
從根本上來說,這個動作和上面的 DROP一樣,只是REJECT 還會發送一個應答給發送主機,通知他這個報文被丟棄了。
3、APPECT
接受一個報文并且讓他從防火墻的規則里面透過,它和DROP/REJECT 是相對的。
4、 Policy
我們講策略的時候,主要有兩重含義。第一是假如報文通過防火墻規則鏈檢查的時候,不匹配任何規則我們應該怎么做,這個是我們講的主要關注點。另外一個策略的含義就是我們通常講的寬泛的安全策略。
5、Rule
在 Iptables 的實現里面,一個規則就是一個基本匹配加上可能存在的幾個擴展匹配以及唯一的一個動作。我們已經提供了很多的動作或者匹配,他們都可以被應用到規則里面。
6、Target
通常而言,在規則集合里面的每一條規則都有一個自己的目標,換句我們更容易理解的話就是動作。假如一個報文匹配這個規則,那么這個動作就要被執行。例如這個動作可能是丟棄或者接收報文,還有可能是地址轉換,每一個規則的 Target 都是可選的。
7、State
一個報文的狀態是相對于一組報文來說的。例如,一個報文是防火墻第一次見到或者是已知的,那么他們的狀態分別就是新建或者穩定流。狀態可以通過連接跟蹤系統獲取到,在連接跟蹤系統里面保存了所有的會話。
8、Table
每一個表都有特定的目的,在 iptables 里面有四個表,分別是raw,mang,net,filter.例如,filter表專門用來完成報文過濾,nat表專門用來完成地址轉化等等。
9、Chain
一個鏈其實就是一組規則集合,在iptables里有五條鏈,分別是PREROUTING,INPUT,OUTP POSTROUTING,FORWORD這個規則會被應用到所有經過這個鏈的報文。每一個鏈都有其特定的含義,例如它關聯到哪個表,它能夠做什么事情。
四、表與鏈
1、規則表
注:表的優先級同下順序
(1)、raw表
屬性 說明
相關鏈 OUTPUT、PREROUTING
作用 raw表的一個主要用途就是為了一件事情,那就是對報文設置一個標志,決定數據包是否被狀態跟蹤機制處理
內核模塊 iptable_raw
(2) 、mangle表
屬性 說明
相關鏈 PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用 修改數據包的服務類型、TTL、并且可以配置路由實現QOS。
內核模塊 iptable_mangle
(3)、nat表
屬性 說明
相關鏈 PREROUTING、POSTROUTING、OUTPUT
作用
只能用來完成源/目的地址的轉換。需要注意的是,只有第一個報文會經過這個表,這個連接的其他報文會自動完成轉換。這個表的 target 有: DNAT、SNAT、MASQUERADE、REDIRECT
內核模塊 iptable_nat
(4)、filter表
屬性 說明
相關鏈 INPUT、FORWARD、OUTPUT
作用 報文過濾
內核模塊 iptables_filter
2、規則鏈
鏈 說明
PREROUTING 對數據包作路由選擇前應用此鏈中的規則。(所有的數據包進來的時侯都先由這個鏈處理)
INPUT 進來的數據包應用此規則鏈中的策略
OUTPUT 外出的數據包應用此規則鏈中的策略
FORWARD 轉發數據包時應用此規則鏈中的策略
POSTROUTING 對數據包作路由選擇后應用此鏈中的規則。(所有的數據包出來的時侯都先由這個鏈處理)
五、iptables傳輸數據包的過程
wKioL1M2AJKS-sb-AAMUt0c4-nE289.jpg
簡單解釋一下上面這個圖,例如一個報文到了第一個需要做路由決定的點,如果它的目的不是本機,則會被轉發到 FORWARD 鏈,反之,目的地址正是本機所監聽的,那么就會通過 INPUT 鏈把報文送給本機。 還需要指出的是,報文的目的地址是本機,但是它的地址可能會在PREROUTING 鏈里被 NAT 修改。因為這個發生在第一次路由前,報文在修改后才能路由。請注意,所有報文都會經過上面的至少一條鏈。如果你把你一個報文做 DNAT,然后把它發回它原來來的網絡,這樣它就會沿著余下的鏈表,直到它被發送回原來的網絡。
數據包流向情況分析
第一種情況:目標是本地主機
從外界到達防火墻的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),路由決定,例如決定報文是發向本機還是轉發或者其他地方,如果數據包的目標主機是本機(比如說Internet用戶訪問防火墻主機中的web服務器的數據包),那么內核將其傳給INPUT鏈進行處理(所有送往本機的報文都會進行過濾,決定是否允許通過等),通過以后再交給系統上層的應用程序(比如Apache服務器)進行響應。
第二沖情況:轉發報文
來自外界的數據包到達防火墻后,首先被PREROUTING規則鏈處理,之后會進行路由選擇,如果數據包的目標地址是其它外部地址(比如局域網用戶通過網關訪問web站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然后再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理
第三種情況:本地主機發送報文
本地進程或者應用程序(例如服務器或者客戶端程序)向外部地址發送的數據包(比如在防火墻主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之后進行路由選擇,然后傳遞給POSTROUTING規則鏈(是否修改數據包的地址(SNAT)等)進行處理。