linux下的Netfilter&iptables:注册连接跟踪函数流程分析1

初始化函数如下

/* Connection tracking may drop packets, but never alters them, so
   make it the first hook. */
static struct nf_hook_ops ipv4_conntrack_ops[] __read_mostly = {
    {
        .hook        = ipv4_conntrack_in,
        .owner        = THIS_MODULE,
        .pf        = NFPROTO_IPV4,
        .hooknum    = NF_INET_PRE_ROUTING,
        .priority    = NF_IP_PRI_CONNTRACK,
    },
    {
        .hook        = ipv4_conntrack_local,
        .owner        = THIS_MODULE,
        .pf        = NFPROTO_IPV4,
        .hooknum    = NF_INET_LOCAL_OUT,
        .priority    = NF_IP_PRI_CONNTRACK,
    },
    {
        .hook        = ipv4_helper,
        .owner        = THIS_MODULE,
        .pf        = NFPROTO_IPV4,
        .hooknum    = NF_INET_POST_ROUTING,
        .priority    = NF_IP_PRI_CONNTRACK_HELPER,
    },
    {
        .hook        = ipv4_confirm,
        .owner        = THIS_MODULE,
        .pf        = NFPROTO_IPV4,
        .hooknum    = NF_INET_POST_ROUTING,
        .priority    = NF_IP_PRI_CONNTRACK_CONFIRM,
    },
    {
        .hook        = ipv4_helper,
        .owner        = THIS_MODULE,
        .pf        = NFPROTO_IPV4,
        .hooknum    = NF_INET_LOCAL_IN,
        .priority    = NF_IP_PRI_CONNTRACK_HELPER,
    },
    {
        .hook        = ipv4_confirm,
        .owner        = THIS_MODULE,
        .pf        = NFPROTO_IPV4,
        .hooknum    = NF_INET_LOCAL_IN,
        .priority    = NF_IP_PRI_CONNTRACK_CONFIRM,
    },
};

static int __init nf_conntrack_l3proto_ipv4_init(void)
{
    int ret = 0;

    need_conntrack();
    nf_defrag_ipv4_enable();

    ret = nf_register_sockopt(&so_getorigdst);
    if (ret < 0) {
        printk(KERN_ERR "Unable to register netfilter socket option\n");
        return ret;
    }

    ret = register_pernet_subsys(&ipv4_net_ops);
    if (ret < 0) {
        pr_err("nf_conntrack_ipv4: can't register pernet ops\n");
        goto cleanup_sockopt;
    }

/**************向钩子注册连接追踪函数******************/

    ret = nf_register_hooks(ipv4_conntrack_ops,
                ARRAY_SIZE(ipv4_conntrack_ops));
    if (ret < 0) {
        pr_err("nf_conntrack_ipv4: can't register hooks.\n");
        goto cleanup_pernet;
    }

    ret = nf_ct_l4proto_register(&nf_conntrack_l4proto_tcp4);
    if (ret < 0) {
        pr_err("nf_conntrack_ipv4: can't register tcp4 proto.\n");
        goto cleanup_hooks;
    }

    ret = nf_ct_l4proto_register(&nf_conntrack_l4proto_udp4);
    if (ret < 0) {
        pr_err("nf_conntrack_ipv4: can't register udp4 proto.\n");
        goto cleanup_tcp4;
    }

    ret = nf_ct_l4proto_register(&nf_conntrack_l4proto_icmp);
    if (ret < 0) {
        pr_err("nf_conntrack_ipv4: can't register icmpv4 proto.\n");
        goto cleanup_udp4;
    }

    ret = nf_ct_l3proto_register(&nf_conntrack_l3proto_ipv4);
    if (ret < 0) {
        pr_err("nf_conntrack_ipv4: can't register ipv4 proto.\n");
        goto cleanup_icmpv4;
    }

#if defined(CONFIG_PROC_FS) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT)
    ret = nf_conntrack_ipv4_compat_init();
    if (ret < 0)
        goto cleanup_proto;
#endif
    return ret;
#if defined(CONFIG_PROC_FS) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT)
 cleanup_proto:
    nf_ct_l3proto_unregister(&nf_conntrack_l3proto_ipv4);
#endif
 cleanup_icmpv4:
    nf_ct_l4proto_unregister(&nf_conntrack_l4proto_icmp);
 cleanup_udp4:
    nf_ct_l4proto_unregister(&nf_conntrack_l4proto_udp4);
 cleanup_tcp4:
    nf_ct_l4proto_unregister(&nf_conntrack_l4proto_tcp4);
 cleanup_hooks:
    nf_unregister_hooks(ipv4_conntrack_ops, ARRAY_SIZE(ipv4_conntrack_ops));
 cleanup_pernet:
    unregister_pernet_subsys(&ipv4_net_ops);
 cleanup_sockopt:
    nf_unregister_sockopt(&so_getorigdst);
    return ret;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值