netfilter

netfilter

Netfilter是Linux 2.4.x引入的一個子系統,它作為一個通用的、抽象的框架,提供一整套的hook函式的管理機制,使得諸如數據包過濾、網路地址轉換(NAT)和基於協定類型的連線跟蹤成為了可能。

netfilter的架構就是在整個網路流程的若干位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些處理函式進行處理。

基本介紹

  • 外文名:Netfilter
  • 引入版本:Linux 2.4.x
架構,例子代碼,後記,技術分析,框架,關鍵技術,

架構

netfilter
IP層的五個HOOK點的位置如下圖所示
[1]:NF_IP_PRE_ROUTING:剛剛進入網路層的數據包通過此點(剛剛進行完版本號,校驗
和等檢測), 目的地址轉換在此點進行;
[2]:NF_IP_LOCAL_IN:經路由查找後,送往本機的通過此檢查點,INPUT包過濾在此點進行;
[3]:NF_IP_FORWARD:要轉發的包通過此檢測點,FORWARD包過濾在此點進行;
[4]:NF_IP_POST_ROUTING:所有馬上便要通過網路設備出去的包通過此檢測點,內置的源地址轉換功能(包括地址偽裝)在此點進行;
[5]:NF_IP_LOCAL_OUT:本機進程發出的包通過此檢測點,OUTPUT包過濾在此點進行。
在IP層代碼中,有一些帶有NF_HOOK宏的語句,如IP的轉發函式中有:
如果在編譯核心時沒有配置netfilter時,就相當於調用最後一個參數,此例中即執行
ip_forward_finish函式;否則進入HOOK點,執行通過nf_register_hook()登記的功能
(這句話表達的可能比較含糊,實際是進入nf_hook_slow()函式,再由它執行登記的
函式)。
NF_HOOK宏的參數分別為:
⒈ pf:協定族名,netfilter架構同樣可以用於IP層之外,因此這個變數還可以有諸如
PF_INET6,PF_DECnet等名字。
⒉hook:HOOK點的名字,對於IP層,就是取上面的五個值;
⒊skb:不用多解釋了吧;
⒋indev:進來的設備,以struct net_device結構表示;
⒌outdev:出去的設備,以struct net_device結構表示;
(後面可以看到,以上五個參數將傳到用nf_register_hook登記的處理函式中。)
⒍okfn:是個函式指針,當所有的該HOOK點的所有登記函式調用完後,轉而走此流程。
這些點是已經在核心中定義好的,除非你是這部分核心代碼的維護者,否則無權增加
或修改,而在此檢測點進行的處理,則可由用戶指定。像packet filter,NAT,connection
track這些功能,也是以這種方式提供的。正如netfilter的當初的設計目標--提供一
個完善靈活的框架,為擴展功能提供方便。
如果我們想加入自己的代碼,便要用nf_register_hook函式,其函式原型為:
int nf_register_hook(struct nf_hook_ops *reg)
我們考察一下struct nf_hook_ops結構:
我們的工作便是生成一個struct nf_hook_ops結構的實例,並用nf_register_hook將
其HOOK上。其中list項我們總要初始化為{NULL,NULL};由於一般在IP層工作,pf總是
PF_INET;hooknum就是我們選擇的HOOK點;一個HOOK點可能掛多個處理函式,誰先誰後
,便要看優先權,即priority的指定了。netfilter_ipv4.h中用一個枚舉類型指定了內
置的處理函式的優先權:
hook是提供的處理函式,也就是我們的主要工作,其原型為:
它的五個參數將由NFHOOK宏傳進去。
了解了這些,基本上便可以可以寫一個lkm出來了。

例子代碼

這段代碼是一個例子,其功能實現了一個IDS,檢測幾個簡單攻擊(land,winnuke)和特殊
掃描(nmap),當然,不會有人真把它當嚴肅的IDS使用吧:-)。可以利用類似結構乾點別
的。
四.附錄:
與2.2在套用方面的區別簡介
本來還想詳細介紹一下iptables的用法,但如果說的太詳細的話,還不如索性將HOWTO
翻譯一下,於是乾脆了卻了這個念頭,只順便簡介一下與以前版本的變化(而且是我認
為最重要的)。如果ipchains本來便沒有在你的腦子中紮根,其實便沒有必要看這部分。
netfilter,又可稱為iptables.開發初期準備將packet filter和NAT的配置工具完全
分開,一個稱為iptables,另一個稱為ipnatctl,而將整個項目成為netfilter.但後
來可能是還是習慣2.2核心中用ipchians一個工具乾兩件事的用法,又
改為全部用iptables配置了。
理論上還可以用2.2系列的ipchains和2.0系列的ipfwadm作配置工具,但只是做兼容
或過渡的考慮了。通過源碼看到他們也是通過現有的結構HOOK上去的(主要是net/ipv
4/netfilter目錄下的ip_fw_compat.c,ip_fw_compat_masq.c,ip_fw_compat_redir.c,
ipchains_core.c,ipfwadm_core.c這幾個檔案)。
一個重要的變化是原有的INPUT,OUTPUT(原來是小寫的input,ouput)鏈(現在應稱
為表?)的位置變了,原來的input,output的位置相當於現在的NF_IP_PRE_ROUTING,
NF_IP_POST_ROUTING。原有的結構確實不太合理,轉發的包要經過三條鏈,現在INPUT
專指去往本機的,OUPUT專指從本機發出的,而FOWARD仍舊是轉發的包。
舉兩個簡單的例子:
⒈作地址偽裝(場景:對外通過撥號連線internet)注意原來的MASQ變成好長的
MASQUERATE,而偽裝相當於SNAT,因此位置是在POSTROUTING:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERATE
⒉還有一個限制包速率的功能比較好玩,例如如下規則:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
簡單的說就是在轉發時(-A FORWARD:因為是防火牆嘛),如果是tcp協定,且有syn
標記(-p tcp --syn),可以限制為每秒一個(-m limit --limit 1/s),行動項是
ACCEPT。最後連起來意義就是每秒只允許轉發一個tcp連線請求。

後記

netfilter還提供了許多新功能,如可以將包轉發到套用層,由應用程式進行處理等
,可目前我還沒有分析多少,慢慢抽出點時間看吧。唉,儘管以前看過ipchains的代碼
,但netfilter實在變動太大了,一切都要從頭看起

技術分析

netfilter是由Rusty Russell提出的Linux 2.4核心防火牆框架,該框架既簡潔又靈活,可實現安全策略套用中的許多功能,如數據包過濾、數據包處理、地址偽裝、透明代理、動態網路地址轉換(Network Address Translation,NAT),以及基於用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基於狀態的過濾、包速率限制等。

框架

netfilter提供了一個抽象、通用化的框架[1],作為中間件,為每種網路協定(IPv4、IPv6等)定義一套鉤子函式。Ipv4定義了5個鉤子函式,這些鉤子函式在數據報流過協定棧的5個關鍵點被調用,也就是說,IPv4協定棧上定義了5個“允許垂釣點”。在每一個“垂釣點”,都可以讓netfilter放置一個“魚鉤”,把經過的網路包(Packet)釣上來,與相應的規則鏈進行比較,並根據審查的結果,決定包的下一步命運,即是被原封不動地放回IPv4協定棧,繼續向上層遞交;還是經過一些修改,再放回網路;或者乾脆丟棄掉。
Ipv4中的一個數據包通過netfilter系統的過程如圖1所示。
圖1 Netfilter的功能框架

關鍵技術

netfilter主要採用連線跟蹤(Connection Tracking)、包過濾(Packet Filtering)、地址轉換、包處理(Packet Mangling)4種關鍵技術。
⒈2.1 連線跟蹤
連線跟蹤是包過濾、地址轉換的基礎,它作為一個獨立的模組運行。採用連線跟蹤技術在協定棧低層截取數據包,將當前數據包及其狀態信息與歷史數據包及其狀態信息進行比較,從而得到當前數據包的控制信息,根據這些信息決定對網路數據包的操作,達到保護網路的目的。
當下層網路接收到初始化連線同步(Synchronize,SYN)包,將被netfilter規則庫檢查。該數據包將在規則鏈中依次序進行比較。如果該包應被丟棄,傳送一個復位(Reset,RST)包到遠端主機,否則連線接收。這次連線的信息將被保存在連線跟蹤信息表中,並表明該數據包所應有的狀態。這個連線跟蹤信息表位於核心模式下,其後的網路包就將與此連線跟蹤信息表中的內容進行比較,根據信息表中的信息來決定該數據包的操作。因為數據包首先是與連線跟蹤信息表進行比較,只有SYN包才與規則庫進行比較,數據包與連線跟蹤信息表的比較都是在核心模式下進行的,所以速度很快。
⒈2.2 包過濾
包過濾檢查通過的每個數據包的頭部,然後決定如何處置它們,可以選擇丟棄,讓包通過,或者更複雜的操作。
⒈2.3 地址轉換
網路地址轉換 分為源NAT(Source NAT,SNAT)和目的NAT(Destination NAT,DNAT)2種不同的類型。SNAT是指修改數據包的源地址(改變連線的源IP)。SNAT會在數據包送出之前的最後一刻做好轉換工作。地址偽裝(Masquerading)是SNAT的一種特殊形式。DNAT 是指修改數據包的目標地址(改變連線的目的IP)。DNAT 總是在數據包進入以後立即完成轉換。連線埠轉發負載均衡透明代理都屬於DNAT。
⒈2.4 包處理
利用包處理可以設定或改變數據包的服務類型(Type of Service,TOS)欄位;改變包的生存期(Time to Live,TTL)欄位;在包中設定標誌值,利用該標誌值可以進行頻寬限制和分類查詢。

相關詞條

熱門詞條

聯絡我們