凌晨两点四十七,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 + 上游ISP | 30-60分钟 |
| 带宽没满但应用卡死 | HTTP GET高频,UA异常 | Nginx限流 + fail2ban封IP | 自己搞,严重的上WAF | 15-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的电话存到手机通讯录里。别等被打的时候再翻文档。攻击不挑时间,但你的竞争对手会挑你最忙的时候下手。