2015-09-10 33 views
2

我已經寫了一個網絡過濾模塊,檢查從Linux中傳入和傳出的數據包,一些特定的模式。在IF_NET模式POST_ROUTING鉤不會被調用

nfho1.owner    = THIS_MODULE; 
nfho1.hook    = dhcp_hook_function; 
nfho1.hooknum   = NF_INET_POST_ROUTING; 
nfho1.priority   = NF_IP_PRI_FIRST; 

if(use_bridge == 1) 
{ 
     nfho1.pf   = PF_BRIDGE; // on bridge interface 
} 
else 
{ 
     nfho1.pf   = PF_INET; // not on bridge interface 
} 


nfho2.owner  = THIS_MODULE; 
nfho2.hook  = data_hook_function; 
nfho2.hooknum = NF_INET_PRE_ROUTING; 
nfho2.priority = NF_IP_PRI_FIRST; 

if(use_bridge == 1) 
{ 
     nfho2.pf   = PF_BRIDGE; // on bridge interface 
} 
else 
{ 
     nfho2.pf   = PF_INET; 
} 

nf_register_hook(&nfho1); 
nf_register_hook(&nfho2); 

的use_bridge參數決定使用哪個協議族。

不過,我的問題是,IS THE PF_BRIDGE必要的。

測試用例: 案例1:BR0使用brctl

與PF_BRIDGE的POST_ROUTING鉤配置被調用。 沒有PF_BRIDGE的POST_ROUTING鉤不會被調用。

爲什麼沒有路由後鉤被調用。 AFAIK後路由掛鉤不能被繞過。

案例2:BR0不confugured但ip_forwarding爲ON。

沒有PF_BRIDGE兩個鉤子被調用。 我沒有爲這個測試用例配置PF_BRIDGE。

那麼,爲什麼需要PF_BRIDGE使POST路由鉤子被調用。

回答

2

我想通了,爲什麼發生這種情況,以便共享:

通過在Linux缺省iptables的會處理一個IP層包而ebtables處理二層報文。

However there is a configuration parameter to be set in: 
/proc/sys/net/bridge/bridge-nf-call-iptables. 

如果**設置爲1,則即使在橋層包似乎要調用的iptables鉤。

我在設置檢查這一點,並打開它!

0

你修改分組呢?有幾種情況,br_nf_post_routing不會將POST_ROUTING掛鉤傳遞迴IP堆棧。它看起來像這樣的一個情況是,當IP netfilter的鉤子已經做了一些與它(http://lxr.free-electrons.com/source/net/bridge/br_netfilter_hooks.c#L808

希望這有助於。我目前正在努力瞭解自己的Netfilter連接。祝你好運!

+0

親愛的喬爾C, 我想出了答案,一些挖入網上PF_BRIDGE。 有一個參數的/ proc/SYS /網/橋樑/ nf_bridge_call_iptables。 – Haswell