У меня есть сервер базы данных MySQL, работающий на VPS. Сервер подключен к веб-серверу через частный сетевой интерфейс и не имеет общедоступных служб, кроме 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
Эти предупреждения на самом деле не коррелируют с каким-либо всплеском использования на сервере, и, поскольку нет реальных общедоступных сервисов, я не могу себе представить, что может быть ответственным за такой объем загрузки. Дисковое пространство, похоже, тоже не используется.
Как я могу узнать, что вызывает загрузку более 1 ГБ «чего-то», что загружается и откуда?
Похоже, что-то выполняет какой-то периодический запрос SELECT, который выгружает данные из общедоступного интерфейса.
Wireshark, pcap или другой вариант отслеживания пакетов выявляют источник (сервер SQL) и цель, используемые порты / протоколы и т. Д. Обнулите порт 3306 (TCP или UDP), который является портом MySQL.
Если у вас много места на диске в системе, вы можете настроить отслеживание пакетов для сохранения файлов pcap, содержащих сетевой трафик, через ваш общедоступный интерфейс.
Я бы порекомендовал режим буферизации, скажем, 10 ГБ, разбитый на файлы по 2 ГБ, чтобы вы никогда не использовали больше этого количества места, но вы должны иметь возможность захватить хотя бы одну из этих загрузок (или, по крайней мере, ее начало). Это может занять час или два, или всего несколько минут, но при использовании этого метода у вас всегда будет не менее 8 ГБ неповрежденного разговора (последний файл будет <2 ГБ и будет самыми новыми данными).
Как только вы поймете, что происходит, вы можете предпринять шаги для смягчения последствий. Сразу же я бы порекомендовал закрыть порт 3306 на общедоступном порту, а также заблокировать кредиты «Может выполнять запросы» в разрешениях MySQL. Это закроет дверь сарая.
Возможный способ определить, что происходит со стороны MySQL, - включить журнал медленных запросов, а затем установить действительно низкий порог для захвата каждого оператора. Затем вы можете просмотреть журнал медленных запросов, чтобы узнать, что выполнялось в то время.
Альтернативный подход - периодически сбрасывать "показать полный список процессов \ G". Так будет намного легче увидеть, что работает в данный момент.