bridge-nf-call-iptables

2024-04-30 14:18
文章标签 call iptables bridge nf

本文主要是介绍bridge-nf-call-iptables,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!




static int __init br_init(void)
{
...

/* 网桥HOOK点注册 */
err = br_netfilter_init();

if (err)
   goto err_out1;
...

/* 网桥处理接口 */
br_handle_frame_hook = br_handle_frame;

... 
}

int __init br_netfilter_init(void)
{
int ret;

ret = nf_register_hooks(br_nf_ops, ARRAY_SIZE(br_nf_ops));
...
return 0;
}

static struct nf_hook_ops br_nf_ops[] __read_mostly = {
{ .hook = br_nf_pre_routing,
   .owner = THIS_MODULE,
   .pf = PF_BRIDGE,
   .hooknum = NF_BR_PRE_ROUTING,
   .priority = NF_BR_PRI_BRNF, },
{ .hook = br_nf_local_in,
   .owner = THIS_MODULE,
   .pf = PF_BRIDGE,
   .hooknum = NF_BR_LOCAL_IN,
   .priority = NF_BR_PRI_BRNF, },
{ .hook = br_nf_forward_ip,
   .owner = THIS_MODULE,
   .pf = PF_BRIDGE,
   .hooknum = NF_BR_FORWARD,
   .priority = NF_BR_PRI_BRNF - 1, },
{ .hook = br_nf_forward_arp,
   .owner = THIS_MODULE,
   .pf = PF_BRIDGE,
   .hooknum = NF_BR_FORWARD,
   .priority = NF_BR_PRI_BRNF, },
{ .hook = br_nf_local_out,
   .owner = THIS_MODULE,
   .pf = PF_BRIDGE,
   .hooknum = NF_BR_LOCAL_OUT,
   .priority = NF_BR_PRI_FIRST, },
{ .hook = br_nf_post_routing,
   .owner = THIS_MODULE,
   .pf = PF_BRIDGE,
   .hooknum = NF_BR_POST_ROUTING,
   .priority = NF_BR_PRI_LAST, },
{ .hook = ip_sabotage_in,
   .owner = THIS_MODULE,
   .pf = PF_INET,
   .hooknum = NF_INET_PRE_ROUTING,
   .priority = NF_IP_PRI_FIRST, },
{ .hook = ip_sabotage_in,
   .owner = THIS_MODULE,
   .pf = PF_INET6,
   .hooknum = NF_INET_PRE_ROUTING,
   .priority = NF_IP6_PRI_FIRST, },
};









http://blog.csdn.net/matt_mao/article/details/18702455


可以通过以下proc查看kernel是否开启了bridge-nf-call-iptables:
# cat /proc/sys/net/bridge/bridge-nf-call-iptables 
1

这个proc是定义在以下位置:

net/bridge/br_netfilter.c

 985 static ctl_table brnf_table[] = {
...
 993         {
 994                 .procname       = "bridge-nf-call-iptables",
 995                 .data           = &brnf_call_iptables,
 996                 .maxlen         = sizeof(int),
 997                 .mode           = 0644,
 998                 .proc_handler   = brnf_sysctl_call_tables,
 999         },


在桥的NF_BR_PRE_ROUTING处理函数中,会根据brnf_call_iptables的值判断是否需要去过一下iptables的NF_INET_PRE_ROUTING的hock点

net/bridge/br_netfilter.c

 552 static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb,
 553                                       const struct net_device *in,
 554                                       const struct net_device *out,
 555                                       int (*okfn)(struct sk_buff *))
 556 {
...
 572 #ifdef CONFIG_SYSCTL
// 在桥的处理中是否需要call iptables
 573         if (!brnf_call_iptables)
 574                 return NF_ACCEPT;
 575 #endif

 576 
// ip头的基本检查和ip_rcv做的动作类似
 577         if (skb->protocol != htons(ETH_P_IP) && !IS_VLAN_IP(skb) &&
 578             !IS_PPPOE_IP(skb))
 579                 return NF_ACCEPT;
 580 
 581         nf_bridge_pull_encap_header_rcsum(skb);
 582 
 583         if (!pskb_may_pull(skb, sizeof(struct iphdr)))
 584                 goto inhdr_error;
 585 
 586         iph = ip_hdr(skb);
 587         if (iph->ihl < 5 || iph->version != 4)
 588                 goto inhdr_error;
 589 
 590         if (!pskb_may_pull(skb, 4 * iph->ihl))
 591                 goto inhdr_error;
 592 
 593         iph = ip_hdr(skb);
 594         if (ip_fast_csum((__u8 *) iph, iph->ihl) != 0)
 595                 goto inhdr_error;
 596 
 597         len = ntohs(iph->tot_len);
 598         if (skb->len < len || len < 4 * iph->ihl)
 599                 goto inhdr_error;
 600 
 601         pskb_trim_rcsum(skb, len);
 602 
 603         /* BUG: Should really parse the IP options here. */
 604         memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
 605 
 606         nf_bridge_put(skb->nf_bridge);
 607         if (!nf_bridge_alloc(skb))
 608                 return NF_DROP;
 609         if (!setup_pre_routing(skb))
 610                 return NF_DROP;
 611         store_orig_dstaddr(skb);
 612 
// 进入iptables的NF_INET_PRE_ROUTING
 613         NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, skb->dev, NULL,
 614                 br_nf_pre_routing_finish);

 615 
 616         return NF_STOLEN;
 617 
 618 inhdr_error:
 619 //      IP_INC_STATS_BH(IpInHdrErrors);
 620 out:
 621         return NF_DROP;
 622 }




