SYN 洪水攻击导致 CPU 负载过高

SYN 洪水攻击导致 CPU 负载过高

当受到 SYN 洪水攻击时,我的 CPU 很快就被名为 的内核进程占用到了 100% ksoftirqd,我尝试了很多缓解措施,但都无法解决问题。

这是我的 sysctl 配置返回的sysctl -p

net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
fs.file-max = 10000000
fs.nr_open = 10000000
net.core.somaxconn = 128
net.core.netdev_max_backlog = 2500
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_tw_reuse = 1
net.netfilter.nf_conntrack_max = 10485760
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 15
vm.swappiness = 10
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_synack_retries = 1

即使激活 Syn cookie 后,CPU 仍然保持不变,端口 443(受到攻击的端口)的监听队列显示 512 SYN_RECV,这是 NGINX 设置的默认积压限制。

这也是有问题的,因为SOMAXCONN设置为比 512(128)低得多的值,那么它是如何超过该限制的? SOMAXCONN需要是每个套接字监听的上限,但事实并非如此。

我读了这么多,但还是很困惑。据我所知,SOMAXCONN是 LISTEN 和 ACCECPT 队列的积压大小,那么到底是什么tcp_max_syn_backlog?我如何计算每个队列的大小?

我还读到 SYN cookies 不会立即激活,而只有在达到一定tcp_max_syn_backlog大小后才会激活,这是真的吗?如果是这样,则意味着其值需要低于SOMAXCONN..

我甚至尝试tcp_abort_on_overflow在受到攻击时激活,但没有任何变化,如果 SYN coockies 确实在溢出时激活,那么将它们一起应用会有什么结果?

我有 ubuntu 18,2 个内核,3GB 内存,只使用了 700MB,即使受到攻击,我唯一的问题是 CPU 负载。如果这是问题所在,我愿意添加资源,但在添加 8 个内核后,结果是每个内核的使用率都达到 100%,所以这似乎不是问题

相关内容