我有一个 TCP 服务器在运行 Ubuntu 12.04.3(内核 3.8.0-31-generic)的机器(“服务器”)上进行监听。它接收来自 2 台不同客户端机器的连接。机器 A 运行 Ubuntu 12.04.4 (3.11.0-17-generic),机器 B 运行 Ubuntu 11.10 (3.0.0-32-server)。
如果服务器上启用了 TCP 时间戳(sysctl net.ipv4.tcp_timestamps=1),那么有时来自机器 A 的 SYN 数据包会被“忽略”。在服务器上使用 tcpdump(在非混杂模式下)我可以看到 SYN 到达正常并且校验和正确 - 只是没有响应 - 没有 SYN/ACK 和 RST。机器 A 在放弃之前多次重传 SYN。在机器 A 上运行的客户端软件(在本例中为 wget)立即使用新连接重试并成功,获得即时 SYN/ACK。
机器 B 在同一台服务器上没有问题,它的流量看起来很正常 - 它也使用与机器 A 相同的 TCP 选项(从我从捕获文件中看到的)。在服务器上禁用 TCP 时间戳会使一切正常工作。
被忽略的 SYN 数据包中的时间戳对我来说似乎是有效的,所以我不确定它们为什么会导致问题,或者它们是否是根本原因。
我在这里放了一个匿名 pcap https://www.dropbox.com/s/onimdkbyx9lim70/server-machineA.pcap。它是在服务器 (10.76.0.74) 上拍摄的,显示机器 A (10.4.0.76) 成功执行 HTTP GET(数据包 1 到 10),然后 1 秒后尝试再次获取相同的 URL(数据包 11 到 17),但相反忽略其 SYN。数据包 18 到 …
在我们的 Linux 服务器上,我们不时会收到众所周知的 SYN 洪水消息:
possible SYN flooding on port 80
Run Code Online (Sandbox Code Playgroud)
这可能不是攻击,因为网站流量很大。
然而,从某个时候开始,这些消息开始每隔约 60 秒出现一次。我的意思是:
Aug 16 01:22:44 amadeus kernel: possible SYN flooding on port 80. Sending cookies.
Aug 16 01:23:45 amadeus kernel: possible SYN flooding on port 80. Sending cookies.
Aug 16 01:25:05 amadeus kernel: possible SYN flooding on port 80. Sending cookies.
Aug 16 01:26:06 amadeus kernel: possible SYN flooding on port 80. Sending cookies.
Aug 16 01:27:13 amadeus kernel: possible SYN flooding on port 80. Sending cookies. …
Run Code Online (Sandbox Code Playgroud) 在我的日志中,我经常看到这样的 ip 掉线:
> Oct 30 17:32:24 IPTables Dropped: IN=eth0 OUT=
> MAC=04:01:2b:bd:b0:01:4c:96:14:ff:df:f0:08:00 SRC=62.210.94.116
> DST=128.199.xxx.xxx LEN=40 TOS=0x00 PREC=0x00 TTL=244 ID=45212
> PROTO=TCP SPT=51266 DPT=5900 WINDOW=1024 RES=0x00 SYN URGP=0
>
> Oct 30 17:29:57 Debian kernel: [231590.140175] IPTables Dropped:
> IN=eth0 OUT= MAC=04:01:2b:bd:b0:01:4c:96:14:ff:ff:f0:08:00
> SRC=69.30.240.90 DST=128.199.xxx.xxx LEN=40 TOS=0x00 PREC=0x00 TTL=245
> ID=12842 DF PROTO=TCP SPT=18534 DPT=8061 WINDOW=512 RES=0x00 SYN
> URGP=0
Run Code Online (Sandbox Code Playgroud)
从上面,我假设这些是我的 IpTables 规则丢弃的 Syn flood。这是我在 iptables 中为 Syn 所拥有的(虽然不确定这些规则中的哪一个会删除上面的规则):
# Drop bogus TCP packets
iptables -A INPUT -p tcp …
Run Code Online (Sandbox Code Playgroud) 为了防止 DDOS 攻击,我按照建议将我的 linux 机器中的 /proc/sys/net/ipv4/tcp_syncookies 值设置为 1 以启用 TCP syncookies。
但是,当我查看此网址时:http://ckdake.com/content/2007/disadvantages-of-tcp-syn-cookies.html
它告诉我,如果我启用 tcp_syncookies,那么一半的 tcp 功能(包括大窗口管理)将被禁用,这可能会降低性能。
我在其他地方读到,syn cookie 的部分目的是当更多数据包进入时将 tcp syn 积压缓冲区扩展到其上限(通过 /proc/sys/net/ipv4/tcp_max_syn_backlog),这样数据包就不会丢失。
我希望能够禁用 syn cookie,这样我就可以充分利用 tcp 并使我的服务器运行得更快并且继续不受 DDOS 攻击。我可以轻松地增加同步缓冲区和最大连接数,但我认为如果设置得太高,我会耗尽内存。
有没有人有一个好的替代方法可以在重型服务器上同步 cookie 而不会受到 DDOS 攻击?我想享受 TCP 的功能并非常快速地向用户提供内容。