我在 VPS 上运行了一个 MySQL 数据库服务器。该服务器通过私有网络接口连接到 Web 服务器,除了 SSH 和 PHPMyAdmin 安装外没有其他公共服务。
前段时间,我安装了一条 Monit 规则来检查公共网络接口(不是 MySQL 数据传输的接口)上的异常流量:
# Monitor network connection
check network public with interface eth1
if failed link then alert
if changed link then alert
if saturation > 90% then alert
if download > 10 MB/s then alert
if total upload > 1 GB in last hour then alert
几个月前,我开始收到由该规则触发的大量 Monit 警报:
Upload bytes exceeded Service public
Date: Tue, 04 Apr 2017 13:11:55
Action: alert
Host: myhostname.com
Description: total upload 1.0 GB matches limit [upload rate < 1024.0 MB in last 1 hour]
Your faithful employee,
Monit
这些警报实际上与服务器上的任何使用量峰值无关,而且由于没有真正面向公众的服务,我无法想象是什么导致了如此大的上传带宽。磁盘空间似乎也没有被使用。
我怎样才能找出导致上传 1GB 以上的“某些内容”的原因、上传了什么以及从哪里上传?
答案1
听起来好像某些东西正在运行某种定期的 SELECT 查询,并将数据从公共接口转储出来。
Wireshark、pcap 或其他数据包监听变体会显示源(SQL 服务器)和目标、使用的端口/协议等。锁定端口 3306(TCP 或 UDP),即 MySQL 端口。
如果您的系统上有大量磁盘空间,您可以设置数据包监听来保存包含公共接口上的网络流量的 pcap 文件。
我建议使用假脱机模式,比如说,10GB,分成 2GB 的文件,这样您就不会使用超过这个空间量,但您应该能够捕获至少一个上传(或至少是它的开始)。可能需要一两个小时才能填满,或者只需几分钟,但使用此方法您将始终拥有至少 8GB 的完整对话(最后一个文件将小于 2GB 并且将是最新数据)。
一旦你了解了发生了什么,你就可以采取措施来缓解。首先,我建议关闭公共端口上的 3306 端口,并在 MySQL 的权限内锁定“可以运行查询”的凭证。这样就可以锁上谷仓门了。
答案2
识别 MySQL 方面正在发生什么情况的一种可能方法是启用慢查询日志,然后建立一个非常低的阈值来捕获每个语句。然后,您可以查看慢查询日志以查看当时正在运行的内容。
另一种方法是定期转储“show full processlist \G”。这样可以更轻松地查看特定时间正在运行的内容。