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)以符合它。