Netfilter 學習
發表于:2007-05-26來源:作者:點擊數:
標簽:
一、Netfiter簡介 ---From netfilter.samba.org/what is netfilter 從Linux Kernel 2.4開始,一個新的 網絡 包過濾框架替代了原來的ipchains/ipfwadm系統,那就是netfilter和iptables。作為內核網絡協議堆的一個擴展子集,netfilter可以在內核空間非常高效的
一、Netfiter簡介 ---From netfilter.samba.org/what is netfilter
從Linux Kernel 2.4開始,一個新的
網絡包過濾框架替代了原來的ipchains/ipfwadm系統,那就是netfilter和iptables。作為內核網絡協議堆的一個擴展子集,netfilter可以在內核空間非常高效的進行包過濾,網絡地址轉換(NAT)和包重組。同時,新的 Netfilter/Iptables框架設計采取了更優的軟件設計策略,讓全世界的網絡
程序員可以針對各自的應用的
開發各種不同的應用模塊。
二、Linux IP網絡協議棧分析 ---The journey of a packet through the linux 2.4 network stack
為了更好的了解Netfilter的工作機理,非常有必要先來分析一下Linux2.4系列內核對于網絡數據是如何處理的。以下的分析全部基于以太網和IPv4協議。
2.1 收到數據,中斷發生
通常的,當一塊網卡接收到屬于其自己MAC地址或者廣播的以太網絡數據幀時,就會引發一個中斷,網卡驅動的中斷處理程序獲得機會,通過I/O,DMA復制網絡幀數據到內存中。然后網絡驅動程序將創建一個skb結構,將網絡幀數據填充,設置時間戳,區分類型后,將skb送入對應的包接收隊列(其實就是添加到系統中的一個雙向鏈表中)。在新的2.4內核中,通過軟中斷(softirq)方式實現將數據包從隊列中提取,傳遞到協議處理堆棧。和以前2.2/2.0 內核采用方式相比,軟中斷方式的最大的優點是支持針對多處理器的優化。在這里,網卡驅動的中斷處理程序將調用 include/linux/inter
rupt.h:__cpu_raise_softirq()發起一個軟中斷,然后完成使命,退出。
2.2數據接收軟中斷
內核調用kernel/softirq.c:do_softirq()執行數據包接收軟中斷(NET_RX_SOFTIRQ),將skb從CPU的接收隊列中取出來,交給對應IPv4協議處理程序。協議處理程序將對傳入的數據包進行一些完整性監測,如果監測失敗,則將數據包丟棄。通過完整性監測以后,將進行一些必要的清理操作,去掉可能多余的填充數據,并且重新計算數據包的長度。接下來,數據包將進入Netfilter的第一個HOOK函數 NF_IP_INPUT的控制范圍。從Hook函數出來以后,程序流程將轉移到net/ipv4/ipv_input.c:ip_rcv_finish (),進行數據包的目的地址的判斷,送給路由選擇程序,決定數據包是(1)送往本地的應用進程(ip_local_deliver);(2)轉發到其他主機(ip_forward);(3)多播轉發(ip_mr_input);(4)錯誤,丟棄(ip_error)。
2.3數據轉發
我們來看那些需要轉發的數據包。
對于數據包的轉發工作,將由net/ipv4/ip_forward.c:ip_forward()來完成。首先檢查IP包的TTL,如果小于0,則丟棄之,并且向源主機發送TTL超時錯的ICMP包,否則,將TTL減1。然后比較包大小和目標網絡接口的MTU,如果IP包標記不允許分包,則丟棄該數據包,并向源主機發送ICMP包,告知數據需要分包。接下來是Netfilter要處理的另一個HOOK地點:NF_IP_FORWARD Hook。如果我們在iptables規則中跳轉到A
CCEPT,則這里的HOOK將返回NF_ACCEPT,于是數據包將會順利的通過 ip_forward_finish(),準備發送到另外的網絡。而數據包在最終發送之前,將會落入Netfilter的第三個Hook陷阱,那就是 NF_IP_POST_ROUTING,滿足規則的數據包最終被送入網卡驅動程序發送到另外的網絡。
三、Netfilter框架分析
通過上面的分析,可以確定,Netfilter事實上是內核網絡協議棧中的一些HOOK集合。
如圖所示
user posted image
上圖的數字分別代表了Netfilter安插在內核中的5個HOOK
當數據包通過了完整性檢測以后,就會從上圖左邊流入,首先流過NF_IP_PRE_ROUTING HOOK[1],接下來由網絡協議棧的決定數據包是否送給本地進程,還是需要轉發給其他網卡設備,發往本地進程的數據包將流過 NF_IP_LOCAL_IN HOOK[2],而需要轉發給其他網卡設備的數據包則流過NF_IP_FORWARD HOOK[3]。在數據最終發送到網卡驅動程序之前,還要流過NF_IP_POST_ROUTING HOOK[4]。而對于本地進程發送的數據包,則會首先流過NF_IP_LOCAL_OUT HOOT[5],然后從HOOK[4]流出。
由此可見,5個HOOK的位置,掌管了全部數據包的可能出入口,我們只要在對應的位置對數據包進行操作,就能實現對數據包的各種處理。
當HOOK截獲數據包以后,將根據一些規則判斷數據包的命運。用戶通過注冊一些規則檢測函數來檢測數據包,內核/Netfilter將根據這些函數的返回值來決定數據包的命運。返回值有以下5種:
NF_ACCEPT: 允許數據包通過
NF_DROP: 丟棄該數據包
NF_STOLEN: 告訴內核,該數據包已被處理。
NF_QUEUE: 將數據包排入隊列,通常是將數據包發送給用戶進程空間處理NF_REPEAT: 再一次調用本HOOK
四、用Netfilter/Iptables設計
安全防火墻
在Netfilter的框架結構上,我們可以利用iptables應用程序來和內核通信,制定一系列規則,對數據包進行處理。iptables 內建了3個表,filter表,nat表和mangle表,分別用于實現包過濾,網絡地址轉換和包重構的功能。本文中,主要針對filter表進行操作。最常用的,對于防火墻來說,就是利用在filter表中指定一系列規則(rules)以實現對數據包進行過濾的操作。在filter表中只允許對數據包進行接受,丟棄的操作,而無法對數據包進行更改。
在iptables中規定,鏈(chains)是規則(rules)的集合, filter表包含3個chain,分別為INPUT,FORWARD,OUTPUT。通過前面的分析,可以確定該3條規則鏈將分別在:(1)數據包在送入本地進程之前、(2)數據報在內核通過路由算法即將被轉發之前,和(3)本地進程向網絡發送數據包前三個關鍵HOOK位置發揮作用。
為了防止外部入侵,更多時候,我們只要在INPUT鏈中進行過濾即可?,F給出一個簡單的例子:
首先,設定缺省的策略Policy為DROP,這樣,當內核遍歷INPUT CHAINS的時候,如果沒有滿足任何規則,則將數據包按照缺省策略操作。
#iptables -P INPUT DROP
接下來,針對已經建立連接的數據包,我們允許其暢通無阻。
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
然后逐步開放對應的服務端口,例如,需要提供HTTP服務,開放80端口,命令如下:
iptables –A INPUT –p tcp –dport 80 –j ACCEPT
也許,有時候,我們并不希望簡單的丟棄我們不需要的數據包,因為,當遠方主機發送SYN數據包過來的時候,我們如果只是簡單的丟棄的話,對方主機還是會持續發送SYN數據包過來,直到多次超時失敗才放棄。所以我們可以用REJECT target來拒絕數據包的同時,發送給對方主機一個RST包,終止對方連接,用下面的命令取代上面的命令即可。
iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
五、實際應用案例
前些日子,Nimda病毒盛行,本人APACHE HTTP主機的LOG文件每天莫名增長近1M,上面保存了大量的%c0%c1/cmd.exe?/c+dir等試圖利用IIS的Unicode漏洞訪問記錄。事實上這些記錄未必是有意圖的攻擊者的痕跡,而是大量泛濫的Nimda掃描網段,試圖感染IIS主機的杰作。而且,泛濫的信息,很可能掩蓋某些真正的攻擊信息,所以,有必要針對這類情況配置出對應的防火墻策略。Iptables 2.5+以上的版本提供了一個新的string模塊專門實現針對字符串內容的過濾。
首先準備好2.4以上的內核代碼,目前的穩定版本是2.4.18,可以從
http://kernel.org處獲得。然后到 netfilter.samba.org處獲得最新的iptables代碼,目前版本是1.2.6b,編譯iptables用戶進程應用程序以后,執行 make patch-o-matic,選擇給內核補上string match模塊。
運行內核配置程序,就會發現,在Network OptionsIP Netfilter Config中多出了String match選項,選擇編譯成模塊(M)。重新編譯內核,成功之后,iptable就具備字符串過濾的功能了。
我們只需對已連接的HTTP數據包進行處理。而cmd.exe之類的URL請求是在HTTP會話建立以后,通過POST/GET命令發送的。所以,只需針對連接到80端口的數據包進行處理即可。如果內容中包含”exe?/c+”等敏感內容,則立即丟棄。
接下來是指定防火墻規則,我們自定義一個規則鏈。如下:
#
anti-worm chain
iptables -N anti-worm
iptables -A anti-worm -p tcp --dport 80 -m string --string "/default.ida" -j DROP
iptables -A anti-worm -p tcp --dport 80 -m string --string ".exe?/c+" -j DROP
iptables -A anti-worm -p tcp --dport 80 -j ACCEPT
然后,在整體的規則中,只需加入下面的命令即可:
iptables -A INPUT -p tcp --destination-port 80 -j anti-worm
我們可以在IE中
測試被保護的HTTP Server,當輸入正常的URL請求的時候,一切正常。當你在URL后邊添加諸如”cmd.exe?/c+dir”的時候,IE將無法獲得
服務器返回信息,因為該數據包已經被DROP了。
六 總結
Netfilter/Iptables的包過濾架構是Linux內核開發人員通過對ipfw/ipfwadm/ipchains等早期的包過濾程序的開發經驗和全世界用戶反饋的分析,重新設計,改造而形成的相對成熟的Linux內核包過濾框架。同時,由于公
開源代碼,全世界的網絡開發人員針對各自的需要和網絡出現的新情況,在義務的開發著對應的模塊,這極大的豐富了iptables功能。采用netfilter/iptables設計的網絡防火墻,完全可以媲美專業的網絡防火墻,更重要的是,他的成本幾乎為零。
參考資料:
[1]《what is netfilter》
http://netfilger.samba.org[2] Harald Welte《skb - Linux network buffers》
[3] Rusty Russell and Harald Welte 《Linux netfilter Hacking HOWTO》
[4] Rusty Russel Linux 2.4 Packet Filtering HOWTO
[5]《TCPIP協議詳解卷1:協議 影印版》 機械工業出版社
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|