免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 我写的高性能,简化的SYNCOOKIE实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-13 18:45 |只看该作者 |倒序浏览
本帖最后由 Au_Hank 于 2013-03-27 20:39 编辑

在2.6.20-18下测试通过
光测试了产生COOKIE加密算法,效率是原来的50倍左右,整体性能应该提高更多.只是我失业在家,没有测试环境,有没有哪个筒子帮忙做一下性能测试?
还有请探讨一下我这样产生COOKIE是不是足够安全?如果我自己的算法不够安全的话,我还写了一个由md5来实现,产生cookie
只比原来SHA1方式快了3-5倍.

使用方法:
1:将我的文件覆盖原来的syncookie.c文件
2:编译kernel,请选择支持syncookie
3:echo n >/proc/sys/net/ipv4/tcp_syncookie
当n=1,用原来的SYNCOOKIE, 如果n>1,用我的方法. n代表经过多少秒产生新的密码,请选择300以上以降低产生新的密码的
花销

有什么建议,请和我联系,谢谢了

[ 本帖最后由 Au_Hank 于 2007-9-18 09:36 编辑 ]

syncookies.zip

4.13 KB, 下载次数: 320

论坛徽章:
0
2 [报告]
发表于 2007-09-13 19:07 |只看该作者

原理

就是用我的new_secure_tcp_syn_cookie()替代原来的secure_tcp_syn_cookie()来产生
cookie,并且也用它来检测ack包.

不知道我的算法是否有重大的安全问题?如果密码比较容易被猜测出来的话,我们可以选择缩短更新密码时间...

//Hank
static __u32 new_secure_tcp_syn_cookie(__be32 saddr, __be32 daddr, __be16 sport, __be16 dport, __u32 sseq)
{
        __u32 isn;

//printk("in new_secure_tcp_syn_cookie, saddr=%u, daddr=%u, sport=%u, dport=%u, sseq=%u\n", saddr, daddr, sport, dport, sseq);

        isn=new_syncookie_secret[*(unsigned char *)&saddr];
//printk("isn=%u saddr0=%d ", isn, *(unsigned char *)&saddr);
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&saddr+1) ^ *(unsigned char *)&isn];
//printk("%u saddr1=%d ", isn, *((unsigned char *)&saddr+1));
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&saddr+2) ^ *(unsigned char *)&isn];
//printk("%u saddr2=%d ", isn, *((unsigned char *)&saddr+2));
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&saddr+3) ^ *(unsigned char *)&isn];
//printk("%u saddr3=%d ", isn, *((unsigned char *)&saddr+3));

        isn=isn ^ new_syncookie_secret[*(unsigned char *)&daddr   ^ *(unsigned char *)&isn];
//printk("%u daddr0=%d ", isn, *(unsigned char *)&daddr);
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&daddr+1) ^ *(unsigned char *)&isn];
//printk("%u daddr1=%d ", isn, *((unsigned char *)&daddr+1));
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&daddr+2) ^ *(unsigned char *)&isn];
//printk("%u daddr2=%d ", isn, *((unsigned char *)&daddr+2));
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&daddr+3) ^ *(unsigned char *)&isn];
//printk("%u daddr3=%d ", isn, *((unsigned char *)&daddr+3));

        isn=isn ^ new_syncookie_secret[*(unsigned char *)&sport   ^ *(unsigned char *)&isn];
//printk("%u sport0=%d ", isn, *(unsigned char *)&sport);
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&sport+1) ^ *(unsigned char *)&isn];
//printk("%u sport1=%d ", isn, *((unsigned char *)&sport+1));

        isn=isn ^ new_syncookie_secret[*(unsigned char *)&dport   ^ *(unsigned char *)&isn];
//printk("%u dport0=%d ", isn, *(unsigned char *)&dport);
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&dport+1) ^ *(unsigned char *)&isn];
//printk("%u dport1=%d ", isn, *((unsigned char *)&dport+1));
        isn=isn ^ new_syncookie_secret[*(unsigned char *)&sseq   ^ *(unsigned char *)&isn];
//printk("%u sseq0=%d ", isn, *(unsigned char *)&sseq);
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&sseq+1) ^ *(unsigned char *)&isn];
//printk("%u sseq1=%d ", isn, *((unsigned char *)&sseq+1));
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&sseq+2) ^ *(unsigned char *)&isn];
//printk("%u sseq2=%d ", isn, *((unsigned char *)&sseq+2));
        isn=isn ^ new_syncookie_secret[*((unsigned char *)&sseq+3) ^ *(unsigned char *)&isn];
//printk("%u sseq3=%d\n", isn, *((unsigned char *)&sseq+3));

        return isn;
}

论坛徽章:
0
3 [报告]
发表于 2007-09-13 19:12 |只看该作者
缺点:

