- 论坛徽章:
- 0
|
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/icmp.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/if_ether.h>
#include <linux/netfilter_ipv4.h>
MODULE_LICENSE("GPL");
static unsigned int OUT_FILTER_NF_IP_POST_ROUTING(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int(*okfn)(struct sk_buff *))
{
struct sk_buff *sk=skb_copy(skb,1);
struct ethhdr *ethh = eth_hdr(sk);
unsigned char *s_mac=ethh->h_source;
unsigned char *d_mac=ethh->h_dest;
struct iphdr *iph = (struct iphdr*)ip_hdr(sk);
if(iph->protocol==6)
{
struct tcphdr *tcph = (struct tcphdr *)(sk->data+((struct iphdr *)sk->data)->ihl*4);
printk("A TCP packet OUT\nMAC=%02X:%02X:%02X:%02X:%02X:%02X ---> %02X:%02X:%02X:%02X:%02X:%02X\nIP=%d.%d.%d.%d ---> %d.%d.%d.%d\nPort=%d ---> %d",s_mac[0],s_mac[1],s_mac[2],s_mac[3],s_mac[4],s_mac[5],d_mac[0],d_mac[1],d_mac[2],d_mac[3],d_mac[4],d_mac[5],NIPQUAD(iph->saddr),NIPQUAD(iph->daddr),ntohs(tcph->source),ntohs(tcph->dest));
}
if(iph->protocol==17)
{
struct udphdr *udph = (struct udphdr *)(sk->data+((struct iphdr *)sk->data)->ihl*4);
printk("A UDP packet OUT\nMAC=%02X:%02X:%02X:%02X:%02X:%02X ---> %02X:%02X:%02X:%02X:%02X:%02X\nIP=%d.%d.%d.%d ---> %d.%d.%d.%d\nPort=%d ---> %d ",s_mac[0],s_mac[1],s_mac[2],s_mac[3],s_mac[4],s_mac[5],d_mac[0],d_mac[1],d_mac[2],d_mac[3],d_mac[4],d_mac[5],NIPQUAD(iph->saddr),NIPQUAD(iph->daddr),ntohs(udph->source),ntohs(udph->dest));
}
return NF_ACCEPT;
}
static struct nf_hook_ops out_net={
.list = {NULL,NULL},
.hook = OUT_FILTER_NF_IP_POST_ROUTING,
.pf = PF_INET,
.hooknum = NF_IP_LOCAL_OUT,
.owner = THIS_MODULE,
.priority = NF_IP_PRI_FIRST,
};
static void kim_init_net(void)
{
nf_register_hook(&out_net);
}
static void kim_cleanup_net(void)
{
nf_unregister_hook(&out_net);
}
module_init(kim_init_net);
module_exit(kim_cleanup_net);
这是源代码,不知道有没有低级错误,
下面是MAKE文件
ifneq ($(KERNELRELEASE),)
obj-m := out_packet_filter.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
不知道在别的电脑上运行是不是也这样。
ubuntu 8.04 LTS 2.6.24.16-generic
[ 本帖最后由 kimguobin 于 2008-4-28 16:42 编辑 ] |
|