• 沒有找到結果。

4. 系統實現

4.1 N ETFILTER

Netfilter 建立在 Linux Kernel 2.4 及2.6 中,是 Linux 核心中一個通 用的框架架構,可以讓其它東西(例如 iptables 模組) 插入(plug into),其 目的是讓 Kernel 內部提供支援封包過濾及變更的機制,並且可以讓使用 者於 User Space 執行各種所需的控制指令。Netfilter 被設計成模組化和 可擴充性,也因為這樣,所以它可以由使用者自行設計所需的程式及所 要的功能,並且以模組的方式加到 Netfilter 架構中,使 Netfilter 的使用 上更具有彈性,這種程式模組 Netfilter中稱為 Extension。利用Netfilter 我 們 可 以 進 行 封 包 過 濾 (packet filtering) 、 位 址 及 埠 號 的 轉 換 (network address and port translation)以及封包的修改 (packet mangling)等動作[26]。

Netfilter 框架在 Linux Kernel 中是一個 hook 的集合,它允許 Kernel Module 在 網 路 堆 疊 中 去 登 錄 callback 函 數 , 而 一 個 已 登 錄 過 的 callback 函數在每個封包流經在網路堆疊的 hook 點時將被進行呼叫。

在 Linux 中定義了五個關於 ipv4 的 hook 點,如表 4-1 所示。

表 4-1 IPv4 所定義之 Hook 點及其支援之 IPTable 模組

(2) NF_IP_LOCAL_IN 通過路由表後,

目的地為本機

(4) NF_IP_LOCAL_OUT

由本機主動建立

(5) NF_IP_POST_ROUTING 通過路由表後,要 發送出去前

Mangle NAT (Src) Conntrack

這些 hook 點的定義可以在 linux/netfilter_ipv4.h 中找到。我們將以 如表 4-2 所示之結構定義每個 hook 點。

表 4-2 Hook 點結構 struct nf_hook_ops

{

封包流經這些 hook 點的過程如圖 4-1 所示。在這些 Netfilter hook 點中,封包將被進行分析以決定是否允許通過或進行丟棄。

圖 4-1 Netfilter hook 點所在位置

在 nf_hook_ops 結構中,hook 代表我們所要執行之 hook 函式名 稱,由於我們在 IP 層工作,所以 pf 需設為 PF_INET。hooknum 則代表

hook 點所在之位置。由於同一個位置可以掛載許多 hook 點,所以我們 必須指定 priority 來排定每一個點的優先順序。Netfilter_ipv4.h 中也定 義了一些優先權的等級。

表 4-3 處理函式優先權等級

enum nf_ip_hook_priorities { NF_IP_PRI_FIRST = INT_MIN,

Netfilter-Iptable 由兩個部份所組成,一部份為 Netfilter 的 hook 點,另一部份則是這些 hook 函數如何動作的一套規則,這些規則儲存 在被稱為 iptables 的數據結構中。利用上述之 Netfilter hook 點,當封包 穿過 kernel 裡的網路堆疊時,我們便可在適當的時機調用其所支援的表 格(table) 對封包進行過濾攔截或修改。而 Kernel Module 更可以登錄新 的模組或者要求封包經過某些模組的檢驗。Hook 函數通過訪問 iptables 來判斷應該回傳什麼值給 Netfilter 框架,決定封包之去留。在 Netfilter 中,已內建三種 iptables,分別是 Filter、Nat、Mangle。其功能如表 4-4 所 示。

由 於 iptables 是 核 心 Netfilter 的 使 用 界 面 , 所 以 我 們 也 把 Netfilter-IPTables 簡稱 iptables。iptables 是處於 user space 下用來控制核 心的過濾規則工具,雖然利用 iptable 可以快速的插入或移除核心封包過 濾表格(packet filtering table) 中的一些規則(rules)。不過它卻是沒有彈性 的。在 iptable 內定過濾的格式中並沒有我們所想要的功能。所以為了達

以 Connection Tracking 模組為基礎,改變封包之來源或目 的位址,並將結果交由 Connection Tracking 模組應用到該 連接之後的所有封包

Mangle 對封包內容進行修改,包括 MARK、TOS、TTL