luckygood logo

菲律宾服务器被DDoS攻击怎么办3步紧急止血附排障命令

StrataServer

凌晨两点四十七,oncall电话响了。马尼拉那台机器被打到120Gbps,上联PLDT的口子直接塞满,业务全拉闸。客户群里已经炸了,老板连发三条语音。你穿着拖鞋打开电脑,脑子里就一个问题:先干啥?

别急着加带宽。没用的。真没用的。120G的UDP反射放大你加到200G它还是满。正确姿势是三步走:先在本机用命令确认攻击类型和来源,再上iptables把能封的段先封了续命,最后打电话让机房开scrubbing或者走RTBH (Remotely Triggered Black Hole)把流量引到清洗中心。我实测下来,这套组合拳从接电话到业务恢复,45分钟。(别问我为啥这么熟练,问就是在MANIX值班那几年被薅起来太多次了)

先搞清楚你挨的是哪种打

这步跳过后面全白搭。菲律宾这边常见的攻击就三类,处置方式完全不一样,搞混了就是浪费时间:

  • SYN Flood——你跑ss -s看到SYN-RECV堆了几十万条,半连接队列直接溢出,内核在那疯狂回SYN-ACK但对面根本不完成三次握手
  • UDP反射放大——tcpdump -i eth0 -nn udp一抓,好家伙,全是198.51.100.x:123打过来的NTP反射包,单包能放大556倍,带宽瞬间打满
  • CC/HTTP Flood——带宽看着没满,但top里PHP-FPM或者Nginx worker全100%,access.log里同一个UA每秒几千次请求,全是GET /index.php

这里有个坑,踩了直接白干:很多人一看带宽满了就以为是volumetric,结果其实是CC把应用层打挂了、回包把出口撑爆的。所以先看CPU和进程状态,再看带宽,顺序不能反。

3种攻击对应处置方案对比

你现在的情况包特征第一步该干啥该找谁预期恢复
SYN队列溢出,连接建不上大量SYN包,无ACK开syncookies + 调somaxconn自己搞,不用找机房5-10分钟
带宽打满,ping都丢包UDP大包,源IP伪造让机房null route + 开清洗机房NOC + 上游ISP30-60分钟
带宽没满但应用卡死HTTP GET高频,UA异常Nginx限流 + fail2ban封IP自己搞,严重的上WAF15-30分钟

补充一嘴:菲律宾这边PLDT和Globe的清洗能力差距挺大。PLDT有自己的Arbor清洗中心,响应还行;Globe那边很多时候得走第三方,比如Cloudflare Magic Transit或者本地的小scrubbing vendor。签合同之前一定问清楚cleaning bandwidth上限是多少,别信什么"unlimited mitigation",那是扯淡。

这些骚操作会让你更惨

说几个我亲眼见过的翻车现场,都是真事:

  • 一哥们挨了UDP反射,第一反应是加iptables规则封IP。封了三千多条,内核softirq直接飙到95%,本来还能喘气的机器彻底死了。超过500条规则就别用iptables了,上BGP FlowSpec让上游路由器帮你丢
  • 有人被打的时候慌了,直接iptables -F清空所有规则。好嘛,之前配好的业务白名单也没了,攻击流量和正常流量一起涌进来,比之前还惨
  • 最离谱的一个:客户让机房直接null route了整个/24。是,攻击停了,业务也停了。null route是最后手段,不是第一步

还有一种情况你压根不该在菲律宾扛:如果你的用户100%在中国大陆,跟东南亚没有半点关系,那这台马尼拉的机器被打根本不该是你的问题。直接迁回港服或者国内节点,花那个清洗的钱不如换个地方部署。另外,纯L7的CC攻击,你买再多带宽和清洗都是往水里扔钱,该上WAF上WAF,该限流限流,别在网络层瞎折腾。

说回处置。下面这段命令是我每次oncall必跑的,存成脚本放/root/emergency.sh,被打的时候闭着眼敲:

