Netfilter程序死机

发布于 2022-10-15 08:18:50 字数 5092 浏览 20 评论 0

各位大侠,今天测试一个小程序,测试环境为debian,内核版本为2.6.32-5-686。挂载在NF_INET_LOCAL_OUT挂接点上总是出现死机现象,推断问题在于csum_partial函数,由于小弟对内核还不熟,网络协议栈比较庞大,希望得到高手的指点!
#include <linux/init.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/socket.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/inet.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <linux/if_ether.h>
#include <linux/string.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("fqb");
static struct nf_hook_ops nfho;

unsigned int window(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 *skb;
        struct iphdr *iph;
        struct tcphdr *tcph;
        int tot_len;
        int iph_len;
        int tcph_len;

        skb = __skb;
        if(skb == NULL)
                return NF_ACCEPT;

        iph = ip_hdr(skb);
        if(iph == NULL)
                return NF_ACCEPT;

        tot_len = ntohs(iph->tot_len);
        iph_len = ip_hdrlen(skb);

        if(iph->protocol == IPPROTO_TCP)
        {
                skb_pull(skb,iph_len);
                skb_reset_transport_header(skb);
                tcph = tcp_hdr(skb);
                tcph_len = tcp_hdrlen(skb);
                printk("The origin window = %d\n",ntohs(tcph->window));
                tcph->window = htons(ntohs(tcph->window) >> 3);
                printk("The adjusted window = %u\n",ntohs(tcph->window));
                tcph->check = 0;
                skb->csum = csum_partial((unsigned char *)tcph, tot_len - iph_len,0);
                tcph->check = csum_tcpudp_magic(iph->saddr,
                                iph->daddr,
                                ntohs(iph->tot_len) - iph_len,iph->protocol,
                                skb->csum);
                iph->check = 0;
                iph->check = ip_fast_csum(iph,iph->ihl);
                skb_push(skb,iph_len);
                skb_reset_network_header(skb);
                return NF_ACCEPT;
        }
        return NF_ACCEPT;
}

static int __init modify_init(void)
{
        int ret;
        nfho.hook = window;
        nfho.pf = AF_INET;
        nfho.hooknum = NF_INET_LOCAL_OUT;
        nfho.priority = NF_IP_PRI_FIRST;

        ret = nf_register_hook(&nfho);
        if(ret < 0)
        {
                printk("%s\n", "can't modify skb hook!");
                return ret;
        }
        return 0;
}

static void modify_exit(void)
{
        nf_unregister_hook(&nfho);
}

module_init(modify_init);
module_exit(modify_exit);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蓝色星空 2022-10-22 08:18:50

struct sk_buff *__skb,   ==> 這應該兩個"*"吧,然後 skb = *__skb;

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文