限制 SYN 扫描与 SYN Flood 攻击防护

本文介绍了 SYN-RECV 状态的含义,并提供了多种方法来限制 SYN 扫描和 SYN Flood 攻击,包括使用 iptables 限制 SYN 请求、调整 TCP 参数、fail2ban 自动封锁可疑 IP 以及适用场景与潜在影响的分析。

阅读时长: 4 分钟
共 1615字
作者: eimoon.com

🔍 什么是 SYN-RECV?

• SYN-RECV 状态表示 服务器收到了 TCP SYN 请求,但 尚未完成握手。 • 常见原因:

  1. 正常的 TCP 连接(短暂的 SYN-RECV 是正常现象)。
  2. SYN Flood 攻击(大量 SYN-RECV,但连接未完成)。
  3. 端口扫描(黑客或爬虫在探测你的服务器)。

如果 SYN-RECV 持续数量过多,可能会 导致服务器资源耗尽,甚至被 拒绝服务攻击(DDoS)。

🛠 1. 使用 iptables 限制 SYN 请求

你可以 限制每秒最大 SYN 连接数,防止 SYN Flood 攻击:

sudo iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
  • –limit 10/s:限制每秒最多 10 个新 SYN 请求
  • –limit-burst 20:允许最大突发 20 个 SYN 请求

如果发现 SYN 攻击流量很高,可以继续适当降低:

sudo iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT

🛑 可能的不利影响

  • 合法用户的高并发连接可能受限
  • 如果你的服务器 处理大量并发请求(如 API、网站、数据库),此规则可能会 限制正常流量,导致用户访问变慢或请求失败。
  • 解决方案:
  • 对 Web 服务器(如 Nginx、Apache)增加 keepalive 连接,减少 SYN 请求:
keepalive_timeout 75;
  • 适当提高 iptables 允许的 SYN 速率,比如:
sudo iptables -A INPUT -p tcp --syn -m limit --limit 50/s --limit-burst 100 -j ACCEPT

🛠 2. 使用 iptables 丢弃长期 SYN-RECV 连接

如果某些 SYN-RECV 状态的连接 持续过久,可以 丢弃这些连接:

sudo iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 -j DROP

• 这个规则 限制每个 IP 最大 SYN 连接数为 10,超出则丢弃。

🔴 影响:

  • 影响 NAT 用户(同一 IP 访问受限)
  • 如果多个用户 通过同一 NAT 路由访问,他们可能会因为 共享 IP 达到连接上限,导致部分用户访问失败。
  • 解决方案:
  • 提高 connlimit-above 值,例如:
sudo iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j DROP

• 仅对特定端口(如 SSH)限制:


sudo iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 5 -j DROP

🛠 3. 使用 sysctl 调整 TCP SYN 队列

提高 SYN 处理能力,减少服务器因 SYN-RECV 被耗尽:

sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096
sudo sysctl -w net.ipv4.tcp_synack_retries=2
sudo sysctl -w net.ipv4.tcp_syncookies=1
  • tcp_max_syn_backlog=4096:增加 TCP 半连接队列,减少丢失。
  • tcp_synack_retries=2:减少重试次数,缩短 SYN-RECV 状态。
  • tcp_syncookies=1:开启 SYN Cookies,防止 SYN Flood 攻击。

永久生效

echo "net.ipv4.tcp_max_syn_backlog=4096" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_synack_retries=2" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

🔴 影响:

  • 可能影响 TCP 连接稳定性
  • tcp_synack_retries=2 可能会导致 网络波动时连接超时,因为服务器在 2 次 SYN-ACK 失败后就放弃连接。
  • 解决方案:
  • 增加重试次数(但不过高):
sudo sysctl -w net.ipv4.tcp_synack_retries=3
  • SYN Cookies 可能影响性能
  • tcp_syncookies=1 开启 SYN Cookies 后:
  • 无法使用 TCP Fast Open(TFO)
  • 影响某些负载均衡策略
  • 解决方案:
  • 仅在检测到 SYN Flood 时开启:
sudo sysctl -w net.ipv4.tcp_syncookies=0

🛠 4. 使用 fail2ban 自动封锁 SYN 扫描

如果攻击者不断发送 SYN 请求,你可以使用 fail2ban 来 自动封锁可疑 IP:

sudo apt install fail2ban -y

创建规则 /etc/fail2ban/jail.local:

[syn-flood]
enabled = true
port = http,https,ssh
filter = syn-flood
logpath = /var/log/syslog
maxretry = 10
findtime = 60
bantime = 3600

然后重启 fail2ban:

sudo systemctl restart fail2ban

这会 在 60 秒内检测到 10 次 SYN 连接失败时封锁 IP 1 小时。

🔴 影响:

  • 可能误封合法用户
  • 如果某个用户 短时间内发起多个 TCP 连接,但并非恶意访问,仍可能被 误封。
  • 解决方案:
  • 增加 maxretry 值(如 maxretry = 20)。
  • 允许信任的 IP 访问:
sudo fail2ban-client set syn-flood ignoreip 192.168.1.0/24

📌 总结

  • ✅ 防止 SYN Flood:iptables 限制 SYN 速率
  • ✅ 丢弃恶意 SYN-RECV:iptables 限制并丢弃多余连接
  • ✅ 优化服务器 TCP 参数:sysctl 增强 TCP 处理能力
  • ✅ 自动封禁可疑 IP:fail2ban 自动屏蔽 SYN 攻击

如果你的服务器长期 SYN-RECV 过多,建议 先检查是否为正常流量,再进行上述防护措施!🚀

🔎 什么时候需要谨慎使用这些限制?

✅ 适用场景

适用情况 适合的防护策略
服务器遭遇 SYN Flood 攻击 iptables 限制 SYN 速率 & 开启 SYN Cookies
大量未知 IP 扫描 80/443 端口 fail2ban 自动封锁
大量 SYN-RECV 堆积,服务器资源被耗尽 调整 tcp_max_syn_backlog 并限制 connlimit-above

🚫 不适用场景

场景 可能的影响
API 服务器需要高并发连接 iptables 限制 SYN 可能导致连接失败
NAT 用户共享 IP 访问 connlimit 可能阻止正常访问
部分客户端网络不稳定 降低 tcp_synack_retries 可能导致掉线

📌 结论

⚠ 不要盲目阻止所有 SYN-RECV,建议逐步优化

  • 如果服务器确实遭遇 SYN Flood 攻击,再使用 iptables 限制 SYN 速率。
  • 如果 SYN-RECV 仅是正常网络延迟导致的,不要过度限制,避免影响正常流量。
  • 调整 TCP 参数时要谨慎,部分设置可能影响连接稳定性。
  • 结合 fail2ban 使用自动封锁策略,避免手动维护 IP 黑名单。

🚀 建议先分析 netstat -s | grep SYN,确定是否有真正的 SYN Flood 攻击,再决定是否进行限制!

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计