半夜发现服务器被攻击,而你身边没有同事也没有运维值班电话时,最正确的做法不是立刻去查攻击源头,而是先断网隔离、再去备份日志、最后才考虑恢复服务。这个顺序能帮你把损失控制在最小范围,同时保住最能追查攻击者的证据,很多人在这个节骨眼上容易慌,鼠标乱点,反而把系统搞得更糟,下面这份清单,就是专门给你这种“孤军奋战”的情况准备的。
半夜被攻击时,先做这三件事能保命
半夜爬起来发现网站打不开、CPU跑满、数据库被锁,这时候人容易懵。第一优先级不是“修好”而是“止血”,如果攻击者还在你的系统里,你每多等一分钟,数据就多泄露一分。
第一步:立即断开服务器公网连接,但别关电源
这是最关键的动作,也是最容易做错的地方。
- 不要直接去云控制台点“关机”,也不要直接拔网线。
- 正确做法:在SSH窗口里(如果你还连得上的话)立即执行
iptables -I INPUT -s 0.0.0.0/0 -j DROP,或者更粗暴的方式是直接执行systemctl stop network(CentOS 7/8)或systemctl stop NetworkManager(部分新版系统)。 - 如果你连SSH都已经断开了,就去云服务商控制台,找到“安全组”,把入站规则全部改为拒绝,或者直接把这台机器“移出安全组”。
这样做的好处是:内存里的进程不会被终止,证据链不会断,关机等于把攻击者的痕迹给“格式化了”,尤其是那些常驻内存的马,一关机就什么都没了。
第二步:保存当前的进程快照和网络连接状态
断网之后,你有一个短暂的时间窗口来做这件事,这时候服务器还是“热”的,攻击者的后门进程还在跑。
按顺序执行这三条命令,并把输出全部留存:
ss -tlnp > /tmp/network_connections.txt ps aux > /tmp/process_list.txt lsof +L1 > /tmp/deleted_files.txt
lsof +L1 这条命令特别关键,它能列出“被删除但仍然占用磁盘空间的文件”,这就是攻击者最常见的藏马手法。这些文件在磁盘上看不到,但还在内存里运行,把这个输出保存好,等天亮了交给专门做应急响应的同事或第三方服务商,这是最有价值的取证材料。
第三步:自己先看一眼“最可疑的那个进程”
不需要什么高级工具,用系统自带的 top 和 htop 就够了,按 CPU 使用率排序,看到哪个进程名字特别怪(比如一串乱码、或者看起来像系统文件但又不在正常路径里),立刻记下它的 PID。
然后用 ls -l /proc/该PID/exe 看看这个进程是从哪个文件启动的,如果是像 /tmp、/dev/shm、/var/tmp 这种目录里跑起来的,那基本实锤是攻击者的东西。
半夜服务器被攻击怎么办?先确认你对“被攻击”的判断准不准
有一种情况比被攻击更可怕,那就是误判,半夜眼花,看到CPU高了就以为被入侵,把自己吓得半死,结果只是白天写的脚本有死循环,所以断网之后,先花三分钟确认一下到底是真攻击还是假警报。

