在 IF_NET 模式下 POST_ROUTING 挂钩不会被调用

In IF_NET mode POST_ROUTING hook does not get called

我已经编写了一个 netfilter 模块来检查从 Linux 框传入和传出的数据包的某些特定模式。

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 参数决定使用哪个协议族。

但是,我的问题是,是否需要PF_BRIDGE。

测试用例: 情况 1:br0 使用 brctl

配置

with PF_BRIDGE post_routing 钩子被调用。 没有 PF_BRIDGE,post_routing 挂钩不会被调用。

为什么不调用 post-路由挂钩。据我所知,无法绕过 post 路由挂钩。

情况 2:br0 未配置但 ip_forwarding 已打开。

没有 PF_BRIDGE 两个挂钩都会被调用。 我没有为这个测试用例配置PF_BRIDGE。

那么为什么 PF_BRIDGE 需要调用 POST ROUTING 挂钩。

您是否在修改数据包?在某些情况下,br_nf_post_routing 不会将 POST_ROUTING 挂钩传递回 IP 堆栈。看起来这样的一种情况是 IP netfilter 挂钩对它做了一些事情 (http://lxr.free-electrons.com/source/net/bridge/br_netfilter_hooks.c#L808)

希望这对您有所帮助。我目前正在尝试自己了解 Netfilter 链接。祝你好运!

我明白了为什么会这样,所以分享:

默认情况下,在Linux 中,iptables 将处理IP 层数据包,而ebtables 将处理第2 层数据包。

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

如果它被 ** 设置为 1,那么即使桥接层数据包似乎也在调用 iptables 挂钩。

我在我的设置中检查并打开了它!!