免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 22602 | 回复: 82
打印 上一主题 下一主题

[网络子系统] linux 协议栈 IP头 手动封装 [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
1 [报告]
发表于 2009-08-19 11:41 |只看该作者
可以的话,把你封装IP头的代码贴出来一部分看一下。

论坛徽章:
0
2 [报告]
发表于 2009-08-19 15:29 |只看该作者
原帖由 Godbach 于 2009-8-19 11:41 发表
可以的话,把你封装IP头的代码贴出来一部分看一下。


//在协议栈NF_IP_POST_ROUTING的hook处,放了一个封装自己ip头的程序,是数据变为ipip协议进行发送
static unsigned int packet_encapsulation(unsigned int hook, struct sk_buff **pskb, const struct net_device *indev, const struct net_device *outdev, int(* okfn)(struct sk_buff *))
{
        struct sk_buff *skb = NULL;
        struct iphdr *hdr = NULL;
        struct iphdr *iph = NULL;
      
        skb=*pskb;
        hdr=skb->nh.iph;

                skb_reserve(skb,skb->nh.iph->ihl* 4);//data,tail同时往后移20个字节
                skb->h.raw = skb->nh.raw;//使h.raw指向nh.raw位置
                skb->nh.raw = skb_push(skb, sizeof(struct iphdr));//将data指针上移20个字节,用于填充自己的ip时使用

                iph                   =       skb->nh.iph;
                iph->version    =       hdr->version;
                iph->ihl            =       hdr->ihl;
                iph->tos           =       hdr->tos;
                iph->tot_len    =       htons(ntohs(hdr->tot_len) + skb->nh.iph->ihl* 4);
                iph->id             =       hdr->id;
                iph->frag_off   =       hdr->frag_off;
                iph->ttl            =       hdr->ttl;
                iph->protocol   =       IPPROTO_IPIP;//ipip协议号
                iph->daddr       =       dst;//自己制定的ip地址
                iph->saddr       =       src;//自己制定的ip地址
                iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
return NF_ACCEPT;

}

这是我程序大致的关键一部分,现在,我在tcpdump出来的包,只有一个ip头,而且这还是我自己定义的那个头,以前的ip头竟然不见啦,我的老天呀,怎么会这样,我也没清空呀也没丢弃呀,咋会这样的?
“Godbach”帮我看看,好嘛,不知道 是不是还有什么地方没想到,或是错啦。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-08-19 15:37 |只看该作者
              iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);


首先看一下校验和,iph->check初始化的值为0吗?
              iph->check = 0;
  iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);


这样安全一些

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2009-08-19 15:39 |只看该作者
另外,既然你的IP头是参考原先的赋值,不如直接memcpy包原先的IP头考到当前的IP头空间,然后根据你的需要,修改对应的成员即可。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2009-08-19 15:44 |只看该作者
还有,取skb的IP头的时候,只要确定报文是在网络层,相比较
        hdr=skb->nh.iph;

个人更习惯用
       hdr=skb->data;

论坛徽章:
0
6 [报告]
发表于 2009-08-19 15:45 |只看该作者
原帖由 Godbach 于 2009-8-19 15:44 发表
还有,取skb的IP头的时候,只要确定报文是在网络层,相比较

个人更习惯用

确实。  skb->nh.iph  觉得有些不稳定

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2009-08-19 15:48 |只看该作者
原帖由 故哈 于 2009-8-19 15:45 发表

确实。  skb->nh.iph  觉得有些不稳定


基本上没用这样的方式取iphdr,不过如果报文在网络层的话,我觉得应该还可以。

论坛徽章:
0
8 [报告]
发表于 2009-08-19 16:33 |只看该作者
原帖由 Godbach 于 2009-8-19 15:37 发表


首先看一下校验和,iph->check初始化的值为0吗?


这样安全一些



iph->check=0;
修改了,是稳妥,但是,还是有封包错误。

论坛徽章:
0
9 [报告]
发表于 2009-08-19 16:36 |只看该作者
原帖由 Godbach 于 2009-8-19 15:39 发表
另外,既然你的IP头是参考原先的赋值,不如直接memcpy包原先的IP头考到当前的IP头空间,然后根据你的需要,修改对应的成员即可。



memcpy,之后,还是封包有问题。
奇怪的是,本应该实现效果该是多了以个自己封的IP包头,但是,我用tcpdump抓获后,只有一个ip头,还是我刚修改过的ip头,原来的ip头不知道飞哪去了。很奇怪的?

论坛徽章:
0
10 [报告]
发表于 2009-08-19 16:36 |只看该作者
原帖由 Godbach 于 2009-8-19 15:48 发表


基本上没用这样的方式取iphdr,不过如果报文在网络层的话,我觉得应该还可以。

我碰到过取出来的是错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP