当/proc/sys/net/bridge/bridge-nf-call-iptables值为真,表示linux桥下的报文会经过ip层的netfilter框架处理。即可以通过iptables命令来对桥下的报文进行处理。当该值为0时,只能通过ebtables来处理桥下的报文。
以linux内核3.14内核分析:文件/proc/sys/net/bridge/bridge-nf-call-iptables对应到内核中的变量是 brnf_call_iptables。
1、在内核函数br_nf_pre_routing中有一段代码:
if (!brnf_call_iptables && !br->nf_call_iptables)
return NF_ACCEPT;
当上述变量二者有一个为真,即执行该函数后续流程。
2、br_nf_pre_routing函数注册到了NF_BR_PRE_ROUTING钩子点。
3、br_nf_pre_routing函数中调用了nf_bridge_alloc分配skb->nf_bridge。后续的ip层的netfilter钩子点是通过判断nf_bridge是否为空来进行后续操作的。
4、通过grep -rn "NF_INET_"在内核源码net/bridge/目录下进行搜索,可以得到三个ip层的钩子点NF_INET_PRE_ROUTING、NF_INET_FORWARD、NF_INET_POST_ROUTING。这些钩子点会判断skb->nf_bridfe是否为空来进行后续操作,从而可以使得桥下报文进入到ip层的netfiulter处理。
5、br_nf_forward_ip、br_nf_post_routing分别对应NF_INET_FORWARD、NF_INET_POST_ROUTING钩子点。