三种最容易被误判为攻击的“正常异常”
- 日志服务狂写磁盘:
rsyslogd或journald占满IO,这通常只是日志文件没做轮转,不是入侵。 - PHP-FPM 进程爆炸:如果站点是 WordPress 或 ThinkPHP,半夜被采集器爬了一遍,
php-fpm进程会短时间内激增,看起来像CC攻击,实际只是慢查询堆积。 - MySQL 的 binlog 暴涨:半夜跑定时任务批量更新数据,binlog 文件会快速膨胀,磁盘瞬间打满,看起来像被挖矿写文件,其实只是没做定时清理。
判断标准很简单:看 top 里CPU占用最高的进程名,如果是 mysqld、php-fpm、java 这种你认识的,基本是负载问题;如果出现不认识的名字,或者 bash、curl、wget 这种不该出现的高频进程,那才是真正的攻击。
攻击的常见套路:看看你中招的是哪一类
行业共识认为,针对Windows和Linux服务器的入侵攻击,绝大多数发生在凌晨2点到5点之间,这个时段人为值守最薄弱,攻击手法翻来覆去就那么几种,你可以对照行为来判断:
| 攻击类型 | 典型特征 | 你该重点查的地方 |
|---|---|---|
| 挖矿木马 | CPU飙到100%,进程名伪装成sys、kworker、systemd |
crontab -l,检查计划任务 |
| 勒索病毒 | 文件后缀被改,出现 README.txt 之类的勒索信 |
磁盘根目录和 web 目录的最近修改文件 |
| 后门/Webshell | 网站被植入eval($_POST)之类的代码 |
find /www/wwwroot -name '.php' -mtime -3 |
| DDoS流量攻击 | 带宽打满,连接数爆炸,但CPU不高 | 查看 ss -s 的 estab 数量 |
无人值守时网站被攻击的应急处理步骤:先留后路再动手
如果你已经断网、保存了快照,接下来要做的就是“留存后路”,这一步是为了防止攻击者在你恢复之后卷土重来。
备份关键证据:不只是日志
很多人以为备份就是打包一下 access.log,其实远远不够,你需要备份的是:
/var/log/目录下所有日志(包括secure、wtmp、btmp以外的那些不太起眼的日志)/tmp、/var/tmp、/dev/shm这几个目录的文件列表(不用复制内容,只ls -la就行)crontab -l的输出(攻击者最喜欢在这里挂定时任务)/etc/passwd和/etc/shadow的最后修改时间(看看有没有新增系统用户)
把这些打包成一个 tar 文件,有条件就传到另一台干净的机器上保存,没条件就放到云服务商的对象存储里去。注意,不要放到被攻击的这台机器上

,不然你清理完木马,再从这个压缩包里恢复文件,等于二次中毒。
判断残留风险:查看“异常登录”和“新增用户”
这一步比备份更重要,因为你要回答一个问题:攻击者是不是已经成了系统的“合法用户”?
执行 last -f /var/log/wtmp 查看最近登录记录,特别留意那些非正常时间段(比如凌晨1点到4点)的IP,再执行 awk -F: '$3==0 {print $1}' /etc/passwd 查看 uid 为0的用户,除了 root 之外如果还有其他用户名,那你这台机器基本已经属于攻击者的了。
如果发现新增了类似 test、guest、sysdba 这种明显不正常的用户,说明攻击者已经拿到了稳定后门,单纯的杀毒清马已经没有意义,强烈建议直接备份业务代码和数据库,然后重装系统。
被攻击后网站恢复服务的先后顺序:别急着把网线插回去
断网后如果手忙脚乱地恢复了服务,攻击者很可能在一分钟之内又进来,这里的核心原则是:先摘除后门,再恢复数据,最后恢复服务。
先杀掉“正在跑的东西”
那些被改过的可执行文件,一启动就会重新感染系统,所以顺序是:
- 杀掉可疑进程:
pkill -9 可疑进程名,利用之前ps aux看到的那个结果。 - 清理计划任务:
crontab -r清空当前用户的计划任务,同时检查/etc/cron.d/和/var/spool/cron/目录下有没有可疑的定时脚本。 - 清理启动项:检查
systemctl list-unit-files | grep enabled的输出,把那些不认识的、最近才启用的服务直接systemctl disable掉。
再决定“重新上线”的时机
在重新对外提供服务之前,至少确认以下三项:
- SSH 密码已经改掉(最好是改成密钥登录)
- 云控制台的安全组已经收紧,只保留
80、443、22这几个必要的端口 - Web 目录下的核心文件已经用
md5sum做过校验,和备份比对过没有异常
做完这些,再恢复网络连接。宁愿多花半小时检查,也不要急这半小时结果又被打穿,业内人士指出,相当一部分二次被攻击的情况,都是因为第一次清理不彻底、急着上线导致的。
半夜被攻击没人处理的情况下,你平时还能做什么准备
应急处理只能止损,真正的解法在事前,如果你经常需要半夜处理这类问题,说明你的基础防御配置有漏洞。
至少装一个“能喊醒你”的监控
半夜被攻击最常见的不是“被攻击”,而是“被攻击完你自己不知道”,其实更大的问题是,很多服务器被攻陷后不会立刻表现出宕机或高负载,攻击者会悄悄潜伏好几天。
所以你应该确保自己有电话级别的告警通道,比如云厂商自带的云监控(简米云云监控、酷番云拨测),或者更省事的方案是用 UptimeRobot 之类的第三方监控服务(不涉及备案要求),配置很简单:只要CPU超过80%持续5分钟,或者指定端口不再响应,就直接打给你的手机。

