服务器被DDoS打挂了?别怕!Linux防火墙详细加固指南

admin 2026-04-21 01:57:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文基于实战经验详细介绍了Linux服务器遭受DDoS攻击时的应急响应流程和系统加固方案。核心内容包括:通过netstat命令快速识别SYNFlood攻击类型;紧急开启SYNCookies缓解攻击;使用iptables封禁攻击源IP;提供完整的iptables白名单规则配置、内核参数优化方法;并介绍了firewalld和fail2ban的进阶防护配置。文档强调采用默认拒绝策略、连接数限制、端口扫描防护等多层防御机制,并给出了从应急处理到长期加固的完整操作指南。 综合评分: 85 文章分类: 应急响应,安全建设,解决方案,网络安全,实战经验


cover_image

服务器被DDoS打挂了?别怕!Linux防火墙详细加固指南

原创

刘军军 刘军军

运维星火燎原

2026年4月20日 00:01 山西

在小说阅读器读本章

去阅读

做运维这么多年,其实最崩溃的瞬间,莫过于半夜被手机吵醒,一看全是告警信息,心里咯噔一下,完了又要搞个通霄了。

01

一次被DDoS攻击的惨痛经历

前段时间,一天凌晨3点多,手机突然间响个不停,直接把我从睡梦中叫醒。

拿起手机一看,全是报警:各种报警不停的在闪烁,CPU利用率100%;领导的电话紧跟着就打过来了,语气非常着急:“服务器怎么回事?访问不了!”;技术群里更是炸了锅,同事们接连反馈,所有请求全是超时,根本连不上。

我赶紧起床飞速下楼,打车来到公司,随手敲了条命令查连接状态,结果出来的那一刻,我人都蒙圈了:

netstat -an | grep SYN_RECV | wc -l
12580

12000多的SYN_RECV连接,完全可以肯定是DDoS攻击没跑了,而且来势汹汹,直接把服务器干死机了。那一瞬间,不用考虑肯定是先止损!

02

紧急处理

被攻击的时候,越慌越容易出错,分享我当时的应急步骤,亲测能用,大家遇到了可以直接照搬。

第1步:先搞清楚,到底是哪种攻击

先确认攻击类型,才能对症下药。两条命令搞定, 不需要修改直接就可以使用:

# 查看连接状态分布,看看哪种连接占比最高
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

# 查看 SYN_RECV 连接的源 IP,找出攻击源头
netstat -an | grep SYN_RECV | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20

结果出来一看,几乎全是SYN_RECV连接,典型的SYN Flood攻击,针对性处理就变得简单多了。

第2步:开启 SYN Cookies

这是应急的核心,相当于给服务器加了一层临时防护,能快速缓解SYN Flood的冲击,下面是临时开启和永久生效,可以直接复制粘贴使用:

# 临时开启,救急专用,重启服务器会失效
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# 永久生效,避免下次重启又出问题(编辑 /etc/sysctl.conf)
vim /etc/sysctl.conf
# 往里面加一行这个
net.ipv4.tcp_syncookies = 1

# 最后执行这个,让配置生效
sysctl -p

开了这个,CPU利用率立马就降一点下来,至少能够操作服务器,不至于卡的连命令都输不进去。

第3步:临时封IP

查出攻击源IP后,直接封!不管是单个IP,还是整个IP段,先封了再说,后续再慢慢调整。

# 用 iptables 封掉单个攻击源IP,把“攻击IP”换成实际查到的IP
iptables -A INPUT -s 攻击IP -j DROP

# 如果是多个IP来自同一个段,直接封整个段更省事
iptables -A INPUT -s 攻击IP段/24 -j DROP

注意:封IP的时候千万别把服务器的管理IP给封了,不然就彻底登录不上去了。

03

防火墙详细加固配置

紧急处理只是临时的,想要避免下次再被打挂,防火墙加固必须要做。下面是我整理的完整配置,都是实战中验证过的。

基础加固:iptables 基础规则

