下面是来自Linux内核的代码片段。它包括syn cookie中客户机的seq。此方案的问题是,如果来自客户端get的第一个数据包被丢弃,则将在第二个数据包上重置连接。我的问题是,为什么需要在syn cookie中包含客户机序列号?
static __u32 secure_tcp_syn_cookie(__be32 saddr, __be32 daddr, __be16 sport,
__be16 dport, __u32 sseq, __u32 count,
__u32 data)
{
/*
* Compute the secure sequence number.
* The output should be:
* HASH(sec1,saddr,sport,daddr,dport,sec1) + sseq + (count * 2^24)
* + (HASH(sec2,saddr,sport,daddr,dport,count,sec2) % 2^24).
* Where sseq is their sequence number and count increases every
* minute by 1.
* As an extra hack, we add a small "data" value that encodes the
* MSS into the second hash value.
*/
return (cookie_hash(saddr, daddr, sport, dport, 0, 0) +
sseq + (count << COOKIEBITS) +
((cookie_hash(saddr, daddr, sport, dport, count, 1) + data)
& COOKIEMASK));
}
最佳答案
哈希操作中包含SSEQ号,以便在cookie中包含更多状态信息。当多个不相交的信息一起烹调时,散列变得更加健壮,这是一个普遍的概念。而且,关于您在第二个SYN案例中担心conn被重置,是的,它会发生,这就是意图。除此之外,syn cookie通常仅在检测到服务器受到威胁时才启用。
请在这里阅读有关syn cookie实现的大量详细信息,以及为什么SSEQ号是输入参数之一。
http://www.cisco.com/web/about/ac123/ac147/archived_issues/ipj_9-4/syn_flooding_attacks.html
关于networking - Linux中的SYN Cookie实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19173676/