下面是来自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/

10-12 07:21