godbach兄弟及各位大牛帮忙看个netfilter加hook不能连接FTP服务器的问题。

发布于 2022-10-15 04:27:12 字数 3037 浏览 21 评论 0

先放代码

  1. int function1(struct sk_buff *pskb)
  2. {
  3.     int             max_headroom;
  4.     struct iphdr   *iph;
  5.     struct sk_buff *skb     = pskb;   
  6.     struct tcphdr  *tcphdr  = NULL;
  7.     int             iph_len = 0;
  8.     unsigned short  wBakCheck = 0;
  9.     u32             dwCSum = 0;
  10.     max_headroom = sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(struct gtpuhdr);
  11.     iph = ip_hdr(skb);      //2.6.18为 iph = skb->nh.iph;
  12.     if (iph->protocol  == IPPROTO_TCP)
  13.     {
  14.         tcphdr = (struct tcphdr *)(skb->data + iph->ihl * 4);      
  15.         
  16.         iph_len = ip_hdrlen(skb);
  17.         wBakCheck = tcphdr->check;
  18.         tcphdr->check = 0;
  19.         dwCSum = skb->csum;
  20.         
  21.         skb->csum = csum_partial((unsigned char *)tcphdr, ntohs(iph->tot_len) - iph_len, 0);
  22.         tcphdr->check  = csum_tcpudp_magic(iph->saddr,
  23.                         iph->daddr,
  24.                         ntohs(iph->tot_len) - iph_len,
  25.                         iph->protocol,
  26.                         skb->csum);
  27.         skb->csum = dwCSum;
  28.     }
  29. }

复制代码

//以下是加HOOK的代码

static struct nf_hook_ops   gglocal_ops =
{
        .hook = gg_localout,
        .pf = PF_INET,
        .hooknum = NF_IP_LOCAL_OUT,
        .priority = NF_IP_PRI_RAW,
};

上面这段代码是我写的模块中的一段代码。

现在发现加入模块后运行可以ping通,但不能连接FTP服务器,请问上面那段代码有什么问题。

备注:项目是将一个以前在2.6.18内核下跑的模块移植到2.6.28下,在18内核下代码运行没有问题,在28下会出现上述情况,请大家帮帮忙,多谢!

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

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

发布评论

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

评论(6

北城挽邺 2022-10-22 04:27:12

这段代码只是重新进行了 re-checksum
所以我怀疑还是这里出的问题

从你的代码看,没有找到针对 IP 层的 re-chksum
你不妨用 wireshark 抓包看一下,如果发现 chksum 有问题,wireshark 那个抓包软件会立即用红色标注的

离线来电— 2022-10-22 04:27:12

2 楼兄弟厉害,抓包确实显示的是chksum 有问题,颜色是红色。

那请问怎么改呢?

还有为什么上面的代码在18内核下就能运行正确呢?

无声无音无过去 2022-10-22 04:27:12

回复 3# 5311
如果你的修改确实涉及到了 IP 头部,那就需要重新计算 IP 的校验和。内核中是有 API 可以调用的,应该是 ip_fast_csum

擦肩而过的背影 2022-10-22 04:27:12

回复 1# 5311

备注:项目是将一个以前在2.6.18内核下跑的模块移植到2.6.28下,在18内核下代码运行没有问题,在28下会出现上述情况,请大家帮帮忙,多谢!

2.6.18 和 2.6.28 这两个版本之间,hook 点的宏定义发生了变化,你检查一下你的使用是否正确

莫言歌 2022-10-22 04:27:12

hook点的钩子函数原型是发生了变化,这个我已经改过了。

挽清梦 2022-10-22 04:27:12

回复 6# 5311

hook 点的宏定义你没有修改
2.6.25 以后是这样的

enum nf_inet_hooks {
        NF_INET_PRE_ROUTING,
        NF_INET_LOCAL_IN,
        NF_INET_FORWARD,
        NF_INET_LOCAL_OUT,
        NF_INET_POST_ROUTING,
        NF_INET_NUMHOOKS
};

从效果上,不改可能也没关系,因为其对应的值没有变化。

但是从兼容性上来讲,还是应该使用新版本的

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