Netfilter是如何工作的(三) 規則的匹配(match)

每一條iptables配置的rule都包含了匹配條件(match)部分和動作(target)。當報文途徑HOOK點時,Netfilter會逐個遍歷掛在該鉤子點上的表的rule,若報文滿足rule的匹配條件,內核就會執行動作(target)。

onerule

擴展match的表示

match又可以分爲標準match擴展match兩部分,其中前者有且只有一個,而後者有零到多個。在Netfilter中,標準match條件用ipt_entry表示(這個在上一篇文章中已經說過了),其中包括源地址和目的地址等基本信息,而擴展matchipt_entry_match表示:

xt_entry_match

這個結構上面是一個union,下面是一個柔性數組。union的元素有三個,拋開最後一個用於對齊的match_size,前兩個元素表示它在用戶空間和內核空間的有不同的解釋(這個結構在linux內核代碼和iptables應用程序代碼中定義一樣)

什麼意思呢? 還是以本文開頭的那條rule爲例,這條rule使用了tcp擴展模塊,匹配條件爲--dport 80,所以用戶態的iptables程序會這樣理解這個結構:

user_xt_entry_match

當內核收到這條rule時,會根據名字"tcp"去從Netfilter框架中"搜索"已註冊的擴展match,若找到,就設置其match指針.這樣,從內核Netfilter的角度來看,擴展匹配條件就變成了這樣:

kernel_xt_entry_match

註冊擴展 match

我們需要將擴展match預先註冊到Netfilter框架中,才能在之後的配置中使用這個匹配條件。就拿本文最初的那條規則來說,需要一個隱含的前提就是tcp這個xt_match事先被註冊到Netfilter框架了。這部分工作是在xt_tcpudp.c定義的內核模塊中完成的。

除了tcp, 通過xt_register_match接口,其他各個模塊都可以註冊自己的擴展匹配條件。

xt

每個xt_match有三個函數指針,其中

  • match:這個函數指針會在擴展匹配報文時被調用,用來判斷skb是否滿足條件,如果滿足則返回非0值。
  • checkentry:這個函數在用戶配置規則時被調用,如果返回0,表示配置失敗。
  • destroy:這個函數再使用該match的規則被刪除時調用。

使用擴展match

當數據包真的到達時,Netfilter會調用各個表安裝的鉤子函數,這些鉤子函數用表中的每條rule去嘗試匹配數據包

match

REF

netfilter-hacking-HOWTO

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