我的服务器端口 80 上出现了 synflood 攻击,我无法阻止它。首先,我的表已满,然后我禁用了 iptables,发现这是一次 synflood
netstat -n | grep :80 |wc -l
#returns 1300 - 2000
netstat -n | grep :80 | grep SYN |wc -l
#returns around 250
这些 IP 来自四面八方,所以我猜想它是被欺骗了。当我输入不同的 iptable 规则时,它要么不执行任何操作,要么直接丢弃所有连接,甚至是正常的连接
这是我的 sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
我能做什么?我在 1and1,我不认为他们会为我设置 TCP 拦截,我听说这是最好的解决方案。什么才是最好的解决方案?
答案1
检查数据包是否具有显著特征,例如,所有数据包是否大小相同。
通常,使用脚本 SYN 洪水攻击时,它们会发送一个只有标头而没有有效负载的“裸”数据包。最终会得到一个 40 字节的数据包(如果我没记错的话)。
如果是这种情况,您可以简单地使用 iptables 删除所有这些,因为没有“正常”数据包看起来像那样。
哦,准备好接受那些不真正了解 SYN 洪水攻击实际工作原理的人提供的大量无用建议。
答案2
您只需要启用 syncookies,而且我看到您已经这样做了:
sysctl -w net.ipv4.tcp_syncookies=1
然后,您可以调整 OS TCP/IP 堆栈以在未使用/关闭的套接字上更快地释放系统资源。
我的设置:
# tunning tcp stack
sysctl -w net.ipv4.tcp_fin_timeout=30
sysctl -w net.ipv4.tcp_keepalive_time=1800
sysctl -w net.ipv4.tcp_window_scaling=0
sysctl -w net.ipv4.tcp_sack=0
sysctl -w net.ipv4.tcp_timestamps=0
sysctl -w net.ipv4.ip_conntrack_max=524288
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# buffering
sysctl -w net.core.wmem_default=229376
sysctl -w net.core.wmem_max=229376
您也可以调整 Apache,尤其是关闭 KeepAlive 并设置较低的超时值:
Timeout 5
KeepAlive Off
处理大量连接时,使用 Web 服务器(例如 Nginx、Lighttpd 等)会有所帮助。它们启动一个进程,并为每个连接分配少量内存,Apache 为每个连接分配一个进程。