ESPNBottom 10: Time not on Michigan's side in this onePunchIndependence: FG declares Thursday public holidayDaily MaverickFOUL PLAY: Manchester City’s ‘sham’ deals leave Premier League in uncharted territoryThe Jerusalem PostSohlberg sets Central Elections Committee hearing on Likud petition against Fly&Vote initiativeBollywood HungamaWho is Lalit Prabhakar? Meet the National Award-winning actor playing Ajmal Kasab in PrahaarInquirerRidon’s tip to defense: Don’t remove Poa, he’s the best you haveHong Kong Free PressEx-husband, in-laws accused of murdering Hong Kong model appear in courtGuardian SportSouth Africa v Australia: third men’s one-day international – liveBBC NewsGreggs to shut four factories and cut 740 jobsالشرقطائرة فلاي دبي.. إصابة الطيار ومساعده وتحقيقات لمعرفة ما جرى على متنهاVilaWeb[INTERACTIU] Què canvia el decret d’habitatge si sou llogaters o propietaris?La PresseLongueuil | Un conducteur de 17 ans percute une résidence en fuyant les policiers
The Daily Newsstand · Free, Always
Wednesday, September 30, 2026

Один адрес на всех: 1 957 831 смена мобильного IP за сутки и NAT оператора

Translate

Ко мне регулярно приходят с одним и тем же вопросом, только с двух сторон. Антифрод-инженеры спрашивают, почему нельзя просто забанить подсеть, с которой летит мусор. Разработчики парсеров спрашивают, почему после смены IP их всё равно узнают. Оба вопроса упираются в одну механику, которую обычно рисуют как смартфон, облачко и стрелочку.

Я решил вместо облачка взять телеметрию нашей сети за одни сутки и посмотреть, как эта механика выглядит в числах. Это продолжение статьи «IP сменился, отпечаток остался»: там было про отпечатки, здесь про сам адрес. И начну с поправок к той статье, потому что часть цифр в ней оказалась неверной.

Коротко о главном. Мобильный адрес дорого банить не потому, что прокси какие-то особенные. За одним публичным адресом оператора в один и тот же момент сидят разные абоненты, и это видно даже по нашим собственным модемам: больше половины адресов за сутки побывали у двух и более из них. Откуда это и что из этого следует для обеих сторон, ниже.

Что делает NAT оператора

Механика в два абзаца. Модем, регистрируясь в сети, поднимает сессию передачи данных и получает адрес. Как правило, это приватный адрес из диапазона вроде 100.64.0.0/10, и снаружи его не видно. В интернет трафик выходит через NAT-узел оператора, у которого есть пул публичных адресов, и сайт видит адрес из этого пула.

Когда модем рвёт и заново поднимает сессию, узел снова выдаёт ему адрес из пула. Чаще другой, иногда тот же. Никакого «запроса на новый IP» в протоколе нет, есть только переподключение, а дальше как повезёт с пулом. Размер пула и число абонентов на адрес операторы не публикуют, и я их не знаю. Но нижнюю границу можно увидеть по собственной сети, к этому вернусь.

Схема: несколько абонентов за одним NAT-узлом выходят в интернет с одного публичного адреса

Схема: несколько абонентов за одним NAT-узлом выходят в интернет с одного публичного адреса

Откуда цифры

Окно разбора: 24 часа с 20:31 28.09.2026 по 20:31 29.09.2026 по Москве, то есть с вечера понедельника до вечера вторника. Источник один: внутренний лог, куда пишется каждая смена IP на каждом модеме сети. В записи есть модем, порт, источник команды (таймер или вызов ссылки/API), новый внешний адрес и длительность смены. Длительность считается от команды до момента, когда агент ноды увидел новый внешний адрес. То есть в неё входит и наша собственная проверка, а не только работа оператора.

Всё посчитано по полному логу, без выборки. Схема ниже условная, но запрос по смыслу такой:

