我写的高性能,简化的SYNCOOKIE实现
时间:2007-09-13
来源:互联网
光测试了产生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以上以降低产生新的密码的
花销
有什么建议,请和我联系,谢谢了 [email protected]
[ 本帖最后由 Au_Hank 于 2007-9-18 09:36 编辑 ]

syncookies.zip (4.13 KB)
作者: Au_Hank 发布时间: 2007-09-13
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;
}
作者: Au_Hank 发布时间: 2007-09-13
1: 完全忽略了mss以及所有其他的tcp options
2: 密码更新前没有收到ack的合法连接被丢弃(client会傻乎乎的以为连接成功了

3: 完全随即产生isn(cookie),没有遵循RFC的定义产生isn.
但是我觉得这些缺点和被DDOS比起来都是小意思,总比完全不能提供服务好

[ 本帖最后由 Au_Hank 于 2007-9-14 07:25 编辑 ]
作者: Au_Hank 发布时间: 2007-09-13
在1000M网上,最多每秒也就不到200万个syn连接, 我觉得我这个简化的算法
可以抵挡很猛烈的攻击

[ 本帖最后由 Au_Hank 于 2007-9-14 07:36 编辑 ]
作者: Au_Hank 发布时间: 2007-09-13
有人说只能防本机
有人说防护的是整个 tcp 协议栈,当 syn 请求过多队列会满,满了以后后面的主机也会受影响,因此 syncookie 也可以防后面的机器
作者: platinum 发布时间: 2007-09-13
我一直没弄懂 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 编辑 ]
作者: Au_Hank 发布时间: 2007-09-14
最好能和原始的SYNCOOKIE方法做下对比,很简单,
echo 1 >/proc/sys/net/ipv4/tcp_syncookie 就是用原始的SYNCOOKIE
echo n >/proc/sys/net/ipv4/tcp_syncookie就是用我的方法 (n 最好>300)
作者: Au_Hank 发布时间: 2007-09-14
对了,为什么最好 n > 300 呢?
我看了一下代码,说 n > 1 的时候代表重新计算 isn 的时间周期
作者: platinum 发布时间: 2007-09-14
我这两天有机会测试一下
对了,为什么最好 n > 300 呢?
我看了一下代码,说 n > 1 的时候代表重新计算 isn 的时间周期
谢谢拉

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

作者: Au_Hank 发布时间: 2007-09-14
谢谢拉

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

恩,有道理
对了还有,syncookie 工作于 netfilter 之前还是之后啊?
看 Linux 的报文处理流程,ip_rcv 之后就是 NF_IP_PRE_ROUTING 了,其中 conntrack 就在这里,这里还没到处理 tcp 协议栈的位置吧?
作者: platinum 发布时间: 2007-09-14
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28