加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核分析 - 网络[七]:NetFilter

发布时间:2016-01-26 04:16:56 所属栏目:Linux 来源:网络整理
导读:内核版本:2.6.34 NetFilter在2.4.x内核中引入,成为linux平台下进行网络应用的主要扩展,不仅包括防火墙的实现 ,还包括报文的处理(如报文加密、报文分类统计等

先以nf_iterate()函数为例,elem->hook()表示执行勾子函数,执行结构为verdict;

unsigned int nf_iterate(……)     
{     
    unsigned int verdict;     


    list_for_each_continue_rcu(*i, head) {     
        struct nf_hook_ops *elem = (struct nf_hook_ops *)*i;     
        if (hook_thresh > elem->priority)     
            continue;
        verdict = elem->hook(hook, skb, indev, outdev, okfn);     
        if (verdict != NF_ACCEPT) {
            if (verdict != NF_REPEAT)
                return verdict;
            *i = (*i)->prev;
        }
    }
    return NF_ACCEPT;     
}

根据nf_iterate()返回,会有以下情况:

1.如果结果为NF_ACCEPT,表示勾子函数允许报文继续向下处理,此时应 该继续执行队列上的下一个勾子函数,因为这些勾子函数都是对同一类报文在相同位置的过滤,前一个通后,并不能返回,而要 所有函数都执行完,结果仍为NF_ACCEPT时,则可返回它;

2.如果结果为NF_REPEAT,表示要重复执行勾子函数一次;所以勾 子函数要编写得当,否则报文会一直执行一个返回NF_REPEAET的勾子函数,当返回值为NF_REPEAT时,不会返回;

3.如果为其 它结果,则不必再执行队列上的其它函数,直接返回它;如NF_STOP表示停止执行队列上的勾子函数,直接返回;NF_DROP表示丢 弃掉报文;NF_STOLEN表示报文不再往上传递,与NF_DROP不同的是,它没有调用kfree_skb()释放掉skb;NF_QUEUE检查给定协议 (pf)是否有队列处理函数,有则进行处理,否则丢掉。

了解了这些值再来看nf_hook_slow()中对于nf_iterate()返回值的处 理就明了了:

if (verdict == NF_ACCEPT || verdict == NF_STOP) {     
    ret = 1;     
} else if (verdict == NF_DROP) {     
    kfree_skb(skb);     
    ret = -EPERM;     
} else if ((verdict & NF_VERDICT_MASK) == NF_QUEUE) {     
    if (!nf_queue(skb, elem, pf, hook, indev, outdev, okfn,     
             verdict >> NF_VERDICT_BITS))     
        goto next_hook;     
}

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!