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

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

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

NetFilter调用

在报文在内核协议栈传递时,会调用NetFilter模块对报文进行特定的进滤,这样的过滤在代码中随处可见。

以上一篇讲过的网桥为例,对于要进行网桥处理的报文,handle_bridge()->br_handle_frame(),如果端口处理于LEARNING 或FORWARDING状态,且报文目的地址正确,则会调用br_handle_frame()进行后续处理,而这个函数调用就是:

NF_HOOK (PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,

br_handle_frame_finish);

NF_HOOK()- >NF_HOOK_THRESH()->nf_hook_thresh()->nf_hook_slow():

int nf_hook_slow(u_int8_t pf, unsigned 

int hook, struct sk_buff *skb,     
         struct net_device *indev,     
         struct net_device *outdev,     
         int (*okfn)(struct sk_buff *),     
         int hook_thresh)     
{     
    struct list_head *elem;     
    unsigned int verdict;     
    int ret = 0;     


    /* We may already have this, but read-locks nest anyway */ 
    rcu_read_lock();     


    elem = &nf_hooks[pf][hook];     
next_hook:     
    verdict = nf_iterate(&nf_hooks[pf][hook], skb, hook, indev,     
                 outdev, &elem, okfn, hook_thresh);     
    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;     
    }     
    rcu_read_unlock();     
    return ret;     
}

nf_hook_slow()从nf_hooks中找出到执行的勾子队列,依次执行,然后根据返回值决定是否继续(由nf_iterate()完 成)。参数中的pf和hook代表了注册勾子函数时给的参数PF和HOOKNUM,它们共同决定勾子函数要插入的nf_hook的哪个队列中。

作为过滤报文的勾子函数的返回值是值得注意的地方,可取值如下:

#define NF_DROP 0     
#define NF_ACCEPT 1     
#define NF_STOLEN 2     
#define NF_QUEUE 3     
#define NF_REPEAT 4     
#define NF_STOP 5

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

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