+ -
当前位置:首页 → 问答吧 → NETFILTER拦截修改数据包后的MTU问题

NETFILTER拦截修改数据包后的MTU问题

时间:2010-09-21

来源:互联网

本帖最后由 destinywangyh 于 2010-09-21 00:51 编辑

小弟最近在做一个LINUX下的局域网加密系统,用NETFILTER拦截数据包并用LIBIPQ发到用户空间加密/解密再返回,进出本机各定义了两个HOOK如下:
  1. int init_module()
  2. {
  3.        pr_info("i'm now in the kernel space!\n");

  4.        nfho.hook      = hook_func;
  5.        nfho.hooknum   = NF_INET_LOCAL_IN;
  6.        nfho.pf        = PF_INET;
  7.        nfho.priority  = NF_IP_PRI_MANGLE;
  8.        nfho.owner     = THIS_MODULE;
  9.   
  10.        nf_register_hook(&nfho);

  11.        nfhoo.hook      = hook_funco;
  12.        nfhoo.hooknum   = NF_INET_LOCAL_OUT;
  13.        nfhoo.pf        = PF_INET;
  14.        nfhoo.priority  = NF_IP_PRI_MANGLE;
  15.        nfhoo.owner     = THIS_MODULE;
  16.   
  17.        nf_register_hook(&nfhoo);

  18.        return 0;
  19. }
复制代码
用户空间处理完后用ret = ipq_set_verdict(h, ipq_packet->packet_id, NF_ACCEPT, dl,tt);返回给内核空间,dl是处理后的数据包长度,tt是放修改后数据包的缓冲区.



发送接收单个小于1500的包,这样是可以成功加密通信的,但如果包大小原来已经是1500,经过加密后多了30个字节,包就因为比MTU大而发不出去.我看过WINDOWS下类似系统的实现,那里是在PtRequestComplete函数中写入:
  1. if(Oid == OLD_GEN_MAXIMUM_FRAME_SIZE)
  2.     *(PULONG)NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer=1350;
复制代码
把分片大小改成1350.

请问LINUX下有没有类似的方法去可以改变发出去的包的分片大小?只要能规定分片不大于1350,我加密后的包也就不会超过MTU了.









另外一个思路是在分片之前加密,在重组之后解密,但应该如何HOOK才能让非分片包进入到用户空间?根据这里所说,我上面的两个HOOK处理的应该都是非分片包,我在HOOK FUNCTION中写上:
  1. unsigned int hook_func(unsigned int hooknum,
  2.                        struct sk_buff *skb,
  3.                        const struct net_device *in,
  4.                        const struct net_device *out,
  5.                        int (*okfn)(struct sk_buff *))
  6. {       skb_linearize(skb);
  7.         return NF_QUEUE;}
复制代码
使用PING X.X.X.X -S 2000测试时的确可以在用户空间截到2000大小的包,经过加密也能正常传输,但测试传输文件(TCP协议)时所截的包却还是不超过1500,加密到1530再发就不成功了....

作者: destinywangyh   发布时间: 2010-09-21

QUEUE 数据包到用户空间,本可以不用写 hook 的,用 iptables 就可以实现。

作者: Godbach   发布时间: 2010-09-21

热门下载

更多