Linux 2.4中netfilter架構實現

來源:互聯網
上載者:User


Netfilter是linux2.4核心實現資料包過濾/資料包處理/NAT等的功能架構。該文討論了linux 2.4核心的netfilter功能架構,還對基於netfilter架構上的包過濾,NAT和資料包處理(packet mangling)進行了討論。閱讀本文需要瞭解2.2核心中ipchains的原理和使用方法作為預備知識,若你沒有這方面的知識,請閱讀IPCHAINS-HOWTO。

第一部分:Netfilter基礎和概念

一、什麼是Netfilter

Netfilter比以前任何一版Linux核心的防火牆子系統都要完善強大。Netfilter提供了一個抽象、通用化的架構,該架構定義的一個子功能的實現就是包過濾子系統。因此不要在2.4中期望討論諸如"如何在2.4中架設一個防火牆或者偽裝網關"這樣的話題,這些只是Netfilter功能的一部分。Netfilter架構套件含以下三部分:

1 為每種網路通訊協定(IPv4、IPv6等)定義一套鉤子函數(IPv4定義了5個鉤子函數),這些鉤子函數在資料報流過協議棧的幾個關鍵點被調用。在這幾個點中,協議棧將把資料報及鉤子函數標號作為參數調用netfilter架構。

2 核心的任何模組可以對每種協議的一個或多個鉤子進行註冊,實現掛接,這樣當某個資料包被傳遞給netfilter架構時,核心能檢測是否有任何模組對該協議和鉤子函數進行了註冊。若註冊了,則調用該模組的註冊時使用的回呼函數,這樣這些模組就有機會檢查(可能還會修改)該資料包、丟棄該資料包及指示netfilter將該資料包傳入使用者空間的隊列。

3 那些排隊的資料包是被傳遞給使用者空間的非同步地進行處理。一個使用者進程能檢查資料包,修改資料包,甚至可以重新將該資料包通過離開核心的同一個鉤子函數中注入到核心中。

所有的包過濾/NAT等等都基於該架構。核心網路代碼中不再有到處都是的、混亂的修改資料包的代碼了。當前netfilter架構在IPv4、IPv6及Decnet網路棧中被實現。

二、為什麼需要Netfilter?

其實這個問題也可以變為ipchains有什麼缺點導致被拋棄?下面只是其中的幾個原因:

因為基於2.2核心的ipchains沒有提供傳遞資料包到使用者空間的架構,所以任何需要對資料包進行處理的代碼都必須運行在核心空間,而核心編程卻非常複雜,而且只能用C語言實現,並且容易出現錯誤並對核心穩定性造成威脅。

透明代理實現非常複雜,必須查看每個資料包來判斷是否有專門處理該地址的socket。網路棧代碼中在11個檔案中共出現了34個"#ifdef"條件編譯。

建立一個不依賴於介面地址的資料報過濾規則是不可能實現的。我們必須利用本地介面地址來判斷資料報是本地發出、還是發給本地的或是轉寄的。轉寄鏈只有輸出介面的資訊,因此管理員必需考慮資料報的源。

偽裝和資料包過濾都在同一個模組內實現,導致防火牆代碼過於複雜。

IPchains代碼即不模組化又不易於擴充(例如對mac地址的過濾)

三、Netfilter的作者

Netfilter架構的概念的提出及主要實現是由Rusty Russell完成的,他是ipchains的合作完成者及當前linux核心IP防火牆的維護者。還有Marc Boucher、James Morris、Harald Welte等都參與了Netfilter項目。

四、Netfilter在IPv4中的結構

一個資料包按照如所示的過程通過Netfilter系統:

--->[1]--->[ROUTE]--->[3]--->[4]--->
| ^
local| |
| [ROUTE]
v |
[2] [5]
| ^

v |

可以看到IPv4一共有5個鉤子函數,分別為:

