数据包截获:Netfilter

来源:互联网 发布:unity3d so库 调用 编辑:程序博客网 时间:2024/06/05 09:44

概述


Netfilter 是由内核 2.4.x 和 2.6.x 提供的数据包截获机制,它替代了内核 2.2.x 中 使用的 ipchains、防火墙钩子和其他方法。Netfilter 也可以作为 LKM 获得。


要使用 netfilter,在内核编译时设置 Packet Filtering 选项。


可以对采用防火墙钩子机制的同类应用程序使用 netfilter 机制,这些应用程序有:路由程序、数据包嗅探器和其他位于网络边缘并访问通信流的实体。


回页首


使用 Netfilter


Netfilter 可以在通过 TCP/IP 协议栈的路径中的几个定义良好的点上捕获数据包:


    NF_IP_PRE_ROUTING
    在对数据包进行初始正确性检查(校验和等)后,保存该数据包。
    NF_IP_LOCAL_IN
    如果数据包将要到达本地主机,则捕获该数据包。
    NF_IP_FORWARD
    如果数据包将要到达某些其他主机,则捕获该数据包。
    NF_IP_LOCAL_OUT
    在本地捕获其目的地是外部的已创建的数据包。
    NF_IP_POST_ROUTING
    这是最后的钩子,在此之后将传输数据包。


当数据包穿过 TCP/IP 协议栈后,协议调用带有数据包和钩子号的 netfilter 框架。钩子也 可以指派优先级。


函数的返回值包括:


    NF_ACCEPT
    数据包继续在正常的 TCP/IP 路径上传输。
    NF_DROP
    丢弃数据包;不进一步处理。
    NF_STOLEN
    已获得数据包;不进一步处理。
    NF_QUEUE
    对数据包排队(通常用于用户空间处理)。
    NF_REPEAT
    再次触发这个钩子。


回页首


步骤


Netfilter 的工作方式与防火墙钩子非常相似。作为 LKM 注册到内核的结构 调用特定于进程的函数。任何基于 netfilter 的数据包拦截器都必须遵循开发 LKM 所采 用的步骤。


回页首


特定于进程的函数


特定于进程的函数(或钩子)的原型如下所示:


   static unsigned int packet_interceptor_hook(unsigned int hook, struct
   sk_buff **pskb,


   const struct net_device *indev, const struct net_device *outdev, int


   (*okfn) (struct sk_buff *))




您可以将字段定义为:


    hook
    您感兴趣的钩子的编号;例如 NF_IP_LOCAL_OUT、NF_IP_LOCAL_IN、NF_IP_ FORWARD 等。
    **pskb
    指向 TCP/IP 协议栈中数据包容器的指针;例如 sk_buff。
    *indev & *outdev
    指向流入和流出网络设备的设备结构的指针。在内核中注册的每种设备(例如,以太网卡)都 有一个由 IRQ、IO 地址等组成的设备结构。当机器只有一个网络接口来处理流入和流出流量时,这两个结构是相同的。当流入和流出的流量由两种设备处理时,这两种结构是 不同的。
    (*okfn) (struct sk_buff *)
    在激活钩子时调用该函数。


回页首


netfilter 结构


核心 netfilter 结构在 /usr/src/include/linux/netfilter.h 中定义,类似如下:


struct nf_hook_ops
{
         struct list_head list;


         
         nf_hookfn *hook;
         int pf;
         int hooknum;
         
         int priority;
};




参数是:


    list
    Netfilter 本身是一个钩子链;它指向 netfilter 钩子的头部,通常设置为 { NULL, NULL }。
    hook
    该函数在数据包碰到钩子点时被调用。该函数与前面描述的函数相同,它必须返回 NF_ACCEPT、NF_DROP 或 NF_QUEUE。如 果返回 NF_ACCEPT,则下一个钩子将被附加到将要调用的点。如 果返回 NF_DROP,则数据包被丢弃。如果返回 NF_QUEUE,则对数据包进行排队。sk_buff 指针被传递到该函数中,并用数据包信息如 IP 报头、TCP 报头等进 行填充。您可以使用 sk_buff 结构指针来操作或删除数据包(要删除数据包,只需将 skb 指 针设置为空即可)。
    pf
    协议簇;例如,适用于 IPv4 的 PF_INET。
    hooknum
    您感兴趣的钩子号;例如 NF_IP_LOCAL_IN 等。


回页首


内核注册


在 LKM 的 init_module 函数中,需要注册在内核中填充的结构:


int nf_register_hook(struct nf_hook_ops *req);




这里,nf_hook_ops 是 netfilter 操作结构。


一旦该结构注册到内核中,Linux 将调用这里定义的函数来处理数据包。


回页首


取消注册 netfilter 结构


卸载 LKM 时,netfilter 结构需要从内核中取消注册。这一操作在 cleanup_module 函数中完成:


void nf_unregister_hook(struct nf_hook_ops *req);




nf_hook_ops 也是 netfilter 操作结构。

http://blog.csdn.net/wswifth/article/details/5115358

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新商盟手机订烟登录密码忘了怎么办 手机版战神斯巴达幽灵经常崩怎么办 代购买的东西被海关扣了怎么办 托朋友代购给了钱联系不上人怎么办 签了合同被加盟商骗了怎么办 百度云盘下载时本地空间不足怎么办 百度云盘隐私空间没密码忘了怎么办 华为云空间的帐号密码忘记了怎么办 快递被快递公司弄丢了怎么办 快递到了人不在那个地方了怎么办 微信被骗了1千多怎么办 客户货已经用啦要求退款退货怎么办 网购收到别人退货的东西怎么办 好省输入订单编号查不到订单怎么办 快递没有当面验收后发现损坏怎么办 支付宝电脑付款风控异常怎么办 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办 注册公司云证书申请成功后怎么办 淘宝购物卖家迟迟不发货怎么办 淘宝直播顾客加购物车不下单怎么办 东方航空联程机票航班延误怎么办 别别人伸请更换手机绑定qq怎么办 绑定手机号的扣扣忘记密码怎么办 微信公众号个人主体变更公司怎么办 微信号注册成订阅号了怎么办 微信开通了企鹅影院会员怎么办 注销公众号对公账号填写错误怎么办 国外邮的东西在北京扣了手续怎么办 微信购物商城买的东西不发货怎么办 魅族手机电话图标没有了怎么办 新商盟网页新商盟网页打不开怎么办 京东商城购物车装满了怎么办