路由器上的Netfilter挂钩没有被调用桥接接口

时间:2016-11-11 22:45:22

标签: linux-kernel netfilter

我有一个Linux内核模块,我在路由器上运行:Netgear DGN2200v2运行Linux 2.6.30)。

内核模块注册了一个netfilter钩子,如下所示:

static struct nf_hook_ops nfho;

// ...

nfho.hook = hook_func;
nfho.owner = THIS_MODULE;
nfho.hooknum = 0; /* NF_IP_PRE_ROUTING */
nfho.pf = 0x20000000; // PF_INET
nfho.priority = INT_MIN;

int rc = nf_register_hook(&nfho);

我有两台机器连接到我的路由器,一台通过wifi,另一台使用以太网电缆。路由器本身没有连接到Internet(即我的所有测试都在隔离的网络上)。

我的问题是,根据我的钩子函数中的printk,只有被直接发送到路由器的数据包(即,如果我从我的机器ping路由器)或直接调用钩子从路由器(即如果我telnet到路由器并从它ping我的机器)。

但是,如果两台机器相互ping通,则挂机,即使此流量显然仍然流经路由器。

根据http://www.tldp.org/HOWTO/html_single/Ethernet-Bridge-netfilter-HOWTOhttp://www.linux-kongress.org/2002/papers/lk2002-spenneberg.pdf,如果我在路由器中设置了一个网桥,那么netfilter(或iptables)应该能够过滤流经它的数据包。查看路由器上brctl的输出(如果需要我可以附加它),似乎已经设置了这样的桥,但是我的钩子没有看到那些数据包。

有没有办法让netfilter挂钩调用这样的数据包呢?

2 个答案:

答案 0 :(得分:0)

以防其他人遇到同样的问题 - 问题是我使用了错误类型的钩子。我应该使用PF_BRIDGE(0x07)而不是PF_INET(0x02)。另请参阅http://ebtables.netfilter.org/ebtables-hacking/ebtables-hacking-HOWTO-4.html

答案 1 :(得分:0)

在nf_hook_ops中使用以下设置,并确保在内核版本中启用CONFIG_BRIDGE_NETFILTER。

.pf     = PF_BRIDGE,
.hooknum    = NF_BR_PRE_ROUTING,
.priority   = NF_BR_PRI_FIRST,