1 NF_IP_PRE_ROUTING
2 NF_IP_LOCAL_IN
3 NF_IP_FORWARD
4 NF_IP_POST_ROUTING
5 NF_IP_LOCAL_OUT

資料報從左邊進入系統,進行IP校正以後,資料報經過第一個鉤子函數NF_IP_PRE_ROUTING[1]進行處理;然後就進入路由代碼,其決定該資料包是需要轉寄還是發給原生;若該資料包是發被原生,則該資料經過鉤子函數NF_IP_LOCAL_IN[2]處理以後然後傳遞給上層協議;若該資料包應該被轉寄則它被NF_IP_FORWARD[3]處理;經過轉寄的資料報經過最後一個鉤子函數NF_IP_POST_ROUTING[4]處理以後,再傳輸到網路上。

本地產生的資料經過鉤子函數NF_IP_LOCAL_OUT [5]處理可以後,進行路由選擇處理,然後經過NF_IP_POST_ROUTING[4]處理以後發送到網路上。

五、Netfilter基礎

從上面關於IPv4的netfilter的例子討論,可以看到鉤子函數是如何被啟用的。

核心模組可以對一個或多個這樣的鉤子函數進行註冊掛接,並且在資料報經過這些鉤子函數時被調用,從而模組可以修改這些資料報,並向netfilter返回如下值:

NF_ACCEPT 繼續正常傳輸資料報
NF_DROP 丟棄該資料報,不再傳輸
NF_STOLEN 模組接管該資料報,不要繼續傳輸該資料報
NF_QUEUE 對該資料報進行排隊(通常用於將資料報給使用者空間的進程進行處理)
NF_REPEAT 再次調用該鉤子函數

六、使用iptables進行資料報選擇

一個基於Netfilter架構的、稱為iptables的資料報選擇系統在Linux2.4核心中被應用,其實它就是ipchains的後繼工具,但卻有更強的可擴充性。

核心模組可以註冊一個新的規則表(table),並要求資料報流經指定的規則表。這種資料報選擇用於實現資料報過濾(filter表),網路位址轉譯(Nat表)及資料報處理(mangle表)。

Linux2.4核心提供的這三種資料報處理功能都基於netfilter的鉤子函數和IP表。它們是獨立的模組,相互之間是獨立的。它們都完美的整合到由Netfileter提供的架構中。

包過濾
filter表格不會對資料報進行修改,而只對資料報進行過濾。iptables優於ipchains的一個方面就是它更為小巧和快速。它是通過鉤子函數NF_IP_LOCAL_IN, NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter架構的。因此對於任何一個資料報只有一個地方對其進行過濾。這相對ipchains來說是一個巨大的改進,因為在ipchains中一個被轉寄的資料報會遍曆三條鏈。

NAT
NAT表格監聽三個Netfilter鉤子函數:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。 NF_IP_PRE_ROUTING實現對需要轉寄的資料報的源地址進行地址轉換而NF_IP_POST_ROUTING則對需要轉寄的資料包的目的地址進行地址轉換。對於本機資料報的目的地址的轉換則由NF_IP_LOCAL_OUT來實現。

NAT表格不同於filter表格,因為只有新串連的第一個資料報將遍曆表格,而隨後的資料報將根據第一個資料報的結果進行同樣的轉換處理。

NAT表格被用在源NAT,目的NAT,偽裝(其是源NAT的一個特例)及透明代理(其是目的NAT的一個特例)。

資料報處理(Packet mangling)
mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT鉤子中進行註冊。使用mangle表,可以實現對資料報的修改或給資料報附上一些帶外資料。當前mangle表支援修改TOS位及設定skb的nfmard欄位。

七、串連跟蹤

串連跟蹤是NAT的基礎,但是已經作為一個單獨的模組被實現。該功能用於對包過濾功能的一個擴充,使用串連跟蹤來實現“基於狀態”的防火牆。

第二部分 使用iptables及netfilter進行資料包過濾

一、概述

