godbach兄弟及各位大牛帮忙看个netfilter加hook不能连接FTP服务器的问题。
先放代码
- int function1(struct sk_buff *pskb)
- {
- int max_headroom;
- struct iphdr *iph;
- struct sk_buff *skb = pskb;
- struct tcphdr *tcphdr = NULL;
- int iph_len = 0;
- unsigned short wBakCheck = 0;
- u32 dwCSum = 0;
- max_headroom = sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(struct gtpuhdr);
- iph = ip_hdr(skb); //2.6.18为 iph = skb->nh.iph;
- if (iph->protocol == IPPROTO_TCP)
- {
- tcphdr = (struct tcphdr *)(skb->data + iph->ihl * 4);
- iph_len = ip_hdrlen(skb);
- wBakCheck = tcphdr->check;
- tcphdr->check = 0;
- dwCSum = skb->csum;
- skb->csum = csum_partial((unsigned char *)tcphdr, ntohs(iph->tot_len) - iph_len, 0);
- tcphdr->check = csum_tcpudp_magic(iph->saddr,
- iph->daddr,
- ntohs(iph->tot_len) - iph_len,
- iph->protocol,
- skb->csum);
- skb->csum = dwCSum;
- }
- }
复制代码
//以下是加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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这段代码只是重新进行了 re-checksum
所以我怀疑还是这里出的问题
从你的代码看,没有找到针对 IP 层的 re-chksum
你不妨用 wireshark 抓包看一下,如果发现 chksum 有问题,wireshark 那个抓包软件会立即用红色标注的
2 楼兄弟厉害,抓包确实显示的是chksum 有问题,颜色是红色。
那请问怎么改呢?
还有为什么上面的代码在18内核下就能运行正确呢?
回复 3# 5311
如果你的修改确实涉及到了 IP 头部,那就需要重新计算 IP 的校验和。内核中是有 API 可以调用的,应该是 ip_fast_csum
回复 1# 5311
2.6.18 和 2.6.28 这两个版本之间,hook 点的宏定义发生了变化,你检查一下你的使用是否正确
hook点的钩子函数原型是发生了变化,这个我已经改过了。
回复 6# 5311
hook 点的宏定义你没有修改
2.6.25 以后是这样的
从效果上,不改可能也没关系,因为其对应的值没有变化。
但是从兼容性上来讲,还是应该使用新版本的