跳转到内容

SYN cookie:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
为“实现”一节中第三句话中的“序号”一词作出了详细的解释,更正了原文“配合现在时间 t 来检查连接是否过期”的错误。
InternetArchiveBot留言 | 贡献
Reformat 1 URL (Wayback Medic 2.5)) #IABot (v2.0.9.5) (GreenC bot
 
(未显示5个用户的8个中间版本)
第6行: 第6行:


* 令 '''t''' 为一个缓慢递增的时间戳(通常为 <code>[[time.h|time()]] [[位操作#逻辑移位|>>]] 6 </code>,提供 64 秒的解析度);
* 令 '''t''' 为一个缓慢递增的时间戳(通常为 <code>[[time.h|time()]] [[位操作#逻辑移位|>>]] 6 </code>,提供 64 秒的解析度);
* 令 '''m''' 为服务器会在 SYN 队列条目中存储的[[最大分段大小]](maximum segment size);
* 令 '''m''' 为服务器会在 SYN 队列条目中存储的[[最大分段大小]](maximum segment size,简称为 MSS);
* 令 '''s''' 为一个加密[[散列算法|散列]]函数对服务器和客户端各自的 IP 地址和端口号以及 '''t''' 进行运算的结果。返回得到的数值 '''s''' 必须是一个24位值。
* 令 '''s''' 为一个加密[[散列算法|散列]]函数对服务器和客户端各自的 IP 地址和端口号以及 '''t''' 进行运算的结果。返回得到的数值 '''s''' 必须是一个24位值。


第13行: 第13行:
* 中三位:'''m''' 编码后的数值;
* 中三位:'''m''' 编码后的数值;
* 末24位:'''s''' 本身;
* 末24位:'''s''' 本身;
{{font|font=serif|注:由于 ''m'' 必须用 3 位进行编码,服务器在启用了 SYN Cookie 时只能为 ''m'' 发送八种不同的数值。}}
{{font|font=serif|注:由于 {{lang|en|''m''}} 必须用 3 位进行编码,服务器在启用了 {{lang|en|SYN Cookie}} 时只能为 {{lang|en|''m''}} 发送八种不同的数值。}}


根据 TCP 规范,当客户端发回 TCP ACK 包给服务器以响应服务器的 SYN + ACK 包时,客户端必须使用由服务器发送的初始序号加1作为数据包中的{{font|font=serif|确认号}}。服务器接着从确认号中减去 1 以便还原向客户端发送的原始 SYN Cookie。
根据 TCP 规范,当客户端发回 TCP ACK 包给服务器以响应服务器的 SYN + ACK 包时,客户端必须使用由服务器发送的初始序号加1作为数据包中的{{font|font=serif|确认号}}。服务器接着从确认号中减去 1 以便还原向客户端发送的原始 SYN Cookie。
第23行: 第23行:


==缺陷==
==缺陷==
SYN Cookies 的使用不与任何协议定义冲突,照理来说它该和所有的 TCP 实现兼容。然而,当 SYN Cookies 使用的时候,会发生两种值得注意的变化:首先,服务器只能编码八种 MSS 数值,因为只有 3 位二进制空间可用。其次,这个服务器必须拒绝所有的 [[传输控制协议#TCP封包結構|TCP 选用项]],例如大型窗口和时间戳,<span title="because the server discards the SYN queue entry where that information would otherwise be stored.">因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目。 </span><ref name="syncookies-archive">[http://cr.yp.to/syncookies/archive], cr.yp.to September 1996</ref>
SYN Cookies 的使用不与任何协议定义冲突,照理来说它该和所有的 TCP 实现兼容。然而,当 SYN Cookies 使用的时候,会发生两种值得注意的变化:首先,服务器只能编码八种 MSS 数值,因为只有 3 位二进制空间可用。其次,这个服务器必须拒绝所有的 [[传输控制协议#TCP封包結構|TCP 选用项]],例如大型窗口和时间戳,<span title="because the server discards the SYN queue entry where that information would otherwise be stored.">因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目。 </span><ref name="syncookies-archive">[http://cr.yp.to/syncookies/archive] {{Wayback|url=http://cr.yp.to/syncookies/archive |date=20090722104659 }}, cr.yp.to September 1996</ref>


尽管这些限制将不可避免地导致一个不如最佳的体验,它们的效果很少被客户端注意到——这些改变只在被攻击时值得注意。在这样的情况下,牺牲 TCP 选项来保护连接一般被认为是合乎情理的。
尽管这些限制将不可避免地导致一个不如最佳的体验,它们的效果很少被客户端注意到——这些改变只在被攻击时值得注意。在这样的情况下,牺牲 TCP 选项来保护连接一般被认为是合乎情理的。


[[Linux内核]] 从 2.6.26 版本开始为 TCP 选用项加入了有限的支持,通过把它们编码在时间戳内实现。<ref name="Improving Syncookies">Patrick McManus, [http://lwn.net/Articles/277146/ Improving Syncookies], lwn.net April 2008</ref>
[[Linux内核]] 从 2.6.26 版本开始为 TCP 选用项加入了有限的支持,通过把它们编码在时间戳内实现。<ref name="Improving Syncookies">Patrick McManus, [http://lwn.net/Articles/277146/ Improving Syncookies] {{Wayback|url=http://lwn.net/Articles/277146/ |date=20141128000658 }}, lwn.net April 2008</ref>


较新的 [[TCP Cookie 传输]](TCPCT)标准被设计用来克服 SYN Cookies 的这些问题,并且在各种方面改进这套机制。不像 SYN Cookies,TCPCT 是一个 TCP 拓展并且要求两端点都支持 TCPCT。
较新的 [[TCP Cookie 传输]](TCPCT)标准被设计用来克服 SYN Cookies 的这些问题,并且在各种方面改进这套机制。不像 SYN Cookies,TCPCT 是一个 TCP 拓展并且要求两端点都支持 TCPCT。


==安全考量==
==安全考量==
被设置为允许所有'''出站'''连接但对'''入站'''连接有限制(例如在 Web 服务器上只允许 80 端口)的简单[[防火墙]]一般是这样实现的:只阻断不必要端口的 SYN 请求。如果 SYN Cookies 被启动了,应当小心以保证攻击者不能使用伪造 ACK、尝试随机序列号的方式来绕过这样的防火墙。因此 SYN cookies 应该按照'''每个端口单独处理'''的方式来调节开关,这样的话一个公共端口上的 SYN Cookies 并不会在一个私有端口上被认可。<ref>http://www.iss.net/security_center/reference/vuln/linux-syncookie-bypass-filter.htm</ref>
被设置为允许所有'''出站'''连接但对'''入站'''连接有限制(例如在 Web 服务器上只允许 80 端口)的简单[[防火墙]]一般是这样实现的:只阻断不必要端口的 SYN 请求。如果 SYN Cookies 被启动了,应当小心以保证攻击者不能使用伪造 ACK、尝试随机序列号的方式来绕过这样的防火墙。因此 SYN cookies 应该按照'''每个端口单独处理'''的方式来调节开关,这样的话一个公共端口上的 SYN Cookies 并不会在一个私有端口上被认可。<ref>{{cite web |url=http://www.iss.net/security_center/reference/vuln/linux-syncookie-bypass-filter.htm |title=存档副本 |accessdate=2013-03-17 |deadurl=yes |archiveurl=https://archive.today/20130413192449/http://www.iss.net/security_center/reference/vuln/linux-syncookie-bypass-filter.htm |archivedate=2013-04-13 }}</ref>


==历史==
==历史==
[[Daniel J. Bernstein]] 和 [[Eric Schenk]] 于 1996 年九月创造了这个技术。[[Jeff Weisberg]] 在一个月后发布了最早的实现(在 [[SunOS]] 上),[[Eric Schenk]] 随后在 1997 年二月发布了他的 [[Linux]] 实现(目前的实现使用,例如 [http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html#AEN485 net.ipv4.tcp_syncookies])。
[[Daniel J. Bernstein]] 和 [[Eric Schenk]] 于 1996 年九月创造了这个技术。[[Jeff Weisberg]] 在一个月后发布了最早的实现(在 [[SunOS]] 上),[[Eric Schenk]] 随后在 1997 年二月发布了他的 [[Linux]] 实现(目前的实现使用,例如 [http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html#AEN485 net.ipv4.tcp_syncookies]{{Wayback|url=http://www.frozentux.net/ipsysctl-tutorial/ipsysctl-tutorial.html#AEN485 |date=20150206091607 }})。


== 参见 ==
== 参见 ==
第41行: 第41行:


== 参考资料 ==
== 参考资料 ==
* [http://cr.yp.to/syncookies.html D. J. Bernstein's own explanation of SYN cookies]
* [http://cr.yp.to/syncookies.html D. J. Bernstein's own explanation of SYN cookies]{{Wayback|url=http://cr.yp.to/syncookies.html |date=20101223201913 }}


<references/>
<references/>

2023年9月20日 (三) 05:55的最新版本

SYN cookie 是一种用于阻止 SYN flood 攻击的技术。这项技术的主要发明人 Daniel J. Bernstein 将 SYN cookies 定义为“TCP 服务器进行的对开始TCP数据包序列数字的特定选择”。举例来说,SYN Cookies 的应用允许服务器当 SYN 队列被填满时避免丢弃连接。相反,服务器会表现得像 SYN 队列扩大了一样。服务器会返回适当的 SYN+ACK 响应,但会丢弃 SYN 队列条目。如果服务器接收到客户端随后的ACK响应,服务器能够使用编码在 TCP 序号内的信息重构 SYN 队列条目。

实现

[编辑]

发起一个 TCP 连接时,客户端将一个 TCP SYN 包发送给服务器。作为响应,服务器将 TCP SYN + ACK 包返回给客户端。此数据包中有一个序号(sequence number,TCP头中的第二个32 bit),它被 TCP 用来重新组装数据流。根据 TCP 规范,由端点发送的第一个序号可以是由该端点决定的任何值。SYN Cookies 是根据以下规则构造的初始序号:

  • t 为一个缓慢递增的时间戳(通常为 time() >> 6 ,提供 64 秒的解析度);
  • m 为服务器会在 SYN 队列条目中存储的最大分段大小(maximum segment size,简称为 MSS);
  • s 为一个加密散列函数对服务器和客户端各自的 IP 地址和端口号以及 t 进行运算的结果。返回得到的数值 s 必须是一个24位值。

初始 TCP 序号,也就是所谓的 SYN cookie,按照如下算法得到:

  • 头五位:t mod 32;
  • 中三位:m 编码后的数值;
  • 末24位:s 本身;

注:由于 m 必须用 3 位进行编码,服务器在启用了 SYN Cookie 时只能为 m 发送八种不同的数值。

根据 TCP 规范,当客户端发回 TCP ACK 包给服务器以响应服务器的 SYN + ACK 包时,客户端必须使用由服务器发送的初始序号加1作为数据包中的确认号。服务器接着从确认号中减去 1 以便还原向客户端发送的原始 SYN Cookie。

接下来服务器进行以下检查:

  • 根据当前的时间以及 t 来检查连接是否过期。
  • 重新计算 s 来确认这是不是一个有效的 SYN Cookie。
  • 从 3 位编码中解码 m,以便之后用来重建 SYN 队列条目。在此之后,连接照常进行。

缺陷

[编辑]

SYN Cookies 的使用不与任何协议定义冲突,照理来说它该和所有的 TCP 实现兼容。然而,当 SYN Cookies 使用的时候,会发生两种值得注意的变化:首先,服务器只能编码八种 MSS 数值,因为只有 3 位二进制空间可用。其次,这个服务器必须拒绝所有的 TCP 选用项,例如大型窗口和时间戳,因为服务器会在信息被用其他方式存储时丢弃 SYN 队列条目。 [1]

尽管这些限制将不可避免地导致一个不如最佳的体验,它们的效果很少被客户端注意到——这些改变只在被攻击时值得注意。在这样的情况下,牺牲 TCP 选项来保护连接一般被认为是合乎情理的。

Linux内核 从 2.6.26 版本开始为 TCP 选用项加入了有限的支持,通过把它们编码在时间戳内实现。[2]

较新的 TCP Cookie 传输(TCPCT)标准被设计用来克服 SYN Cookies 的这些问题,并且在各种方面改进这套机制。不像 SYN Cookies,TCPCT 是一个 TCP 拓展并且要求两端点都支持 TCPCT。

安全考量

[编辑]

被设置为允许所有出站连接但对入站连接有限制(例如在 Web 服务器上只允许 80 端口)的简单防火墙一般是这样实现的:只阻断不必要端口的 SYN 请求。如果 SYN Cookies 被启动了,应当小心以保证攻击者不能使用伪造 ACK、尝试随机序列号的方式来绕过这样的防火墙。因此 SYN cookies 应该按照每个端口单独处理的方式来调节开关,这样的话一个公共端口上的 SYN Cookies 并不会在一个私有端口上被认可。[3]

历史

[编辑]

Daniel J. BernsteinEric Schenk 于 1996 年九月创造了这个技术。Jeff Weisberg 在一个月后发布了最早的实现(在 SunOS 上),Eric Schenk 随后在 1997 年二月发布了他的 Linux 实现(目前的实现使用,例如 net.ipv4.tcp_syncookies页面存档备份,存于互联网档案馆))。

参见

[编辑]

参考资料

[编辑]
  1. ^ [1]页面存档备份,存于互联网档案馆), cr.yp.to September 1996
  2. ^ Patrick McManus, Improving Syncookies页面存档备份,存于互联网档案馆), lwn.net April 2008
  3. ^ 存档副本. [2013-03-17]. (原始内容存档于2013-04-13).