下面的內容要求具有對TCP/IP,路由,防火牆及包過濾的基本概念的瞭解。

在第一部分已經解釋過,filter表和三個鉤子進行了掛接,因此提供了三條鏈進行資料過濾。所有來自於網路,並且發給原生資料報會遍曆INPUT規則鏈。所有被轉寄的資料報將僅僅遍曆FORWARD規則鏈。最後,本地發出的資料報將遍曆OUTPUT鏈。

二、向規則鏈中插入規則

Linux2.4提供了一個簡潔強大的工具"iptables"來插入/刪除/修改規則鏈中的規則。這裡並不對iptalbes進行詳細的介紹,而只是討論它的主要的一些特性:

該命令實現對所有的ip表進行處理,當前包括filter,nat及mangle三個表格,及以後擴充的表模組。
該命令支援外掛程式來支援新的匹配參數和目標動作。因此對netfilter的任何擴充都非常的簡單。僅僅需要編寫一個完成實際目標動作處理的模組和iptalbes外掛程式(動態串連庫)來添加所需要的一切。
它有兩個實現:iptables(IPV4)及ip6tables。兩者都基於相同的庫和基本上相同的代碼。
基本的iptables命令
一個iptables命令基本上包含如下五部分:

希望工作在哪個表上
希望使用該表的哪個鏈
進行的操作(插入,添加,刪除,修改)
對特定規則的目標動作
匹配資料報條件
基本的文法為:

iptables -t table -Operation chain -j target match(es)
例如希望添加一個規則,允許所有從任何地方到本地smtp連接埠的串連:

iptables -t filter -A INPUT -j ACCEPT -p tcp --dport smtp

當然,還有其他的對規則進行操作的命令如:清空鏈表,設定鏈預設策略,添加一個使用者自訂的鏈....

基本操作:

-A 在鏈尾添加一條規則
-I 插入規則
-D 刪除規則
-R 替代一條規則
-L 列出規則

基本目標動作,適用於所有的鏈

ACCEPT 接收該資料報
DROP 丟棄該資料報
QUEUE 排隊該資料報到使用者空間
RETURN 返回到前面調用的鏈
foobar 使用者自訂鏈
基本匹配條件,適用於所有的鏈

-p 指定協議(tcp/icmp/udp/...)
-s 源地址(ip address/masklen)
-d 目的地址(ip address/masklen)
-i 資料報輸入介面
-o 資料報輸出介面
出了基本的操作,匹配和目標還具有各種擴充。

三、iptables的資料報過濾匹配條件擴充

有各種各樣的資料包選擇匹配條件擴充用於資料包過濾。這裡僅僅簡單的說明來讓你感受擴充匹配的強大之處。

這些匹配擴充給了我們強大的資料報匹配手段:

TCP匹配擴充能匹配源連接埠,目的連接埠,及tcp標記的任意組合,tcp選項等。
UPD匹配擴充能匹配源連接埠和目的連接埠
ICMP匹配擴充能匹配ICMP類型
MAC匹配擴充能匹配接收到的資料的mac地址
MARK匹配擴充能匹配nfmark
OWNE匹配擴充(僅僅應用於本地產生的資料報)來匹配使用者ID,組ID,進程ID及會話ID
LIMIT擴充匹配用來匹配特定時間段內的資料報限制。這個擴充匹配對於限制dos攻擊資料流非常有用。
STATE匹配擴充用來匹配特定狀態下的資料報(由串連跟蹤子系統來決定狀態),可能的狀態包括:
INVALID (不匹配於任何串連)
ESTABLISHED (屬於某個已經建立的連結的資料報)
NEW (建立串連的資料報)
RELATED (和某個已經建立的串連有一定相關的資料報,例如一個ICMP錯誤訊息或ftp資料連線)
TOS匹配擴充用來匹配IP頭的TOS欄位的值。

四、iptables的資料報過濾目標動作擴充