1: 完全忽略了mss以及所有其他的tcp options

2: 密码更新前没有收到ack的合法连接被丢弃(client会傻乎乎的以为连接成功了   )

3: 完全随即产生isn(cookie),没有遵循RFC的定义产生isn.

但是我觉得这些缺点和被DDOS比起来都是小意思,总比完全不能提供服务好

[ 本帖最后由 Au_Hank 于 2007-9-14 07:25 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-09-13 19:35 |只看该作者
在我1.7G P4的笔记本跑的VMWARE上做算法测试,每秒能产生1000万个cookie...

在1000M网上,最多每秒也就不到200万个syn连接, 我觉得我这个简化的算法
可以抵挡很猛烈的攻击

[ 本帖最后由 Au_Hank 于 2007-9-14 07:36 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-09-13 20:31 |只看该作者
我一直没弄懂 syncookie 的工作原理
有人说只能防本机
有人说防护的是整个 tcp 协议栈,当 syn 请求过多队列会满,满了以后后面的主机也会受影响,因此 syncookie 也可以防后面的机器

论坛徽章:
0
6 [报告]
发表于 2007-09-14 07:18 |只看该作者
原帖由 platinum 于 2007-9-13 20:31 发表
我一直没弄懂 syncookie 的工作原理
有人说只能防本机
有人说防护的是整个 tcp 协议栈,当 syn 请求过多队列会满,满了以后后面的主机也会受影响,因此 syncookie 也可以防后面的机器


syncookie 的工作原理就是把CLIENT的SYN包里面的IP,PORT和isn加密在服务器生成的isn里面(server的ISN也就是COOKIE),这样服务器就不用维护半连接,等合法连接送来ACK的时候,对里面的CLIENT的IP,PORT和sequence number(=client的isn+1)进行验证,看看它的ack number(=server的ISN+1)是不是合法, 步骤如下面:

1: client send syn: sequence number=client isn in syn, acknowledgement number=client isn in syn

2: server生成COOKIE(SERVER ISN):
cookie(server isn)=encrypt(client ip, client port, client isn in syn, server ip, server port)

3: server send syn+ack: sequence number=server isn(ie cookie), acknowledgement number=client isn in syn+1

4: client send ack: sequence number=server acknowledgement number=client isn in syn+1
                              acknowledgement number=server sequence number+1=server isn+1(ie cookie+1)

5: server验证ACK连接:
按照原来的参数计算COOKIE, 如果ACK合法,NEW COOKIE应该=旧cookie
new cookie=encrypt(client ip, client port, client sequence number in ack -1, server ip, server port)
if (new cookie == client acknowledgement number -1) //注意client acknowledgement number -1就是旧cookie
then
        ack 是合法的
else
        ack 非法


但是服务器要计算和验证COOKIE,如果太消耗资源的话,就成为另外一个被DOS的缺陷了

syncookie只可以防护本机器,但是稍微做修改就可以成为SYNPROXY,就可以防护背后的机器了.

syncookie是防护整个TCP协议的

[ 本帖最后由 Au_Hank 于 2007-9-14 07:22 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-09-14 07:28 |只看该作者
希望做过测试的朋友告诉我一下效果如何.

最好能和原始的SYNCOOKIE方法做下对比,很简单,

echo 1 >/proc/sys/net/ipv4/tcp_syncookie 就是用原始的SYNCOOKIE

echo n >/proc/sys/net/ipv4/tcp_syncookie就是用我的方法 (n 最好>300)

论坛徽章:
0
8 [报告]
发表于 2007-09-14 07:38 |只看该作者
我这两天有机会测试一下
对了,为什么最好 n > 300 呢?
我看了一下代码,说 n > 1 的时候代表重新计算 isn 的时间周期

论坛徽章:
0
9 [报告]
发表于 2007-09-14 07:54 |只看该作者
原帖由 platinum 于 2007-9-14 07:38 发表
我这两天有机会测试一下
对了,为什么最好 n > 300 呢?
我看了一下代码,说 n > 1 的时候代表重新计算 isn 的时间周期


谢谢拉

n > 1是代表间隔多长时间产生新的密码. 密码是1024byte的随即数.如果n太小,产生密码太频繁,花销太大了

论坛徽章:
0
10 [报告]
发表于 2007-09-14 09:33 |只看该作者
原帖由 Au_Hank 于 2007-9-14 07:54 发表


谢谢拉

n > 1是代表间隔多长时间产生新的密码. 密码是1024byte的随即数.如果n太小,产生密码太频繁,花销太大了

恩,有道理
对了还有,syncookie 工作于 netfilter 之前还是之后啊?
看 Linux 的报文处理流程,ip_rcv 之后就是 NF_IP_PRE_ROUTING 了,其中 conntrack 就在这里,这里还没到处理 tcp 协议栈的位置吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP