热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

Linux下的网络HOOK实现以及使用方法

来源: 作者: 时间:2007-03-16 Tag: 点击:

最近疯狂的研究Linux的种种功能,也颇有心得,这里讲述一下Linux下的Net的Hook,使用net的Hook可以实现很多很多非常底层的功能,比如过滤报文,做防火墙,做代理等等。

Now,Let's Go!

使用的是Linux 2.6.19.1的内核代码。

首先是 在./Source/net/netfilter/core.c文件中的函数 nf_register_hook:

static DEFINE_SPINLOCK(nf_hook_lock);

int nf_register_hook(struct nf_hook_ops *reg)

{

struct list_head *i;

spin_lock_bh(&nf_hook_lock);

list_for_each(i, &nf_hooks[reg->pf][reg->hooknum]) {

if (reg->priority < ((struct nf_hook_ops *)i)->priority)

break;

}

list_add_rcu(®->list, i->prev);

spin_unlock_bh(&nf_hook_lock);

synchronize_net();

return 0;

}

EXPORT_SYMBOL(nf_register_hook);

void nf_unregister_hook(struct nf_hook_ops *reg)

{

spin_lock_bh(&nf_hook_lock);

list_del_rcu(®->list);

spin_unlock_bh(&nf_hook_lock);

synchronize_net();

}

EXPORT_SYMBOL(nf_unregister_hook);

int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n)

{

unsigned int i;

int err = 0;

for (i = 0; i < n; i++) {

err = nf_register_hook(®[i]);

if (err)

goto err;

}

return err;

err:

if (i > 0)

nf_unregister_hooks(reg, i);

return err;

}

EXPORT_SYMBOL(nf_register_hooks);

void nf_unregister_hooks(struct nf_hook_ops *reg, unsigned int n)

{

unsigned int i;

for (i = 0; i < n; i++)

nf_unregister_hook(®[i]);

}

EXPORT_SYMBOL(nf_unregister_hooks);

上面分别是四个函数:

nf_register_hook,nf_unregister_hook,nf_register_hooks,nf_unregister_hooks.

功能是注册Hooks函数

输入的参数是struct nf_hook_ops *reg。

下面让我们看一个验证ARP报文的Hook代码,以表示我们如何使用Hook函数实现这种功能。

unsigned int arphook_snd(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in, const struct net_device *out,int (*okfn)(struct sk_buff*))

{

struct arphdr *arp;

struct net_device *dev;

unsigned char * arp_ptr;

unsigned char *sha, *tha;

u32 sip,tip;

unsigned short arpop;

unsigned int status=NF_DROP;

dev=(*skb)->dev;

arp = (*skb)->nh.arph;

arp_ptr= (unsigned char *)(arp+1);

sha = arp_ptr;

arp_ptr += dev->addr_len;

memcpy(&sip, arp_ptr, 4);

arp_ptr += 4;

tha = arp_ptr;

arp_ptr += dev->addr_len;

memcpy(&tip, arp_ptr, 4);

arpop=ntohs(arp->ar_op);

if(!check_ip(&tip,WABLOCK)) /*check block list*/

{

if(arpop==1) /*sending ARP request*/

{

if(!check_ip(&tip,WAARP)) /*if not in list add it*/

add_ip(&tip,WAARP);

}

status=NF_ACCEPT;

}

return(status);

}



相关文章:
eG Citrix 监控器
Ethernet的帧格式和结构
华为(Quidway AR18-22-24)路由器配置实例
简单利用路由黑洞解决DDOS流量攻击
我的linux试验题目
如何在HMC上激活网络时间协议NTP
Resin泛解析 - 三级域名最优应用方案
Resin多域名绑定 + 泛解析
resin 负载均衡
linksys wap54g 设置注意事项
acegi RememberMe&退出&匿名登陆
vnd命令~
LINUX网卡绑定
TCP包首部
IP包首部格式
指纹锁也不靠谱 电脑“破解”六大事件!
linux配置网关
使用 SCTP 优化网络
IPv4/IPv6过渡技术和方案分析
用三个源码包libnet、libnids、libpcap轻松搭建Li
Extensible Messaging and Presence Protocol (XM
组建CISCO多层交换网络入门
CISCO多层交换机的初始配置和排错
实施和配置VLAN
理解和配置802.1Q/802.1S和802.1W生成树协议
理解和配置cisco特定的生成树协议特性和STP排错
配置第二层和第三层的特性
理解和配置VLAN间的路由选择
理解和配置多层交换
理解和配置cisco多层交换网络中的服务质量