免费注册 查看新帖 |

Chinaunix

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

netfilter的conntrack判断,求详解,,,时间紧,,谢谢,,, [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-04 14:33 |只看该作者 |倒序浏览
static int
match(const struct sk_buff *skb,
      const struct net_device *in,
      const struct net_device *out,
      const struct xt_match *match,
      const void *matchinfo,
      int offset,
      unsigned int protoff,
      int *hotdrop)
{
        const struct xt_conntrack_info *sinfo = matchinfo;
        struct nf_conn *ct;
        enum ip_conntrack_info ctinfo;
        unsigned int statebit;

        ct = nf_ct_get((struct sk_buff *)skb, &ctinfo);

#define FWINV(bool,invflg) ((bool) ^ !!(sinfo->invflags & invflg))

        if (ct == &nf_conntrack_untracked)
                statebit = XT_CONNTRACK_STATE_UNTRACKED;
        else if (ct)
                statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
        else
                statebit = XT_CONNTRACK_STATE_INVALID;

        if(sinfo->flags & XT_CONNTRACK_STATE) {
                if (ct) {
                        if(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip !=
                            ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip)
                                statebit |= XT_CONNTRACK_STATE_SNAT;

                        if(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip !=
                            ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip)
                                statebit |= XT_CONNTRACK_STATE_DNAT;
                }

                if (FWINV((statebit & sinfo->statemask) == 0, XT_CONNTRACK_STATE))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_PROTO) {
                if (!ct || FWINV(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum != sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.protonum, XT_CONNTRACK_PROTO))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_ORIGSRC) {
                if (!ct || FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip&sinfo->sipmsk[IP_CT_DIR_ORIGINAL].s_addr) != sinfo->tuple[IP_CT_DIR_ORIGINAL].src.ip, XT_CONNTRACK_ORIGSRC))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_ORIGDST) {
                if (!ct || FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip&sinfo->dipmsk[IP_CT_DIR_ORIGINAL].s_addr) != sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.ip, XT_CONNTRACK_ORIGDST))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_REPLSRC) {
                if (!ct || FWINV((ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip&sinfo->sipmsk[IP_CT_DIR_REPLY].s_addr) != sinfo->tuple[IP_CT_DIR_REPLY].src.ip, XT_CONNTRACK_REPLSRC))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_REPLDST) {
                if (!ct || FWINV((ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip&sinfo->dipmsk[IP_CT_DIR_REPLY].s_addr) != sinfo->tuple[IP_CT_DIR_REPLY].dst.ip, XT_CONNTRACK_REPLDST))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_STATUS) {
                if (!ct || FWINV((ct->status & sinfo->statusmask) == 0, XT_CONNTRACK_STATUS))
                        return 0;
        }

        if(sinfo->flags & XT_CONNTRACK_EXPIRES) {
                unsigned long expires;

                if(!ct)
                        return 0;

                expires = timer_pending(&ct->timeout) ? (ct->timeout.expires - jiffies)/HZ : 0;

                if (FWINV(!(expires >= sinfo->expires_min && expires <= sinfo->expires_max), XT_CONNTRACK_EXPIRES))
                        return 0;
        }

        return 1;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP