Netfilter是如何工作的(二) 表(table)與規則(rule)

在(一)中說到,報文在內核協議棧中會途經5HOOK點,在每個HOOK點上會依次執行鏈表上的鉤子函數,那麼這些鉤子函數是如何與用戶使用iptables下發的各個rule聯繫起來的呢?這些rule又是如何存儲的呢? 本文詳細描述這個問題。

table

內核使用struct xt_table這個結構來表示一個表(table)。結構中記錄了這個表在哪些HOOK點有效,它的private指針保存了這個表包含的所有規則。

xt_table

每個新的net namespace創建時,Netfitler會創建所有屬於當前net namespace的表,並將其記錄到自己的net namespace中。

table-register

從圖中可以看出,創建一個包含默認ruletable分兩步

  1. 根據已有的模板,生成默認rule
  2. 註冊tableNetfilter框架中

生成默認rule

如果你使用過iptables,可能會知道每張table的每條chain都有一個默認POLICY,它表示chain中的所有的rule都不匹配,則執行默認的行爲。這個默認行爲可以通過iptables配置,在系統啓動時默認行爲都被設置爲NF_ACCEPT.而這裏的默認rule就是這個意思,Netfilter會爲每個chain創建一條默認的rule,並將它們加入到table

ipt_replace

上圖創建默認rule的時候使用了一個struct ipt_replace的結構,這個結構的來歷和iptables的配置方法是緊密相連的:iptables採用的是讀-修改-寫的方式進行配置的!

舉個例子,當你使用iptablesNetfilterfilter表添加一條新的rule時,iptables會將filter整個表讀取到用戶空間,在用戶空間修改完成後,再將其重新設置到Netfilter。所以,這是一個替換(Replace)的過程。

setsockopt

因此,ipt_replace一般就是指用戶使用iptables下發的表。典型的結構如下:

ipt-replace

hook_entryunderflow分別表示各個HOOK上的第一條rule和最後一條rule的偏移(具體的規則在最後一個ipt_entry的柔性數組裏!)

但在這裏,由於還處於初始化階段,所以這裏的repl是內核自己由packet_filter模板生成的,它會爲filter所在的LOCAL_INFORWARDLOCAL_OUT這幾個HOOK點各創建一條默認rule.

ipt_entry

內核使用struct ipt_entry表示一條用戶使用iptables配置的rule. 這個結構後面會緊跟若干個ipt_entry_match結構和1ipt_standard_target結構。它與一條用戶配置的iptables的關係如下:

onerule

其中

  • ipt_entry:表示標準匹配結構。包括報文的源IP、目的IP、入接口、出接口等條件
  • ipt_entry_match:表示擴展匹配。一條完整的rule包含零個到多個該結構
  • ipt_standard_target:表示匹配後的動作

如果對iptables的匹配規則不太熟悉,建議點此擴展匹配瞭解一下

註冊 table 到 Netfilter 框架

在完成了默認規則的創建之後(保存在ipt_replace),接下來就是應該註冊新的表了。

ipt_register_table

xt_table中保存規則的private指針類型是struct xt_table_info,因此這裏第一部就是把repl轉換爲newinfo。接下來就是調用xt_register_table創建新的表並註冊到框架了

finally

註冊完成之後,Netfilter可以通過net->xt.tables[af]鏈表遍歷到所有註冊的表,也可以通過net->ipv4.快速訪問到具體的表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章