studying network stack under kernel 2.6 (01)

在阅读《利用Module修改Linux TCP/IP Kernel》的时候的笔记。
1. 基本的修改方法:

预先在需要修改的内核代码部分插入简单的代码(HOOK),比如在源文件中加入一个全局的函数指针变量,在代码中加入判断语句,如果该函数指针不为空,则执行之,否则忽略。

然后重新编译,安装内核。

真正的实现部分放在了kernel module的编写上。需要实现一个函数,并把它的地址赋给前面所声明的全局的函数指针变量。

2. 实例1

修改kernel,使得kernel可以在每发出一个packet后,都能在/var/log/messages中产生一条log记录;

涉及到的源文件:net/core/dev.c中的dev_queue_xmit(struct sk_buff *skb);

我们可以在该函数的最开始阶段就加入HOOK代码,

if(hook_func_pointer){ hook_func_pointer;}

然后,需要编写一个kernel module来实现这个hook_func_pointer的功能,这个很简单了.

3. 实例2

利用IP层的Module来修改输出packet的IP header的内容;

IP header的字段可以从网上查到。因为它的绝大多数字段都有实际的用途,如果修改不当的话,可能会造成网络功能的不正常。这里要对TOS字段下手,type of service它可以使得packet具有更高的优先权;修改它应该不会有什么大问题。现在默认的包的TOS为BE,我们想改成EF或者AF。EF>AF>BE. 这个要看路由器是否支持TOS,所以影响不大。

涉及到的文件和位置:ip packet在发送出去的时候所涉及到的函数是ip_finish_output(struct sk_buff *skb).它在net/ipv4/ip_output.c中。照例插入HOOK

实现kernel module: 代码如下

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

#include <linux/skbuff.h>
#include <linux/ip.h>
#include <net/ip.h>

extern int (*eefunc02)(struct sk_buff*);

int change_TOS(struct sk_buff *skb)
{
struct iphdr *iph = skb->nh.iph;

if(iph) {
iph->tos = 0xef;
ip_send_check(skb->nh.iph);
}
return 0;
}

static int __init eeFunc_init(void)
{
eefunc02 = change_TOS;
printk("\\n---module init--\\n");
return 0;
}

static void __exit eeFunc_exit(void)
{
eefunc02 = 0;
printk("\\n--module exit--\\n");
}

module_init(eeFunc_init);
module_exit(eeFunc_exit);

MODULE_LICENSE("GPL");

接着的改进:只修改TCP的ACK包的tos值,书上将其修改为0xb8,说是对应EF.

int change_ack_TOS(struct sk_buff *skb)
{
struct iphdr *iph = skb->nh.iph;
struct tcphdr *th;

if(iph->protocol == IPPROTO_TCP) {
skb->h.raw = (unsigned char *)(skb->nh.raw + iph->ihl*4);
th = skb->h.th;
}

if((tcp_flag_word(th) &amp; TCP_FLAG_ACK)) {
skb->nh.iph->tos = 0xB8;
ip_send_check(skb->nh.iph);
}
return 0;
}
Advertisements
studying network stack under kernel 2.6 (01)

2 thoughts on “studying network stack under kernel 2.6 (01)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s