服务器带宽被某个 IP 占满,是运维中极为常见且危害巨大的问题之一。当服务器出口带宽被瞬间掏空时,所有正常业务流量都会受到影响,表现为网站无法打开、延迟飙升、接口请求超时、SSH 连接断开甚至服务器完全失联。攻击者往往通过大量请求占用带宽资源,使服务器陷入“带宽枯竭”状态,导致服务不可用。想要快速查出是哪一个 IP 正在占满带宽,并高效封禁,需要结合系统工具、流量监控、防火墙策略以及日志分析多层联动,才能做到迅速止损并恢复业务稳定。
带宽被某个 IP 占用通常分为两类情况:一种是攻击性流量,例如恶意扫描、CC 攻击、异常请求洪泛、端口探测等;另一种则是异常业务请求,例如 API 被刷、接口被批量调用、某些爬虫大量重复抓取,或内部服务错误导致无限重试。不管是攻击还是业务异常,其核心特点都是某个 IP 或某一段 IP 在短时间内制造大量流量,导致出口带宽被完全挤占,此时服务器就会出现访问延迟极高或直接掉线的情况。判断源头 IP 的关键,就是在服务器仍能响应的窗口期内快速分析实时流量情况。
当怀疑带宽被某个 IP 占满时,最直接的方式是使用 iftop 工具查看实时带宽占用情况。iftop 会显示每个连接的流量大小,以及流量的来源与目标 IP。使用命令:
iftop -n
其中 -n 参数会禁止解析域名,让你更快速定位 IP 地址。在 iftop 列表中,如果某个 IP 的发送或接收带宽明显异常,比如持续占用 50%、80% 甚至 100% 带宽,那么基本可以锁定其为源头。iftop 的操作界面中可以根据 RX、TX 以及 TOTAL 进行排序,这有助于在海量连接中找出占用最大的 IP。
如果服务器暂时卡顿,无法通过 iftop 及时显示,可以使用 nethogs 检查进程级别的流量,以判断是否为某个程序异常导致大量流量:
nethogs -d 2
若发现流量不是来自外部 IP,而是某个内部进程产生的,例如 API 接口陷入循环,或程序逻辑错误导致持续发送数据,那么应立即处理该进程,而不是封禁外部 IP。
进一步查看更细致的连接信息,可以使用 netstat 命令分析当前连接数量:
netstat -tunp | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head
该命令可以显示当前连接数量最多的 IP,如果某个 IP 出现大量连接,尤其是超过数百甚至数千连接,很可能正在发起高频访问或攻击行为。从连接数的角度判断 IP 是否异常,是 CC 攻击排查中最常用的方法。如果发现某个 IP 或某段网段连接数极高,应当立即进入封禁流程。
当确定了恶意 IP 地址后,就需要通过防火墙快速封禁。例如使用 iptables:
iptables -I INPUT -s 123.45.67.89 -j DROP
若攻击来自某段网段,则可以封整个 IP 段:
iptables -I INPUT -s 123.45.0.0/16 -j DROP
使用 nftables 的服务器可以执行:
nft add rule inet filter input ip saddr 123.45.67.89 drop
若使用 firewalld,则可以通过:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="123.45.67.89" reject' --permanent
firewall-cmd --reload
封禁 IP 后,应再次观察 iftop、sar 或带宽监控,确认流量是否恢复正常。如果带宽下降、服务器变得流畅,则说明已成功阻断异常来源。
某些情况下,恶意 IP 会持续更换,例如出现大量僵尸网络攻击、代理 IP 攻击、伪造 IP 攻击等。这种情况下,单个 IP 的封禁不再有效,需要切换策略,例如:
限制连接数:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
限制每个 IP 请求速率:
iptables -A INPUT -p tcp --dport 80 -m limit --limit 30/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP
这些规则能有效防止单个 IP 瞬间制造大量连接,降低被攻击导致带宽爆满的概率。
如果攻击者使用 UDP 洪泛或 ICMP 洪泛,则应通过协议限制进行封禁:
iptables -A INPUT -p udp -j DROP
但需谨慎使用,因为有些业务依赖 UDP。例如 VoIP、游戏服务器等。
高频带宽攻击往往需要借助第三方清洗服务才能完全解决,例如使用高防服务器、CDN 回源保护、云防火墙等。尤其在带宽级攻击达到 Gbps 甚至 Tbps 级别时,单机无法承受,需要将流量引入专业抗攻击网络,由清洗中心过滤掉恶意流量后再回源。
除了实时封禁,还需要分析攻击行为记录,查看日志文件,例如 Nginx 日志:
tail -f /var/log/nginx/access.log
或 Apache:
tail -f /var/log/httpd/access_log
通过日志可以判断 IP 是否为爬虫攻击、是否重复访问某个接口,或者是否针对特定 URL 发起高并发冲击。这类记录有助于分析攻击模式,从而制定更精准的防御策略。
为了避免未来类似问题再次发生,服务器需要建立自动化监控体系。通过自动化方式,能在攻击初期第一时间拦截流量,避免带宽被完全占满。对于业务接口被刷、程序异常导致带宽占满的情况,需要从源头优化逻辑,例如限制爬虫访问、加上防刷机制、设置 API 限速、缓存重复请求、增加验证码等。
总结:要快速查出占满带宽的 IP,需要利用实时流量工具(iftop、nethogs)、连接分析工具(netstat、ss)、日志记录和智能监控结合使用。在成功定位后,再通过 iptables、nftables、云防火墙等手段及时封禁。长期来看,应结合业务防刷、CDN 保护、高防资源来避免类似事件反复发生。带宽是服务器极其珍贵的资源,一旦被攻击者占满,业务会瞬间瘫痪,因此快速排查、即时阻断与长期防护缺一不可。