短信告警容易被忽略,电话响了才能把你叫醒。
写一份“傻瓜式”的处理脚本并放在桌面
平时花十分钟写一个应急脚本,半夜能省半小时的慌乱时间,这个脚本不需要多智能,只需要能一次性完成上面第一第二模块的操作:
#!/bin/bash # save_evidence.sh mkdir -p /evidence_$(date +%Y%m%d_%H%M%S) cd /evidence_$(date +%Y%m%d_%H%M%S) ss -tlnp > network.txt ps aux > processes.txt lsof +L1 > deleted_files.txt crontab -l > crontab.txt cp /etc/passwd ./ cp /etc/shadow ./ echo "evidence saved. Now dropping network..." iptables -I INPUT -s 0.0.0.0/0 -j DROP
把这个脚本放到 /root/ 目录下,并在手机里存一个打开终端执行它的备忘录,真到了半夜出事那一刻,你只需要一行命令就能完成止血和取证两个步骤。
凌晨三点被攻击,这几件事千万不要做
大家都在说“该做什么”,这里反过来提醒一下“鬼打墙”的操作,这些行为会让局面变得更糟糕。
别去云控制台“重启”或“制作镜像”
很多人第一反应是“做个镜像留证据再说”,然后就去控制台点“创建自定义镜像”,发现一直卡在“正在创建”转了半天,因为磁盘在疯狂写入,镜像根本做不完,有的更着急,直接点了“重置系统”,所有日志和证据瞬间清零,攻击者痕迹彻底消失。
别一个人去“追踪”攻击者的IP
半夜情绪容易上头,看到日志里有一个IP,就想用 ping 或者 traceroute 去打一下对方,这个行为没有任何意义,攻击者用的IP大多是跳板或被控的肉鸡,你追查不到真实位置,反而暴露了自己的处置意图,把这个IP记录下来,提交给云厂商的工单系统,让他们做封堵和溯源,这才是你的职责边界。
Q&A:关于半夜应急的常见疑问
问:半夜被攻击时,如果手边没有电脑只有手机,能应急吗?
答:可以,但仅限于“断开网络”,几乎所有主流云厂商的App都支持在手机上修改安全组规则,你可以登录App把入方向规则改成全部拒绝,这比任何命令都快,但取证和清理工作必须依赖电脑和SSH工具,手机只能做到最基础的物理隔离。
问:如果我的数据和备份全被加密了,还有机会恢复吗?
答:这取决于攻击者使用了哪种加密方式,通过现有情报来看,大部分被勒索病毒加密的数据,如果没有对应的私钥,靠暴力破解几乎没有希望,你应该立刻确认备份是否存在,以及备份是否与本地服务器物理隔离,如果有“隔离的离线备份”,直接通过重装系统、迁移数据来恢复即可,不要和攻击者谈条件或付费,无论是否付费,都建议你拨打 12321 网络不良与垃圾信息举报受理中心的电话同步举报,虽然不是执法机关,但无法直接帮你找回数据。唯一的捷径是恢复离线的异地快照或备份,本地磁盘上的数据基本不做指望。