SYN 泛洪与主机侧防护
SYN 泛洪的原理是攻击者只发 SYN 不回 ACK,把服务端的半连接队列占满,正常用户再也完不成握手。主机侧能做的三件事:开启 SYN cookies 让半连接不再占用完整队列资源、调大半连接与 accept 队列、减少 SYN-ACK 重传次数以加快释放。流量再往上一个量级就要靠 synproxy 代答握手或上游清洗,单机参数救不了带宽型攻击。
基本信息
| 加固项 | 连接层抗泛洪 |
|---|---|
| 适用平台 | Linux(sysctl 与 nftables/iptables) |
| 风险等级 | 中 |
| 基线 | SYN cookies 开启、队列参数按业务调优 |
| 防护层次 | 主机参数 低于 synproxy 低于上游清洗 |
典型使用场景
- 公网入口加固:Web 与 API 服务在暴露前先核对内核参数
- 事件响应:判断当前攻击规模是否需要走上游清洗
- 容量评估:压测时用 ss 观察半连接数与队列溢出计数
- 基线巡检:把 syncookies 与队列参数纳入常规核查项
- 前后端分离架构:确认负载均衡后端不是新的队列瓶颈
内核侧核查
内核侧核查
# 逐项核对当前值(0 表示关闭,队列打满即拒绝服务)
sysctl net.ipv4.tcp_syncookies # 期望 1
sysctl net.ipv4.tcp_max_syn_backlog # 半连接队列上限
sysctl net.core.somaxconn # accept 队列上限
ss -s # 概览:SYN-RECV 与溢出计数
# 溢出与丢弃计数可用 netstat -s 中的 listen 段辅助判断nftables synproxy 思路
nftables synproxy 思路
# 网关代答握手:仅在后端只接收已建立连接时使用
nft add rule inet filter input tcp dport 443 'ct state new' synproxy mss 1460 wscale 7 timestamp sack-perm
# 上线前确认后端健康检查、长连接与透传地址方案不受影响内核参数判读
| 参数 | 含义 | 关注点 |
|---|---|---|
| tcp_syncookies | 队列满时用 cookie 完成握手 | 应为 1,为 0 时队列打满即不可用 |
| tcp_max_syn_backlog | 半连接队列长度 | 过小会提前丢弃正常 SYN |
| somaxconn | accept 队列长度 | 应用 listen backlog 会被它截断 |
| tcp_synack_retries | SYN-ACK 重传次数 | 过大延长单个半连接占用时间 |
synproxy 适合后端只接受已建立连接的网络,前置设备已做健康检查或连接保持时慎用;多数业务先依赖云厂商的基础防护更实际。
改 sysctl 要同时落配置文件(如 /etc/sysctl.d/ 下的文件)并 sysctl -p 验证,只改运行时值重启后即失效。