SYN Flood 攻击:原理、危害与防御机制
SYN Flood 攻击是一种针对 TCP 协议缺陷的经典 DoS(拒绝服务)攻击,通过耗尽服务器的连接资源,导致正常用户无法建立连接。其核心原理利用了 TCP 三次握手的机制漏洞,尤其是服务器对未完成连接的超时处理机制。以下从攻击原理、危害到防御措施展开详细解析。
SYN 超时重试:攻击的 “突破口”
TCP 三次握手过程中,若服务器发送 SYN-ACK 后未收到客户端的 ACK(第三次握手),会触发SYN 超时重试机制,这一机制成为 SYN Flood 攻击的关键目标。
超时重试流程:
- 服务器收到客户端的 SYN 请求,回复 SYN-ACK 后进入
SYN_RECV状态,同时将该连接放入SYN 队列(半连接队列)。 - 若客户端未回复 ACK(如客户端掉线、恶意不回复),服务器会周期性重发 SYN-ACK:
- 默认重试5 次,间隔时间呈指数递增(1s → 2s → 4s → 8s → 16s)。
- 第五次重发后,服务器需等待 32s 确认超时,总耗时 63s后才会从 SYN 队列中移除该连接。
风险点:
- 服务器的 SYN 队列容量有限(默认通常为几百至几千)。
- 若大量未完成的连接占用 SYN 队列,新的正常连接请求会因队列满而被拒绝,导致服务器 “拒绝服务”。
SYN Flood 攻击:利用漏洞的恶意行为
SYN Flood 攻击正是利用了上述超时重试机制,通过伪造大量虚假的 SYN 请求,耗尽服务器的 SYN 队列资源,使正常连接无法建立。
攻击过程:
- 攻击者向目标服务器发送大量伪造源 IP 的 SYN 请求(源 IP 可能不存在或不可达)。
- 服务器收到 SYN 后,回复 SYN-ACK,但由于源 IP 虚假,永远收不到 ACK,连接被放入 SYN 队列并等待超时。
- 随着虚假连接不断增加,SYN 队列很快被占满,服务器无法处理新的正常 SYN 请求,导致合法用户无法建立 TCP 连接。
攻击特点:
- 隐蔽性强:攻击者使用伪造 IP,难以溯源。
- 低成本高破坏:少量攻击流量即可耗尽服务器资源(因每个虚假连接需占用 63s 资源)。
- 针对 TCP 服务:所有基于 TCP 的服务(如 HTTP、FTP、SSH)均可能受影响。
防御机制:从系统配置到协议优化
针对 SYN Flood 攻击,可通过系统参数调整、协议优化等方式缓解或防御,核心思路是减少半连接资源占用时间和区分正常与恶意连接。
TCP Syncookies:协议级防御
tcp_syncookies是 Linux 内核提供的核心防御机制,通过 “cookie 验证” 区分正常连接与恶意连接:
原理:
- 当 SYN 队列满时,服务器不将连接放入队列,而是根据源 IP、端口、目标 IP、端口及时间戳生成一个加密的 SYN Cookie(作为 seq 序号),并回复 SYN-ACK。
- 若为正常客户端,会返回 ACK,其中包含该 Cookie(作为 ack 确认号)。
- 服务器验证 Cookie 有效性,若合法则直接建立连接(跳过 SYN 队列),若为恶意攻击(无 ACK 或 Cookie 无效)则忽略。
启用方式:
1
2echo 1 > /proc/sys/net/ipv4/tcp_syncookies # 临时启用
永久生效需修改/etc/sysctl.conf,添加net.ipv4.tcp_syncookies = 1优势:无需依赖 SYN 队列,可抵御大规模 SYN Flood 攻击。
调整系统参数:减少资源占用
通过修改 Linux 内核参数,缩短半连接存活时间或增大队列容量:
tcp_synack_retries:减少 SYN-ACK 重试次数(默认 5 次),缩短超时时间。1
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries # 重试2次,总耗时1+2=3s
tcp_max_syn_backlog:增大 SYN 队列容量(默认值较小,如 1024)。1
echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog # 队列容量增至8192
tcp_abort_on_overflow:当 SYN 队列满时,直接拒绝新连接(默认 0,会丢弃请求;设为 1 则发送 RST,告知客户端重试)。1
echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
其他防御手段
- 防火墙过滤:通过防火墙规则限制单 IP 的 SYN 请求频率(如每秒不超过 10 个),过滤明显的伪造 IP(如内网 IP 对外发起的请求)。
- 负载均衡:将流量分散到多台服务器,避免单台服务器被耗尽。
- DDoS 清洗:通过专业抗 DDoS 服务(如阿里云 Anti-DDoS),在流量进入服务器前过滤恶意 SYN 请求。
v1.3.10