Серверы и мониторинг

Две трети трафика шли через чужую машину, и мы этого не видели

88 917 запросов из 133 715 — с одного адреса. Чужая виртуалка в том же дата-центре прозрачно форвардила 443 на наш сервер, а статистика посещаемости врала вдвое.

Александр Цапков10 сентября 20263 мин

Мы разбирали лог за 10,85 часа: 133 715 строк, из них 88 917 — с одного адреса. Шестьдесят шесть процентов запросов к серверу приходили с одной машины, и это были не мы.

Что это оказалось

Чужая виртуалка в том же дата-центре, прозрачно пробрасывающая 443 на наш адрес. Она отдаёт наш HTML байт в байт и наш сертификат — шифрование терминируется у нас, а она лишь форвардит TCP.

Признаки, по которым её опознали:

  • других портов, кроме 443, у неё нет;
  • обратной записи DNS нет;
  • ни один домен на неё не указывает.

То есть машина существует ровно для того, чтобы пропускать трафик через себя.

Кто ходил за ней

Профиль клиентов ботовый и однородный:

КлиентЗапросов
одинаковый Chrome39 809
просто Firefox, без версии33 890
сканеры Censys, Nmap NSE, l9exploreостальное

Живых мобильных клиентов — ни одного. Для публичного сайта это невозможно: мобильных обычно половина.

Два следствия, и второе дороже

Статистика посещаемости врала вдвое. Не «немного завышала» — две трети цифры были чужими. И это не видно ни в одном отчёте, пока не сложишь адреса руками: в сводках всё выглядит как рост.

Соблазн «доверять заголовку с реальным адресом» — прямая дыра. Мысль напрашивается: раз прокси прозрачный, попросим его передавать настоящий адрес клиента и будем считать по нему. Тогда чужая машина получает право называть любой адрес — а вместе с ним обходить любые ограничения по адресу и подписывать чужими адресами наши журналы.

Проверили фактом, а не рассуждением: за этим прокси заголовок с адресом пуст. Восстановить настоящие адреса невозможно в принципе.

Что сделали

Резать. Заносить в доверенные — нельзя: доверенный прокси это тот, которым вы управляете, а не тот, который сам к вам пришёл.

Отдельным решением оставили и то, что real_ip в nginx у нас выключен осознанно: доверенного прокси перед сервером нет, и прямой трафик логируется настоящим адресом. Включить разбор заголовка значило бы поверить кому угодно.

Как проверить у себя

# топ адресов за сутки
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

Если один адрес даёт больше половины — у вас та же история. Дальше смотрите, что это за машина:

# порты и обратная запись
nmap -Pn -p- <адрес> | head -20
dig -x <адрес> +short

Ни портов, ни обратной записи, ни доменов — прозрачный прокси.

Что из этого следует

Всякая цифра о посещаемости, собранная на сервере, считает соединения, а не людей. Обычно разница невелика, и про неё забывают. Но она перестаёт быть невеликой ровно тогда, когда кто-то ставит перед вами свою машину, — а узнать об этом можно только сложив адреса.

Правило, которое мы держим теперь: раз в период смотреть на распределение адресов, а не только на сумму. Сумма растёт одинаково и от клиентов, и от чужого прокси.


Мы вынесли такие вещи в продукт: подбор паролей, сканы портов и аномалии по адресам видны графиком, а не выводом awk по журналу, за которым надо пойти на сервер. Как это устроено — Аналитика угроз.

Аналитика угроз: подбор паролей и сканы портовКто подбирает пароли, сканирует порты и с каких сетей — по журналам сервера.

Читайте также

Автор

Александр ЦапковОснователь Скоупворк

Веду платформу и её боевой контур сам: разработка, выкат, дежурство. Пишу о том, на чём мы обожглись, — с датами, замерами и ссылками на решения в репозитории.