Netfilter 是如何工做的(四):動做(target)

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

one-rule

上面是一條普通iptables規則,若是報文匹配前面的條件,就會執行最後的-j DROP,它就是這條規則的動做(target)html

普通動做 & 擴展動做

動做又可分爲普通target擴展target兩類,其中普通動做是指ACCEPT(容許報文經過)、DROP(拒絕報文經過)這類簡單明瞭的行爲,而擴展target是指包含了其餘操做的動做,好比REJECT動做會產生ICMP差錯信息、LOG動做記錄日誌、SNATDNAT用於進行地址轉換。segmentfault

本文不涉及 How to 配置這些動做的規則,也不涉及這些動做各自的做用是什麼,對此有興趣的讀者能夠參考 連接

表示 target

Netfilter使用xt_standard_target表示一個動做:數組

pic

該結構由兩部分組成,其中verdict是動做的編碼, 取值有NF_DROPNF_ACCEPTNF_QUEUE等等。對於普通動做來講,有verdict就夠了,但對於擴展動做來講,還須要有地方存儲額外的信息(eg. 如何進行NAT),這裏的target就是存儲這些額外信息的地方。與本系列上一篇中說的xt_entry_match同樣,xt_entry_target結構一樣是一個union。它們的設計思路是同樣的:內核代碼和iptables用戶態代碼定義這樣一個一樣的數據類型,用戶態使用的是user部分,設置要使用的擴展動做的name(普通動做的name爲""),內核收到該結構後,根據name查詢到註冊過的動做,將該信息掛到xt_entry_targettarget指針上。而data字段表示的柔性數組區域就是各類擴展模塊各顯神通的地方了,對NAT來講,這裏存儲轉換後的地址。框架

註冊 target

咱們須要將target預先註冊到Netfilter框架中,才能在以後的配置中使用這個target。就拿本文最初的那條規則來講,須要一個隱含的前提就是SNAT這個xt_target事先被註冊到Netfilter框架了。這部分工做在xt_nat.c定義的內核模塊中完成:函數

pic

除了SNAT, 經過xt_register_target接口,其餘各個模塊均可以註冊本身的動做。根據名字進行區分,全部的target會掛到xf鏈表上。編碼

pic

每一個target上有三個函數指針,其中spa

  • target:這個函數將決定skb的後續處理結果,若是爲NULL,那麼這條規則的動做就是普通target,處理結果從外面的verdict就能夠得出。若是不爲NULL,那麼就執行這個函數,這個函數返回NF_DROP, NF_ACCEPT, NF_STOLEN這類動做
  • checkentry:這個函數在用戶配置規則時被調用,若是返回0,表示配置失敗。
  • destroy:這個函數再使用該target的規則被刪除時調用。

查找 target

當用戶經過iptables下發一條規則時,Netfilter會從xf鏈表上查找是否已有這樣的target
pic.net

執行 target

當數據包通過HOOK點,若是某條rule的匹配條件與報文一致,就會執行該rule包含的動做。設計

pic

REF

netfilter-hacking-HOWTO3d

相關文章
相關標籤/搜索