SELECT count(*)                         AS attempts,
       sum(new_ip IS NOT NULL)          AS changes,
       count(DISTINCT modem_id)         AS modems,
       count(DISTINCT new_ip)           AS uniq_ips,
       avg(CASE WHEN new_ip IS NOT NULL
                THEN duration_s END)    AS avg_duration_s,
       avg(source = 'timer')            AS timer_share
FROM ip_changes
WHERE commanded_at >= '2026-09-28 20:31'
  AND commanded_at <  '2026-09-29 20:31';

Две вещи я отделил сразу. Первая: точные копии записей, то есть тот же модем, та же секунда, тот же адрес, та же длительность. Их 1 266, это 0,14% записей о сменах по ссылке, и они выброшены до всех расчётов. Вторая: попытки, после которых модем нового адреса не получил. Их 105 023, или 5,1% от всех (3,2% по таймеру и 7,6% по ссылке). В «смены» они не входят, но и не прячутся.

Сутки в цифрах

Метрика

Значение

Попыток сменить IP

2 062 854

Из них с новым адресом

1 957 831

Без нового адреса

105 023 (5,1%)

Модемов

9 458

Прокси-портов

7 734

Доля попыток по таймеру

57,4%

Медианный интервал таймера

120 с

Таймерных интервалов, кратных минуте

91,3%

Длительность смены, среднее (таймер / ссылка)

4,47 с / 4,94 с

Длительность смены, 95-й перцентиль (таймер / ссылка)

11,6 с / 12,7 с

Уникальных публичных адресов

379 101

Медианный модем за сутки

94 смены, 87 адресов

1 957 831 смена за 86 400 секунд это одна смена каждые 44 миллисекунды, если размазать равномерно. Равномерно, конечно, не бывает, но масштаб понятен: пока вы читали этот абзац, где-то переподключилась сотня модемов.

Сначала поправки к прошлой статье

Дубли в логе. В прошлый раз четверть записей о сменах по ссылке (25,9%) оказалась копиями, и я обещал найти причину. Нашли в тот же день. Записи копились пачками в общей очереди, и при параллельных запросах одну и ту же пачку иногда записывали в лог два-три раза. Теперь каждая смена пишется сразу, одной строкой. Итог за эти сутки: 0,14% точных копий вместо 25,9%.

«68% возвращают тот же IP при интервале меньше 30 секунд». Это были те же дубли: копия записи выглядит как смена с нулевым интервалом и тем же адресом. На чистом логе 27,9% смен по ссылке идут меньше чем через 30 с после предыдущей смены того же модема, и тот же адрес возвращается только в 1,25% из них. Совет «дождитесь ответа о завершении и только потом проверяйте адрес» остаётся правильным, но цифра под ним была неверной.

«8% повторов адреса после смены по ссылке». Здесь я считал неудачную попытку, когда адрес не получен, за адрес, и две неудачи подряд выглядели как «вернулся тот же IP». Без неудачных попыток предыдущий адрес возвращается в 1,9% смен по ссылке и в 1,3% по таймеру (цифра по таймеру была верной).

«562 модема весь день получали один и тот же адрес». В эту группу по той же причине попали модемы, у которых смена не проходила вовсе, и модемы, которые за сутки сменили адрес всего один раз. Модемов, которые сделали хотя бы 10 успешных смен и весь день получали один адрес, в этот раз 27.

Выводы прошлой статьи про гребёнку таймера и отпечатки эти поправки не трогают. А вот про «липкий NAT» я там написал больше, чем показывали данные.

Один адрес, много модемов

Теперь то, ради чего всё затевалось. За сутки наши модемы получили 379 101 разный публичный адрес при 1 957 831 смене, то есть каждый адрес в среднем появлялся у нас 5,2 раза. Только 19,4% смен дали адрес, которого наша сеть в эти сутки ещё не видела. Остальные четыре из пяти выдали адрес, который уже был у какого-то нашего модема.

Разных модемов на один адрес при этом много.

Сколько разных модемов получали один и тот же адрес за сутки

Сколько разных модемов получали один и тот же адрес за сутки

