Две трети трафика шли через чужую машину, и мы этого не видели
88 917 запросов из 133 715 — с одного адреса. Чужая виртуалка в том же дата-центре прозрачно форвардила 443 на наш сервер, а статистика посещаемости врала вдвое.
Мы разбирали лог за 10,85 часа: 133 715 строк, из них 88 917 — с одного адреса. Шестьдесят шесть процентов запросов к серверу приходили с одной машины, и это были не мы.
Что это оказалось
Чужая виртуалка в том же дата-центре, прозрачно пробрасывающая 443 на наш адрес. Она отдаёт наш HTML байт в байт и наш сертификат — шифрование терминируется у нас, а она лишь форвардит TCP.
Признаки, по которым её опознали:
- других портов, кроме 443, у неё нет;
- обратной записи DNS нет;
- ни один домен на неё не указывает.
То есть машина существует ровно для того, чтобы пропускать трафик через себя.
Кто ходил за ней
Профиль клиентов ботовый и однородный:
| Клиент | Запросов |
|---|---|
| одинаковый Chrome | 39 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 по журналу, за которым надо пойти на
сервер. Как это устроено — Аналитика угроз.
Читайте также
- Одна проба врёт в обе стороны: как мы мерили доступность и дважды ошиблисьПервая проверка сказала «заблокировано», вторая — «всё работает». Обе были неверны. 28 проб за две минуты, 29 % отказов и почему доступность — это доля.
- Почта встала, а на сервере не было ни одной причины: порты режет панель хостераПолдня диагностики на чистом сервере. iptables пуст, политика accept, DNS верный. Дропало на гипервизоре, и изнутри машины это не видно никаким способом.
Автор
Александр ЦапковОснователь Скоупворк
Веду платформу и её боевой контур сам: разработка, выкат, дежурство. Пишу о том, на чём мы обожглись, — с датами, замерами и ссылками на решения в репозитории.