SYN Flood的原理一句话:攻击者狂发TCP握手第一个包(SYN),但不回第三次握手的ACK,服务器傻等,半连接队列被占满,正常用户的握手请求进不来,表现为网站打不开但机器负载并不高。这种攻击成本极低,一个脚本就能打,站长几乎人人会遇到。
先确认是不是这个病:ss -s看一眼,或者netstat -ant里数SYN_RECV状态的数量,正常应该是个位数,几百上千基本就是被打或者被扫描。确认之后从内核、Nginx、高防三层处理。
# 1. 开启SYN Cookie,收到SYN先不占队列,伪造握手
sysctl -w net.ipv4.tcp_syncookies=1
# 2. 缩短SYN重试和半连接存活,别陪攻击者耗
sysctl -w net.ipv4.tcp_synack_retries=2
sysctl -w net.ipv4.tcp_fin_timeout=15
# 3. 半连接队列加大,扛突发
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
# 写入/etc/sysctl.conf后 sysctl -p 生效
内核参数能扛小流量,真正的攻击还得Nginx层配合。单个IP的并发连接和速率限制之前写过limit_req和limit_conn,这里补一个对慢速连接的清理:客户端建立连接后不发数据干耗着,也要踢。
# nginx.conf http块
client_body_timeout 10s; # 读请求体超时
client_header_timeout 10s; # 读请求头超时
send_timeout 10s; # 响应超时
# keepalive别设太长,占用连接
keepalive_timeout 15s;
keepalive_requests 100;
验证:改完之后用ab或者wrk模拟压测,观察ss -s里SYN_RECV数量是否快速回落,正常请求的成功率有没有受影响。压测别拿生产域名打,打本机或者内网测试机。
说句掏心窝的:这三步能挡住脚本小子的业余攻击,挡不住真花钱买的攻击流量。一旦攻击带宽超过你服务器带宽(比如1G口被打了3G),机器层面怎么调都没用,流量根本到不了你机器。这种情况直接切高防IP或者上云清洗,别在服务器上死磕,浪费时间。
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!