55,7% адресов за сутки побывали у двух и более наших модемов, 9,8% у десяти и более, один адрес у 120 разных модемов. Это модемы на разных SIM-картах и часто на разных серверах, их объединяет только NAT-узел оператора.

Но «за сутки» ещё не значит «одновременно». Поэтому я посчитал жёстче: для каждой смены проверил, держит ли этот же адрес в этот момент другой наш модем. «Держит» значит, что получил этот адрес раньше и с тех пор IP не менял, но не дольше заданного окна. Модемы на одной ноде между собой не сравнивал, оставил только пары на разных нодах, так оценка получается заведомо консервативной.

Результат зависит от окна, поэтому даю три значения. Если считать, что модем держит адрес не дольше 5 минут, то в 4,2% смен модем получает адрес, который прямо сейчас уже занят другим нашим модемом. При 15 минутах это 5,5%, при часе 6,4%.

То есть примерно каждая двадцатая смена отдаёт модему адрес, через который в ту же минуту уже ходит кто-то ещё. И это только те «кто-то», которых видим мы. Живых абонентов оператора за тем же адресом мы не видим вообще, а их там заведомо не меньше.

Сколько смен, столько и адресов

В среднем модем сделал за сутки 211 смен, но это среднее тянут вверх редкие модемы с тысячами смен. Медианный модем сменил адрес 94 раза и получил 87 разных адресов.

Смены и уникальные адреса по каждому модему

Смены и уникальные адреса по каждому модему

Почти все модемы лежат на диагонали: каждая смена даёт новый для этого модема адрес. Отходят от неё только самые активные, с сотнями и тысячами смен. Пул узла конечен, и где-то на трёхсотой смене за день модем начинает получать адреса, которые у него уже были.

Сколько длится смена

По таймеру в среднем 4,47 с, по ссылке 4,94 с, медиана 3,5 и 3,8 с. В 5 секунд укладываются 75,8% смен по таймеру и 67,3% по ссылке, в 10 секунд 93,7% и 92,1%. Хвост: 95-й перцентиль 11,6 и 12,7 с, 99-й около 17–18 с, максимум за сутки 31,9 с по таймеру и 44 с по ссылке.

Распределение длительности смены IP: таймер и ссылка

Распределение длительности смены IP: таймер и ссылка

Куда уходят секунды. Разрыв сессии, повторная регистрация в сети, поднятие контекста данных, выдача адреса на NAT и в конце наша проверка внешнего адреса. Сколько из этих секунд наши, а сколько операторские, я не знаю. Для этого надо параллельно снимать события с самого модема.

Практический вывод для клиентского кода: закладывайте ожидание не на среднее, а на хвост. Таймаут в 5 секунд оборвёт от четверти до трети смен, таймаут в 20 секунд почти ни одной.

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

import time, requests

PROXY = "http://user:pass@host:port"
CHANGE_URL
= "https://.../change?key=..."
ECHO = "https://api.ipify.org"

def

ext_ip():    r = requests.get(ECHO, proxies={"http": PROXY, "https": PROXY}, timeout=10)    return r.text.strip()

old = ext_ip()
t0 = time.monotonic()
requests.get(CHANGE_URL, timeout=60)
while True:
    try:
        new = ext_ip()
    except requests.RequestException:
        new = None
    if new and new != old:
        break
    if time.monotonic() - t0 > 60:
        new = "TIMEOUT"
        break
    time.sleep(0.5)
print(old, "->", new, round(time.monotonic() - t0, 2), "s")

Числа из него будут систематически выше наших: к смене добавляются два HTTP-запроса через прокси и шаг опроса.

Таймер против ссылки

57,4% попыток сделал таймер, остальное это вызовы ссылки или API из клиентского кода. Медианный интервал таймера 120 секунд, и 91,3% таймерных интервалов кратны ровно минуте.

Интервалы между сменами по таймеру: гребёнка ровных минут

Интервалы между сменами по таймеру: гребёнка ровных минут

