免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1626 | 回复: 3
打印 上一主题 下一主题

[网络子系统] 各位踊跃来参加讨论撒 网络协议栈NAT以后 [复制链接]

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-26 22:41 |只看该作者 |倒序浏览
见代码中的注释:
NAT核心函数之一
static unsigned int
nf_nat_fn(unsigned int hooknum,
          struct sk_buff *skb,
          const struct net_device *in,
          const struct net_device *out,
          int (*okfn)(struct sk_buff *))
{
        struct nf_conn *ct;
        enum ip_conntrack_info ctinfo;
        struct nf_conn_nat *nat;
        /* maniptype == SRC for postrouting. */
        enum nf_nat_manip_type maniptype = HOOK2MANIP(hooknum);

        /* We never see fragments: conntrack defrags on pre-routing
           and local-out, and nf_nat_out protects post-routing. */
        NF_CT_ASSERT(!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)));
        /*下面函数调用主要完成*ctinfo = skb->nfctinfo;
        return (struct nf_conn *)skb->nfct; 其中skb->nfctinfo以及skb->nfct是在哪里进行赋值的,在dev_alloc_skb中并没有对其初始化。*/
        ct = nf_ct_get(skb, &ctinfo);

        /* Can't track?  It's not due to stress, or conntrack would
           have dropped it.  Hence it's the user's responsibilty to
           packet filter it out, or implement conntrack/NAT for that
           protocol. --RR */
        if (!ct)
                return NF_ACCEPT;

        /* Don't try to NAT if this packet is not conntracked */
        if (ct == &nf_conntrack_untracked)
                return NF_ACCEPT;

        nat = nfct_nat(ct);
        if (!nat) {
                /* NAT module was loaded late. */
                if (nf_ct_is_confirmed(ct))
                        return NF_ACCEPT;
                nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
                if (nat == NULL) {
                        pr_debug("failed to add NAT extension\n";
                        return NF_ACCEPT;
                }
        }

        switch (ctinfo) {
        case IP_CT_RELATED:
        case IP_CT_RELATED+IP_CT_IS_REPLY:
                if (ip_hdr(skb)->protocol == IPPROTO_ICMP) {
                        if (!nf_nat_icmp_reply_translation(ct, ctinfo,
                                                           hooknum, skb))
                                return NF_DROP;
                        else
                                return NF_ACCEPT;
                }
                /* Fall thru... (Only ICMPs can be IP_CT_IS_REPLY) */
        case IP_CT_NEW:

                /* Seen it before?  This can happen for loopback, retrans,
                   or local packets.. */
                if (!nf_nat_initialized(ct, maniptype)) {
                        unsigned int ret;

                        if (hooknum == NF_INET_LOCAL_IN)
                                /* LOCAL_IN hook doesn't have a chain!  */
                                ret = alloc_null_binding(ct, hooknum);
                        else
                                ret = nf_nat_rule_find(skb, hooknum, in, out,
                                                       ct);

                        if (ret != NF_ACCEPT) {
                                return ret;
                        }
                } else
                        pr_debug("Already setup manip %s for ct %p\n",
                                 maniptype == IP_NAT_MANIP_SRC ? "SRC" : "DST",
                                 ct);
                break;

        default:
                /* ESTABLISHED */
                NF_CT_ASSERT(ctinfo == IP_CT_ESTABLISHED ||
                             ctinfo == (IP_CT_ESTABLISHED+IP_CT_IS_REPLY));
        }

        return nf_nat_packet(ct, ctinfo, hooknum, skb);
}

论坛徽章:
0
2 [报告]
发表于 2013-07-29 13:37 |只看该作者
nf_conntrack的hook在nat的hook之前执行

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
3 [报告]
发表于 2013-07-29 18:00 |只看该作者
回复 2# anbutu


    能说详细点嘛  呵呵  我新手 不太明白
nf_conntrack的hook函数是注册的哪个呢??

论坛徽章:
0
4 [报告]
发表于 2013-07-30 09:00 |只看该作者
回复 3# tc1989tc


    具体在内核的net\netfilter\nf_conntrack_core.c文件的resolve_normal_ct()函数的末尾:

static inline struct nf_conn *
       resolve_normal_ct(struct sk_buff *skb,unsigned int dataoff,u_init16_t l3num,u_init8_t protonum,
                                  struct nf_conntrack_l3proto *l3proto,
                                  struct nf_conntrack_l4proto *l4proto,
                                  int *set_reply,
                                  enum ip_conntrack_info *ctinfo)
{
        struct nf_conntrack_tuple tuple;
        struct nf_conntrack_tuple_hash *h;
       ... ...

       skb->nfct=&ct->ct_general;
       skb->nfctinfo=*ctinfo;
       return ct;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP