蓝易云CDN:网站被攻击了该怎么办?如何恢复网站,如何避免网站被攻击?

网站被攻击了该怎么办?如何恢复与预防全指南

发现网站被攻击后的第一反应 🚨

网站被攻击通常有几种明显的信号:页面突然打不开、访问速度急剧变慢、网页内容被篡改跳转到陌生页面、后台登录异常、数据库出现不明操作记录。一旦发现这些症状,千万不要慌,但必须立刻行动——拖得越久,损失越大。

网站遭受的攻击大致分为两类:一类是流量型攻击(DDoS/CC),目的是让你的网站瘫痪无法访问;另一类是入侵型攻击,黑客通过漏洞拿到了服务器权限,篡改页面、植入木马、窃取数据。两类攻击的应急处理思路完全不同,下面分别讲清楚。

一、紧急止血:遏制攻击扩散 🔒

不管是哪种攻击,第一步都是控制局面防止恶化

如果是流量型攻击(网站打不开但服务器未被入侵)

先登录服务器确认当前的网络连接状态:

ss -s

这条命令会输出当前系统的TCP连接统计摘要,包括已建立连接数、半连接数、处于关闭等待状态的连接数等。如果你看到synrecv(半连接)或estab(已建立连接)的数值高得异常——比如平时几百现在飙到了几万——基本可以确认正在遭受流量攻击。

接下来快速定位异常IP:

ss -ntp state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -15

这条命令的工作流程是:先列出所有已建立的TCP连接(state established),提取每条连接的远程地址(第5列),用冒号分隔取出纯IP部分,然后按IP分组统计连接数,最后按数量从高到低排序输出前15个。连接数异常高的IP就是重点嫌疑对象。

确认后立即在防火墙层面封禁:

iptables -I INPUT -s 可疑IP -j DROP

-I INPUT表示将规则插入到INPUT链的最前面优先执行,-s指定来源IP,-j DROP表示直接丢弃该IP所有入站数据包且不返回任何响应。如果攻击IP太多封不过来,说明流量规模已经超出本地防御能力,必须立即将域名解析切换至高防CDN节点,让专业的清洗中心在上游过滤恶意流量。

如果是入侵型攻击(网页被篡改、被挂马、被植入后门) 😱

这种情况更危险,需要立即切断黑客的持续控制通道:

# 先备份当前被篡改的现场,用于后续排查
tar -czf /root/hacked_backup_$(date +%Y%m%d).tar.gz /var/www/html/

# 临时关闭Web服务,阻止恶意内容继续传播
systemctl stop nginx

第一条命令将整个网站目录打包压缩为带日期戳的备份文件,保存到root目录下。保留"案发现场"非常重要,后续需要分析黑客是通过什么漏洞进来的。第二条命令停止Nginx服务,虽然网站会暂时无法访问,但可以防止被篡改的页面继续对外展示(比如挂了恶意跳转或钓鱼页面),也能避免搜索引擎抓取到有害内容导致网站被降权。

二、排查溯源:找到攻击入口 🔍

止血之后,必须弄清楚黑客是怎么进来的,否则恢复了也会再次被入侵。

检查最近被修改的文件:

find /var/www/html -type f -mtime -3 -name "*.php" | xargs ls -la

这条命令在网站根目录中搜索所有最近3天内被修改过的PHP文件(-mtime -3表示修改时间在3天以内),并用ls -la展示这些文件的详细信息包括权限、所有者和精确修改时间。正常情况下你近期没有更新代码的话,这些被修改的文件很可能就是黑客植入的后门文件或被篡改的页面。

排查可疑的Webshell后门:

grep -rn "eval\|base64_decode\|system\|passthru\|shell_exec" /var/www/html/ --include="*.php"

这条命令在网站目录中递归搜索所有PHP文件的内容(-rn递归搜索并显示行号),查找包含evalbase64_decodesystempassthrushell_exec等高危函数的文件。这些函数常被黑客用来执行任意代码,正常的业务代码中应当极少出现。如果搜出了不认识的文件中包含这些函数,大概率就是Webshell后门。

查看系统登录记录:

last -20
lastb -20

last命令显示最近20条成功登录的记录,包括登录用户名、来源IP和登录时间。lastb则显示最近20条失败的登录尝试。如果发现陌生IP成功登录过root或其他账号,说明SSH口令可能已经被暴力破解。

三、恢复网站 🔧

排查完毕并清除所有后门文件后,用干净的备份进行恢复:

# 从备份中恢复网站文件
cp -a /backup/clean_site/* /var/www/html/

# 修复文件权限,防止权限过大被利用
chown -R www-data:www-data /var/www/html/
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

第一条命令从干净的备份目录(这里假设路径为/backup/clean_site/)将文件完整复制回网站目录,-a参数保留文件的原始属性。后面三条命令修复权限:将所有文件和目录的所有者改为Web服务运行用户www-data,目录权限设为755(所有者可读写执行,其他人可读和执行),文件权限设为644(所有者可读写,其他人只读)。权限设置过于宽松(比如777)是很多网站被入侵的直接原因。

恢复完成后重新启动Web服务:

systemctl start nginx

四、长效预防:避免再次被攻击 🛡️

恢复只是治标,做好以下防护措施才能治本。

1. 关闭不必要的端口和服务

# 查看当前所有监听端口
ss -tlnp

该命令列出所有正在监听的TCP端口(-t指定TCP,-l只看监听状态,-n显示端口号而非服务名,-p显示对应的进程名)。逐一核对每个端口是否为业务必须,不需要的服务果断关掉,暴露的端口越少攻击面就越小。

2. 强化SSH安全

vim /etc/ssh/sshd_config

修改以下关键配置项:

Port 58222
PermitRootLogin no
MaxAuthTries 3
PasswordAuthentication no

将SSH端口从默认的22改为不常用的高位端口(如58222),可以规避绝大部分自动化扫描。禁止root直接登录(PermitRootLogin no),改用普通用户登录后再su切换。将最大认证尝试次数降为3次,有效遏制暴力破解。关闭密码认证(PasswordAuthentication no),强制使用密钥登录,即使密码泄露也无法被利用。修改后执行systemctl restart sshd重启SSH服务生效。

3. 保持系统和程序更新

# Debian/Ubuntu 系统更新
apt update && apt upgrade -y

# CentOS/RHEL 系统更新
yum update -y

这是最基础也最容易被忽视的一环。大量的入侵事件都源于已知漏洞未及时修补。系统组件、Web程序(如WordPress、Typecho等)、使用的插件和主题,全部保持在最新稳定版本。

4. 接入CDN与WAF防护 🌐

将网站部署在具备Web应用防火墙(WAF)功能的CDN节点之后,可以同时解决两大问题:WAF能够实时拦截SQL注入、XSS跨站脚本、文件上传漏洞利用等应用层攻击;CDN的分布式架构天然具备流量清洗能力,能扛住大规模DDoS冲击。同时隐藏了源站真实IP,从根本上杜绝被直接攻击的风险。

5. 建立定期备份机制

# 每天凌晨3点自动备份网站和数据库
echo "0 3 * * * tar -czf /backup/site_\$(date +\%Y\%m\%d).tar.gz /var/www/html/ && mysqldump -u root -p'密码' 数据库名 > /backup/db_\$(date +\%Y\%m\%d).sql" | crontab -

该命令向crontab写入一条定时任务:每天凌晨3点执行网站目录打包压缩和数据库导出。有了完整的备份,即使遭遇最严重的入侵或勒索攻击,也能在最短时间内恢复业务。建议同时将备份文件同步到异地存储,防止备份和源站一起被破坏。

总结 📌

网站被攻击后的处置流程可以归纳为四个字:断、查、复、防。立即切断攻击通道止住损失,彻底排查入侵路径找到根源,用干净备份恢复业务上线,最后建立系统化的安全防线杜绝再犯。安全不是一次性工程,而是需要持续投入的日常运维习惯。

THE END