Поле интервала принимает любое число секунд, но люди ставят 60, 120, 300, 600. Никто не ставит 97. Для защиты это подарок: сессия, у которой адрес меняется ровно раз в 120 секунд плюс-минус длительность смены, а куки и TLS-отпечаток остаются прежними, видна издалека. Подробно об этом было в прошлой статье, и цифры с тех пор почти не сдвинулись: ровно 120 с сейчас 58,6% интервалов, тогда было 55,1%.

У ссылки свой ритм, и он не менее узнаваем. 27,9% смен по ссылке идут меньше чем через 30 секунд после предыдущей, у каждой десятой интервал 7 секунд и меньше: скрипт дёргает ссылку сразу, как только получил ответ. Среди интервалов длиннее 30 секунд медиана 251 с, а отдельный пик на 305 с (11,5%) это всё тот же цикл «спать пять минут, дёрнуть ссылку» плюс время самой смены. Кратных минуте среди смен по ссылке 5,4%. Часов у ссылки нет, но расписание всё равно есть.

Почему мобильный адрес дорого банить и где всё-таки ловят

Теперь для стороны защиты, потому что половина читателей именно там.

Бан публичного адреса мобильного оператора это бан всех, кто сейчас сидит за ним на NAT. По нашим же данным адрес за сутки успевает побывать у нескольких наших модемов, примерно в каждой двадцатой смене одновременно с другим нашим модемом, а параллельно через него ходят обычные абоненты. Цена ложного срабатывания на мобильных диапазонах несравнимо выше, чем на дата-центровых, поэтому зрелый антифрод работает здесь весами, а не чёрными списками.

Репутация мобильного адреса обычно превращается в трение, а не в блокировку: капчу, лимит частоты, повышенный порог для рискованных действий. Смена IP такое трение сбрасывает, и дальше начинается то, что она не сбрасывает. Отпечаток TLS, порядок и значения заголовков, параметры HTTP/2, куки и локальное хранилище, тайминги действий. Если сессия на новом адресе несёт тот же отпечаток и те же куки, антифрод её склеивает, и смена адреса выглядит для него как обычный переезд абонента между базовыми станциями. Так выглядит и настоящий абонент, поэтому сама смена не флаг. Флаг это комбинация: адрес меняется по расписанию с точностью до секунды, а всё остальное застыло.

И обратная сторона. Раз четыре смены из пяти приносят адрес, который сегодня уже видели, «новый IP» не значит «чистый IP». Если прошлый владелец адреса отличился, трение достанется и вам.

Одно предложение, которое я бы повесил на стену в обеих командах.

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

Что не получилось и чего я не знаю

· Сколько живых абонентов оператора сидит за одним адресом, я не знаю. Всё, что выше, это нижняя граница по нашим модемам.

· «Модем держит адрес» это модель, а не наблюдение. Если оператор сам сменил модему адрес без нашей команды, мы этого не видим, поэтому одновременность дана при трёх разных окнах.

· Какая часть из 4,5–5 секунд смены приходится на нашу проверку, а какая на оператора, не разделено.

· Разбивку по операторам в этот раз не даю: строить её надо по ASN адресов, и это отдельная работа.

· Одни сутки, с вечера понедельника до вечера вторника. Недельные циклы и выходные не смотрел.

· Откуда остались 0,14% точных копий в логе, пока не разобрал. В расчёты они не вошли.

Вместо вывода

Из этих суток мне сильнее всего запомнились две цифры. Первая, 91,3%: сеть из девяти с половиной тысяч переподключающихся модемов упирается в человека, который вводит в поле «120», потому что это красивое число. Вторая, 4–6%: примерно каждая двадцатая смена отдаёт модему адрес, через который прямо сейчас уже ходит кто-то другой. Первая цифра про то, как клиента видно. Вторая про то, почему его всё равно дорого забанить.

Автор работает инженером в mobileproxy.space. Телеметрия снята с внутреннего лога смен IP сети за 28–29.09.2026.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.