在 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 挂钩。
我在我的设置中检查并打开了它!!
我已经编写了一个 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 挂钩。
我在我的设置中检查并打开了它!!