这篇关于bridge-nf-call-iptables的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949088

相关文章

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

iptables持久化命令:netfilter-persistent save

在Linux上,使用netfilter-persistent命令可以保存iptables防火墙规则,确保它们在系统重启后仍然有效。以下是如何使用netfilter-persistent来保存iptables规则的步骤: 打开终端:首先,你需要打开Linux系统的终端。保存规则:使用netfilter-persistent save命令可以保存当前的iptables规则。这个命令会调用所有插件,将

Python __call__ 用法 作用

当一个对象为可被调用对象时,callable(object)返回为True,否则为False: Python中的对象有可被调用和不可被调用之分。 def func_test():print("func_test run")class class_test():def __init__(self):pass# func_test is callable return Trueprint("fu

《GOF设计模式》—桥接(BRIDGE)—Delphi源码示例:可移植的用户界面

 示例:可移植的用户界面 说明:   代码:   unit uWindow;   interface   uses Windows,SysUtils,Classes,Graphics;   type     TWindow = class;     TWindowImp = class;       {窗口视图}     TView = class

Netfilter学习之NAT类型动态配置(八)nf_nat_proto_common.c代码解析

nf_nat_proto_common.c实现了对称型的端口改变,在此我决定对其代码进行分析,以便实现对对称型NAT的随意改动。    具体代码如下: #include <linux/types.h>#include <linux/random.h>#include <linux/netfilter.h>#include <linux/export.h>#include <net/n

Netfilter学习之NAT类型动态配置(六)全锥型NAT用户空间iptables命令行实现

本文主要实现全锥型NAT的用户空间iptables命令行扩展的实现,实现思路见上文,具体可以模仿MASQUERADE的源码进行改写。 1.关键部分实现代码   由于fullcone类型并不需要输入参数,因此parse可以为空,print和save也很简单,只需要help和结构注册两部分保证正确即可。   help如下: static void FULLCONE_help(void){

Qt 错误qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error

今天运行程序中有一个从网页下载文件到本地的功能运行输出下列错误         qt.network.ssl: QSslSocket: cannot call unresolved function ERR_get_error     qt.network.ssl: QSslSocket: cannot call unresolved function TLSv1_client_method

js apply和call方法的使用说明和区别

在JavaScript中,apply和call都是函数对象的方法,它们允许你改变函数调用时的上下文(即this值),并且可以显式地传入参数。这两者的主要区别在于如何传递参数。 call 方法 call方法使用一系列的参数来传递给目标函数。 语法 func.call(thisArg, arg1, arg2, ...argN); thisArg:在函数被调用时,作为this值被传递给目标函

Linux 虚拟网络三大基石:Namespace、Veth pair 与 Bridge

引言 在 Linux 的世界里,虚拟网络技术是系统管理、云计算和容器化不可或缺的一部分。今天,我们将深入探讨构建这些虚拟网络的三大基石:Namespace、Veth 对和 Bridge,揭示它们如何在背后默默支撑起你的网络环境。 Namespace:隔离与抽象的艺术 当我们谈起 Namespace,实际上是在讨论一种革命性的资源隔离机制。它让每个进程仿佛拥有一套独立的系统资源。通过将全局资

iptables四表五链

netfilter/iptables netfilter是Linux内核中的一个框架,工作在网络层,用于处理ip数据包,iptables 则是一个命令行工具,通过与netfilter框架交互,实现对数据包的过滤和转发等操作 常见的UFW防火墙、firewalld防火墙都是基于iptables的,它们提供了更简单的管理iptables的rules的命令 Tables 表 filter 过滤