#!/bin/bash
# 菲律宾节点紧急排障 - 先跑这个再说
# 这行是救命的,手贱别删

echo "=== 当前连接数TOP20来源IP ===" ss -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20

echo "=== SYN半连接数 ===" ss -s | grep -i syn

echo "=== 内核丢包/溢出计数 ===" netstat -s | grep -iE "drop|overflow|prune|collapse"

echo "=== 当前带宽占用(需要iftop或nload) ===" cat /proc/net/dev | grep eth0

确认是SYN Flood后,先开syncookies续命

echo 1 > /proc/sys/net/ipv4/tcp_syncookies sysctl -w net.ipv4.tcp_max_syn_backlog=65535 sysctl -w net.core.somaxconn=65535

封禁确认的恶意段(示例,替换成实际IP)

iptables -I INPUT -s 45.132.0.0/24 -j DROP iptables -I INPUT -s 185.220.0.0/16 -j DROP

echo "=== 封完后再看一眼 ===" ss -s

跑完这个你基本能判断是哪种攻击了。如果是volumetric(UDP反射那种),本机做不了太多事,赶紧给机房NOC打电话,让他们在上游路由器上做RTBH或者把流量导到scrubbing center。打电话的时候直接报你的IP和攻击类型,别说"我服务器好像被攻击了"这种废话,NOC的人最烦这个。

关于StrataServer这边,他们在马尼拉的节点上联走的是PLDT和Converge双线路,合同里写的cleaning bandwidth是40Gbps,超了之后走Arbor云端清洗。实测下来响应速度还行,NOC那边7×24有人,不用等半天。如果你现在用的机房连个英文NOC都没有、打电话全是voicemail,那真得考虑换一家了。

作者简介

前Globe Telecom NOC值班工程师,在MANIX(马尼拉互联网交换中心)干了7年peering运维和DDoS mitigation,经手过PLDT、Converge、DITO三家ISP的互联对接。2021年回深圳,现在专门帮出海企业搞东南亚IDC选型和应急排障。手里攒了一堆凌晨三点被oncall叫醒的血泪经验,最大的爱好是收集各种奇葩攻击的pcap包。

现在该干的事

如果你的菲律宾机器现在还在裸奔、没有任何清洗预案,今晚就把上面那段脚本存好,把机房NOC的电话存到手机通讯录里。别等被打的时候再翻文档。攻击不挑时间,但你的竞争对手会挑你最忙的时候下手。

常见问题解答

01 菲律宾节点被UDP反射放大打到200G,机房说超出合同清洗上限要加钱,这时候是先切BGP还是先null route?

先让机房在上游做RTBH把最胖的那条流引走,同时你这边把DNS切到备用IP。null route是最后手段,一route下去你自己业务也断了。切BGP的前提是你有AS号且机房支持,没有的话只能求着NOC帮你做。

02 iptables规则加到500条以上内核softirq就飙到90%,有没有不重启就清掉conntrack表的办法?

有。先iptables -F把规则清了,然后echo 1 > /proc/sys/net/netfilter/nf_conntrack_flush清conntrack。但根本解法是别用iptables扛大流量,上nftables或者让上游走BGP FlowSpec帮你在路由器层面丢包。

03 马尼拉机房上联是PLDT和Globe双线路,被打的时候能不能只切一条BGP session保住另一条的回国流量?

能,但前提是你自己的AS在两条上联都做了announce。操作就是在被攻击的那条session上withdraw你的prefix,流量自动走另一条。注意Globe那边回国走的是NTT transit,延迟会比PLDT的CN2高30-50ms。

04 CC攻击把PHP-FPM worker全打满了,加机器横向扩有用吗还是得先上WAF?

加机器能续命但治不了本。先上Nginx的limit_req把单IP QPS摁到50以下,fail2ban自动封异常UA。如果攻击源太分散(几万个IP每个打2QPS),那只能上WAF做行为分析,横向扩只是烧钱。