已经上线两天了,请帮忙!SYN 洪水错误

已经上线两天了,请帮忙!SYN 洪水错误

我遇到了一个问题,已经处理了三个星期了,过去两天我一直在努力解决这个问题。

我的服务器很忙

如果我跑,netstat -plan | grep :80 | wc -l我就会得到22717

在我的日志中我得到

TCP: Possible SYN flooding on port 80. Sending cookies

在高峰时段....

服务器信息:

  • 操作系统:Ubuntu Linux 11.10
  • CPU:Intel(R) Xeon(R) CPU X5550 @ 2.67GHz,8 核
  • 内存:12GB
  • 内核和 CPU:x86_64 上的 Linux 3.0.0-14-server
  • Apache2 版本:2.2.20(Ubuntu)
  • Php版本:5.3.6-13ubuntu3.2
  • Mysql 版本:5.1.58(运行良好)

当我TCP: Possible SYN flooding on port 80. Sending cookies进入我的日志时,我注意到它会开始拒绝我访问我的网站,有时只会在高峰期发生。

我的 /etc/sysctl.conf 看起来像这样

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_max_syn_backlog = 2480
net.core.netdev_max_backlog = 1024
net.ipv4.tcp_max_tw_buckets = 360000
net.core.rmem_default = 65535
net.core.rmem_max = 8388608
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.wmem_default = 65535
net.core.wmem_max = 8388608
net.ipv4.tcp_wmem = 4096 65535 8388608
net.ipv4.tcp_mem = 8388608 8388608 8388608
net.core.optmem_max = 40960

我想知道我需要调整什么,以便我的服务器不会认为大量流量是 SYN 洪水并拒绝流量。

输出netstat -tan | awk '$4 ~ /:80/ {print $6}' | sort | uniq -c | sort -n

 1 LISTEN
 31 FIN_WAIT2
116 LAST_ACK
127 CLOSING
225 SYN_RECV
303 FIN_WAIT1
313 ESTABLISHED
22273 TIME_WAIT

我在世界各地托管非常小的脚本,因此我的服务器上的流量来自所有其他站点的流量。我见过的峰值 time_wait 超过 17000。我的服务器运行良好,但当 syn 泛洪消息开始输入到我的日志中时,我会开始出现间歇性连接问题。因此,当我访问我的域时,如果确实存在无法加载的问题,我会刷新页面,它会加载,但如果我不刷新它,它就不会加载并且什么都不返回。

更新:

有没有没有 syn 泛洪保护的内核?我想关闭它,因为我无法调整任何允许更多连接通过的设置。

答案1

您使用的命令没有提供足够的信息。出错的两个主要方面是:

  1. 它不会根据端口 80 是传入还是传出进行过滤。
  2. 它不会根据连接的状态进行过滤。

TCP 连接可以处于几种不同状态中的任意一种。如果您遭受 SYN 洪水攻击,您会看到最多的状态是SYN_RECV。TCP 状态(如ESTABLISHED和 )TIME_WAIT相当正常,通常不表示受到攻击。

此命令:

netstat -tan | awk '$4 ~ /:80/ {print $6}' | sort | uniq -c | sort -n

应该会给你更多有用的信息。此版本将输出限制为其他人向您的服务器发出的请求,而不是您可能向其他人的服务器发出的请求,并且它还会分离出所有不同的 TCP 状态并对其进行聚合。

接下来要调查的是这是否真的是 SYN 洪水。您说这只发生在高峰时段,这暗示您的服务器可能正在耗尽某些资源。查看您的性能图表(Cacti、Munin、Zabbix,无论您使用什么),看看其中一个图表是否在高峰时段达到 100%。攻击者通常不知道您的高峰时段是什么时候。

您还将获得很多更多信息来自:

netstat -s

如果确实是 SYN 洪水,syn cookies 是处理它的正确方法。SYN 洪水的问题在于它会耗尽您机器上的资源来跟踪永远不会完成的连接。Syn cookies 在响应本身中对连接状态进行编码,这意味着您不再需要在服务器上跟踪这些半开连接。

SYN 泛洪可能导致您首先耗尽其他资源(例如带宽)。在这种情况下,您可能需要要求托管服务提供商停止泛洪或聘请 DDoS 缓解公司。

答案2

从你的问题来看,你似乎确定这是正常流量,而不是攻击。如果是这样,也许传出流量使你的连接饱和,因此对 SYN 的回复会丢失,从而使 SYN 保持打开状态?

内核怀疑这是一次攻击的唯一事实不应该破坏您的连接。

相关内容