先清空防火墙现有规则,再重新配置,白名单机制最安全——默认全部拒绝,只开放我们需要的端口,这样能最大程度减少攻击面。

# ===== 1. 清空现有规则,避免旧规则冲突(先清再配,稳妥) =====
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -Z

# ===== 2. 设置默认策略(核心:默认拒绝,白名单优先) =====
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# ===== 3. 允许本地回环,这个必须开,不然服务器内部会出问题 =====
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# ===== 4. 允许已建立/相关的连接,不然我们自己都连不上服务器 =====
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ===== 5. 开放常用端口(根据自己的情况改,别照搬!) =====
# SSH(建议大家改成非22端口,能少很多暴力破解)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# HTTP(网站用,不用就删掉)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# HTTPS(必须开,现在网站基本都用这个)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 有其他端口(比如数据库、ftp),在这里加就行

# ===== 6. 防 DDoS/SYN Flood(重点配置,实测有效) =====
# 限制单个 IP 的并发连接数,超过50就拒绝,可根据自己服务器配置调整
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 -j DROP

# 限制单个 IP 的 SYN 请求速率,每秒不超过10个,突发不超过20个
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT

# 限制单个 IP 60秒内新建连接数,超过20个就封,防止恶意建连
iptables -A INPUT -p tcp -m state --state NEW -m recent --set
iptables -A INPUT -p tcp -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP

# ===== 7. 防端口扫描(很多攻击前都会先扫端口,提前拦截) =====
# 阻止空扫描、全扫描,这些都是端口扫描的常用手段
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# ===== 8. 保存规则(别配完就忘,不然重启服务器全白费) =====
# CentOS 系统用这个
service iptables save
# Ubuntu 系统用这个
iptables-save > /etc/iptables/rules.v4

千万注意:配置的时候,每一步最好先测试一下,别一次性配完再保存,万一出错,那服务器也就登录不上去了。

04

内核参数优化

内核参数优化能提升服务器的抗攻击能力,尤其是面对大规模DDoS的时候,能扛住更多压力。编辑sysctl.conf文件,直接加下面这些配置就行。

# 编辑 /etc/sysctl.conf,还是用vim编辑
vim /etc/sysctl.conf

# 往里面添加以下配置,我都标了注释,大家能看懂大概意思
# 开启 SYN Cookies,前面应急已经开了,这里再写一遍,确保永久生效
net.ipv4.tcp_syncookies = 1

# 增大半连接队列长度,应对更多的SYN请求
net.ipv4.tcp_max_syn_backlog = 4096

# 减少 SYN+ACK 重传次数,避免浪费服务器资源
net.ipv4.tcp_synack_retries = 2

# 减少 SYN 重传次数,道理同上
net.ipv4.tcp_syn_retries = 2

# 缩短 TIME_WAIT 时间(如果服务器TIME_WAIT太多可以开,按需调整)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 # 重点提醒:NAT环境慎用!容易出问题
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000

# 增大本地端口范围,避免端口被耗尽
net.ipv4.ip_local_port_range = 1024 65535

# 防止 IP 欺骗,提升服务器安全性
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁止 ICMP 重定向,避免被恶意利用
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 禁止发送 ICMP 重定向,同上
net.ipv4.conf.all.send_redirects = 0

# 最后执行这个,让所有配置生效
sysctl -p

注意:tcp_tw_recycle这个参数,如果你用的是云服务器,或者在NAT环境下,最好别开,容易导致正常连接出问题,我自己亲测过!

05

进阶:使用 firewalld

其实使用firewalld,比iptables操作更简单,配置也更直观,这是我自己整理了常用的加固配置,新手也能快速上手。

# ===== 1. 开启 firewalld,先确保服务能正常运行 =====
systemctl start firewalld
systemctl enable firewalld # 设置开机自启,避免重启后失效

# ===== 2. 开放常用服务,不用记端口号,直接写服务名更方便 =====
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https

# ===== 3. 防 DDoS 配置(核心规则,限制连接和请求速率) =====
# 限制单个 IP 访问80端口的速率,每秒不超过50个请求
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" accept limit value="50/s"'

# 富规则:限制单个IP并发连接,超过100就拒绝,更精准
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port protocol="tcp" port="80" accept reject reject-with="icmp-port-unreachable" limit value="100/s"'

# ===== 4. 生效配置,每次改完都要执行这个 =====
firewall-cmd --reload

06

高级:使用 fail2ban 自动封IP

手动封IP太麻烦了,使用用fail2ban,能自动监控日志,发现异常请求就自动封IP,简直是运维工程师的福音。

# ===== 1. 安装 fail2ban,不同系统命令不一样,别搞混了 =====
# CentOS 系统用yum安装
yum install fail2ban
# Ubuntu 系统用apt安装
apt install fail2ban

# ===== 2. 配置 SSH 防护(最常用,防止SSH暴力破解) =====
vim /etc/fail2ban/jail.d/sshd.local

# 往里面添加这些配置,注释写得很清楚,按需调整
[sshd]
enabled = true# 开启防护
port = 22 # SSH端口,改了端口就换成你的端口
maxretry = 3 # 最多尝试3次登录,超过就封
findtime = 300 # 5分钟内(300秒)尝试超过3次
bantime = 3600 # 封1小时(3600秒),可以改成更长时间

# ===== 3. 启动 fail2ban,设置开机自启 =====
systemctl start fail2ban
systemctl enable fail2ban

# ===== 4. 查看被封的 IP,随时掌握情况 =====
fail2ban-client status sshd

除了SSH防护,fail2ban还能监控nginx、apache的日志,防止网站被恶意攻击,可以根据实际的需求去配置。

07

完整的加固

| 序号 | 项目 | 操作 | 状态 | | — | — | — | — | | 1️⃣ | SYN Cookies | ✅ 开启 | 必做(没它扛不住SYN Flood) | | 2️⃣ | iptables 基础规则 | ✅ 配置 | 必做(白名单核心) | | 3️⃣ | 限制连接数 | ✅ 配置 | 必做(防止被打满连接) | | 4️⃣ | 内核参数优化 | ✅ 配置 | 必做(提升抗攻击能力) | | 5️⃣ | 禁用不必要的端口 | ✅ 关闭 | 推荐(减少攻击面) | | 6️⃣ | SSH 改非22端口 | ✅ 修改 | 推荐(减少暴力破解) | | 7️⃣ | fail2ban | ✅ 安装 | 推荐(解放双手) | | 8️⃣ | 监控告警 | ✅ 配置 | 推荐(早发现早处理) |

08

被攻击时的应急响应流程

再给大家梳理一遍应急流程,万一再遇到DDoS,按照这个步骤来,能最快止损,别手忙脚乱。

# 1. 先看连接状态,确认攻击类型(第一步必做)
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

# 2. 找出攻击源 IP,知道谁在打我们
netstat -an | grep SYN_RECV | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -20

# 3. 开启 SYN Cookies(如果没开,紧急救急)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# 4. 封攻击 IP,简单粗暴,先止损
iptables -A INPUT -s 攻击IP -j DROP

# 5. 联系云服务商(重点!如果是云服务器,别自己硬扛)
# 云服务商有更大的带宽和 DDoS 清洗能力,比自己折腾管用多了

注意:如果你用的是云服务器,遇到大规模DDoS,直接联系客服开启DDoS清洗,不要自己硬扛。

核心要点

  1. SYN Cookies 是防 SYN Flood 的神器,必须开,没它真的扛不住;
  2. 一定要用 白名单机制:默认拒绝所有请求,只开放需要的端口,减少攻击面;
  3. 限制单个IP的连接数和请求速率,防止被单个IP打满服务器;
  4. 内核参数优化要跟上,和防火墙配合使用,效果能翻倍。

防 DDoS 三件套:

  • SYN Cookies
  • ptables 限流
  • 内核优化

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:运维星火燎原 刘军军 刘军军《服务器被DDoS打挂了?别怕!Linux防火墙详细加固指南》

评论:0   参与:  0