每一條iptables
配置的規則(rule
)都包含了匹配條件(match
)部分和動做(target
)。當報文途徑HOOK
點時,Netfilter
會逐個遍歷掛在該鉤子點上的表的rule
,若報文知足rule
的匹配條件,內核就會執行動做(target
)。
上面是一條普通iptables
規則,若是報文匹配前面的條件,就會執行最後的-j DROP
,它就是這條規則的動做(target
)html
動做又可分爲普通target和擴展target兩類,其中普通動做是指ACCEPT
(容許報文經過)、DROP
(拒絕報文經過)這類簡單明瞭的行爲,而擴展target
是指包含了其餘操做的動做,好比REJECT
動做會產生ICMP
差錯信息、LOG
動做記錄日誌、SNAT
和DNAT
用於進行地址轉換。segmentfault
本文不涉及
How to
配置這些動做的規則,也不涉及這些動做各自的做用是什麼,對此有興趣的讀者能夠參考
連接
Netfilter
使用xt_standard_target
表示一個動做:數組
該結構由兩部分組成,其中verdict
是動做的編碼, 取值有NF_DROP
、NF_ACCEPT
、NF_QUEUE
等等。對於普通動做來講,有verdict
就夠了,但對於擴展動做來講,還須要有地方存儲額外的信息(eg. 如何進行NAT
),這裏的target
就是存儲這些額外信息的地方。與本系列上一篇中說的xt_entry_match
同樣,xt_entry_target
結構一樣是一個union
。它們的設計思路是同樣的:內核代碼和iptables
用戶態代碼定義這樣一個一樣的數據類型,用戶態使用的是user
部分,設置要使用的擴展動做的name
(普通動做的name
爲""),內核收到該結構後,根據name
查詢到註冊過的動做,將該信息掛到xt_entry_target
的target
指針上。而data
字段表示的柔性數組區域就是各類擴展模塊各顯神通的地方了,對NAT
來講,這裏存儲轉換後的地址。框架
咱們須要將target
預先註冊到Netfilter
框架中,才能在以後的配置中使用這個target
。就拿本文最初的那條規則來講,須要一個隱含的前提就是SNAT
這個xt_target
事先被註冊到Netfilter
框架了。這部分工做在xt_nat.c
定義的內核模塊中完成:函數
除了SNAT
, 經過xt_register_target
接口,其餘各個模塊均可以註冊本身的動做。根據名字進行區分,全部的target
會掛到xf
鏈表上。編碼
每一個target
上有三個函數指針,其中spa
target
:這個函數將決定skb
的後續處理結果,若是爲NULL
,那麼這條規則的動做就是普通target
,處理結果從外面的verdict
就能夠得出。若是不爲NULL
,那麼就執行這個函數,這個函數返回NF_DROP
, NF_ACCEPT
, NF_STOLEN
這類動做checkentry
:這個函數在用戶配置規則時被調用,若是返回0,表示配置失敗。destroy
:這個函數再使用該target
的規則被刪除時調用。當用戶經過iptables
下發一條規則時,Netfilter
會從xf
鏈表上查找是否已有這樣的target
.net
當數據包通過HOOK
點,若是某條rule
的匹配條件與報文一致,就會執行該rule
包含的動做。設計