为什么默认情况下不启用 net.ipv4.tcp_rfc1337?

为什么默认情况下不启用 net.ipv4.tcp_rfc1337?

tcp_rfc1337 设置似乎对 TIME-WAIT Assassination 有一个解决方案。

第一个问题是旧的重复数据可能会在新连接中被错误地接受,从而导致发送的数据损坏。
第二个问题是,由于旧的重复数据包进入新连接,连接可能会变得不同步并陷入 ACK 循环,新连接将变得不同步。
第三个也是最后一个问题是,旧的重复数据包可能会错误地进入新建立的连接并终止新连接。

据我所知,为了解决问题,设置的作用是当套接字处于 TIME-WAIT 状态时,忽略 RST(重置)数据包

那么,为什么默认情况下不启用此设置?使用此功能有什么缺点?

实际上,我在研究如何阻止 SYN 泛洪攻击时了解到了这个变量。您认为此设置有助于阻止这些攻击吗?

答案1

我同意格雷格的评论。RFC 1337仅是信息性 RFC,不是 TCP 标准的一部分。为了确保生产网络中不会发生任何意外变化,最好默认禁用此功能,并由网络管理员决定是否要启用它进行测试。

丢弃处于 TIME-WAIT 状态的套接字的 RST 数据包不会出现但这并不意味着没有任何负面影响——也许是一个尚未完全探索的奇怪边缘情况。

有趣的是,内核文档对于 tcp_rfc1337 似乎不正确:

tcp_rfc1337 - BOOLEAN
    If set, the TCP stack behaves conforming to RFC1337. If unset,
    we are not conforming to RFC, but prevent TCP TIME_WAIT
    assassination.
    Default: 0

如果设置了该选项,我们将遵守 RFC 1337 并丢弃 RST 数据包,从而防止 TIME-WAIT 暗杀。如果未设置该选项(默认),我们将不遵守 RFC 1337 并容易受到 TIME-WAIT 暗杀。

答案2

我发现 内核源代码对我来说,文档是正确的:默认值 = 0:kill

if (th->rst) {
    /* This is TIME_WAIT assassination, in two flavors.
     * Oh well... nobody has a sufficient solution to this
     * protocol bug yet.
     */
    if (sysctl_tcp_rfc1337 == 0) {
kill:
        inet_twsk_deschedule_put(tw);
        return TCP_TW_SUCCESS;
    }
}

默认值是有意义的:RFC 是信息性的,因此您必须设置此旋钮(值 = 1)以符合它。

相关内容