LOG 將匹配的資料報傳遞給syslog()進行記錄
ULOG 將匹配的資料適用使用者空間的log進程進行記錄
REJECT 不僅僅丟棄資料報,同時返回給寄件者一個可配置的錯誤資訊
MIRROR 互換源和目的地址以後重新傳輸該資料報

第三部分 利用iptables和netfilter進行NAT

linux以前的核心僅僅支援有限的NAT功能,被稱為偽裝。Netfilter則支援任何一種NAT。一般來講NAT可以分為源NAT和目的NAT。

源NAT在資料報經過NF_IP_POST_ROUTING時修改資料報的源地址。偽裝是一個特殊的SNAT。

目的NAT在資料報經過NF_IP_LOCAL_OUT或NF_IP_PRE_ROUTING 時修改資料報目的地址。連接埠轉寄和透明代理都是DNAT。

一、iptables的NAT目標動作擴充

SNAT
變換資料包的源地址。

例:

iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.4

MASQUERADE
用於具有動態IP地址的撥號連線的SNAT,類似於SNAT,但是如果串連斷開,所有的串連跟蹤資訊將被丟棄,而去使用重新串連以後的IP地址進行IP偽裝。

例:

iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0
DNAT
轉換資料報的目的地址,這是在PREROUTING鉤子鏈中處理的,也就是在資料報剛剛進入時。因此Linux隨後的處理得到的都是新的目的地址。

例:

iptables -t nat -A PREROUTING -j DNAT --to-destination 1.2.3.4:8080 -p tcp --dport 80 -i eth1

REDIRECT
重新導向資料報為目的為本地,和DNAT將目的地址修改為接到資料報的介面地址情況完全一樣。

例:

iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth1 -p tcp --dport 80

第四部分 利用iptables和netfilter進行資料報處理(Packet mangling)

mangle表提供了修改資料報各個欄位的值的方法。

一、針對資料包處理的目標擴充

MARK
設定nfmark欄位的值。我們可以修改nfmark欄位的值。nfmark僅僅是一個使用者定義的資料報的標記(可以是無符號長整數範圍內的任何值)。該標記值用於基於策略的路由,通知ipqmpd (運行在使用者空間的隊列分撿器守護進程)將該資料報排隊給哪個哪個進程等資訊。

例: iptables -t mangle -A PREROUTING -j MARK --set-mark 0x0a -p tcp

TOS
設定資料報的IP頭的TOS欄位值。若希望適用基於TOS的資料報調度及路由,這個功能是非常有用處的。

例: iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 -p tcp --dport ssh

第五部分 排隊資料報到使用者空間

前面已經提到,任何時候在任何nefilter規則鏈中,資料報都可以被排隊轉寄到使用者空間去。實際的排隊是由核心模組來完成的(ip_queue.o)。

資料報(包括資料報的原[meta]資料如nfmark和mac地址)通過netlink socket被發送給使用者空間進程.該進程能對資料報進行任何處理。處理結束以後,使用者進程可以將該資料報重新注入核心或者設定一個對資料報的目標動作(如丟棄等)。

這是netfilter的一個關鍵技術,使使用者進程可以進行複雜的資料報操作。從而減輕了核心空間的複雜度。使用者空間的資料報操作進程能很容易的適用ntfilter提供的稱為libipq的庫來進行開發。

參考文獻:

LaForges talk about Netfilter
http://www.lisoleg.org/forum-source/messages/1410.html

The netfilter framework in Linux 2.4
http://www.gnumonks.org/papers/netfilter-lk2000/presentation.html

Linux 2.4 Packet Filtering HOWTO
http://netfilter.kernelnotes.org/unreliable-guides/packet-filtering-HOWTO/index.html

Linux 2.4 NAT HOWTO
http://netfilter.kernelnotes.org/unreliable-guides/NAT-HOWTO/index.html

netfilter hacking HOWTO
http://netfilter.kernelnotes.org/unreliable-guides/netfilter-hacking-HOWTO/index.html

(出處:viphot)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.