路由器上的 Netfilter 挂钩未被桥接接口调用
Netfilter hook on router not getting called for bridged interfaces
我在路由器上 运行 有一个 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,一台使用以太网电缆。路由器本身没有连接到互联网(即我所有的测试都在一个孤立的网络上)。
我的问题是,根据我的挂钩函数中的 printk
s,挂钩仅针对直接发送到路由器的数据包被调用(即,如果我从我的机器 ping 路由器)或直接从路由器(即,如果我远程登录到路由器并从中 ping 我的机器)。
但是,如果两台机器互相 ping 通,挂钩 不会 被调用,即使此流量显然仍然流经路由器。
根据 http://www.tldp.org/HOWTO/html_single/Ethernet-Bridge-netfilter-HOWTO and http://www.linux-kongress.org/2002/papers/lk2002-spenneberg.pdf,如果我在我的路由器中设置了网桥,那么 netfilter(或 iptables)应该能够过滤流经它的数据包。查看路由器上 brctl
的输出(如果需要我可以附加它),似乎已经建立了这样的网桥,但是我的钩子没有看到那些数据包。
有没有办法让 netfilter 挂钩也为此类数据包调用?
以防其他人遇到同样的问题 - 问题是我使用了错误类型的钩子。我应该使用 PF_BRIDGE
(0x07) 而不是 PF_INET
(0x02)。另见 http://ebtables.netfilter.org/ebtables-hacking/ebtables-hacking-HOWTO-4.html。
在您的 nf_hook_ops 中使用以下设置并确保在您的内核构建中启用 CONFIG_BRIDGE_NETFILTER。
.pf = PF_BRIDGE,
.hooknum = NF_BR_PRE_ROUTING,
.priority = NF_BR_PRI_FIRST,
我在路由器上 运行 有一个 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,一台使用以太网电缆。路由器本身没有连接到互联网(即我所有的测试都在一个孤立的网络上)。
我的问题是,根据我的挂钩函数中的 printk
s,挂钩仅针对直接发送到路由器的数据包被调用(即,如果我从我的机器 ping 路由器)或直接从路由器(即,如果我远程登录到路由器并从中 ping 我的机器)。
但是,如果两台机器互相 ping 通,挂钩 不会 被调用,即使此流量显然仍然流经路由器。
根据 http://www.tldp.org/HOWTO/html_single/Ethernet-Bridge-netfilter-HOWTO and http://www.linux-kongress.org/2002/papers/lk2002-spenneberg.pdf,如果我在我的路由器中设置了网桥,那么 netfilter(或 iptables)应该能够过滤流经它的数据包。查看路由器上 brctl
的输出(如果需要我可以附加它),似乎已经建立了这样的网桥,但是我的钩子没有看到那些数据包。
有没有办法让 netfilter 挂钩也为此类数据包调用?
以防其他人遇到同样的问题 - 问题是我使用了错误类型的钩子。我应该使用 PF_BRIDGE
(0x07) 而不是 PF_INET
(0x02)。另见 http://ebtables.netfilter.org/ebtables-hacking/ebtables-hacking-HOWTO-4.html。
在您的 nf_hook_ops 中使用以下设置并确保在您的内核构建中启用 CONFIG_BRIDGE_NETFILTER。
.pf = PF_BRIDGE,
.hooknum = NF_BR_PRE_ROUTING,
.priority = NF_BR_PRI_FIRST,