2016-11-11 2 views
0

У меня есть модуль ядра Linux, который я запускаю на маршрутизаторе: Netgear DGN2200v2 под управлением Linux 2.6.30).Захват Netfilter на маршрутизаторе, который не получает вызов для мостовых интерфейсов

Модуль ядра регистрирует 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); 

У меня есть две машины, подключенные к моему маршрутизатору, один через Wi-Fi и один с помощью кабеля Ethernet. Сам маршрутизатор не подключен к Интернету (т. Е. Все мои тесты находятся в изолированной сети).

Моя проблема заключается в том, что в соответствии с printk s в функции моего крючка крюк получает вызов только для пакетов, которые отправляются непосредственно на маршрутизатор (т. Е. Если я пингую маршрутизатор с моей машины) или непосредственно с маршрутизатора (т. е. если я подключу telnet к маршрутизатору и вытащу из него свою машину).

Однако крючок не вызывается, если две машины пинговают друг друга, хотя этот трафик, очевидно, все еще протекает через маршрутизатор.

Согласно http://www.tldp.org/HOWTO/html_single/Ethernet-Bridge-netfilter-HOWTO и http://www.linux-kongress.org/2002/papers/lk2002-spenneberg.pdf, если я установил мост в своем маршрутизаторе, то netfilter (или iptables) должен иметь возможность фильтровать проходящие через него пакеты. Глядя на вывод brctl на маршрутизатор (я могу прикрепить его, если нужно), кажется, что такой мост уже настроен, но мой крючок не видит эти пакеты.

Есть ли способ получить сетевые крючки, вызываемые для таких пакетов?

ответ

0

Используйте следующие настройки в nf_hook_ops и убедитесь, что в вашей сборке ядра включен CONFIG_BRIDGE_NETFILTER.

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