Интернет велик. Очень велик. Вы просто не поверите, насколько умопомрачительно он велик. В смысле, вам может показаться, что диапазон блоков /22, который вы получили как локальный интернет-регистратор (LIR), это очень много — но в масштабах всего Интернета это так, орешки.

Конечно, на самом деле, он оказался не настолько уж и велик — не просто же так нам потребовался IPv6. Однако, это уже другая история.

Дело в том, что IPv4 (самая широко используемая версия протокола IP) задает лимит адресов, равный 2??. Это означает, что у вас есть примерно 4,2 миллиарда IP-адресов, с которыми вы можете работать — хотя по правде это не совсем так, поскольку крупные секции недоступны для использования:
Диапазон IP Применение
0.0.0.0/8 Локальная система
10.0.0.0/8 Локальная LAN
127.0.0.0/8 Loopback
169.254.0.0/16 Link Local
172.16.0.0/12 Локальная LAN
224.0.0.0/4 Мультивещание (Multicast)
240.0.0.0/4 “Для использования в будущем”
Диапазоны адресов (показанные в виде записи с применением бесклассовой адресации, CIDR) перечисленные выше, для нас «убираются» — а это 588 316 672 адресов, или примерно 13% от всего количества адресов.

Однако, учитывая, что у нас остается 3 706 650 624 адресов, это вроде бы не так уж и много, и находится в идеальной достижимости для отправки пакета каждому из них.

Итак… Это конечно же не первый раз, когда кто-то пытается сделать подобное — в Интернете хватает достаточного количества «фонового шума» (незатребованных пакетов), большинство из них создается системами, которые пытаются взломать другие системы.

image

Здесь мы можем наблюдать, что порт 23 гораздо выше (по логарифмической шкале), чем все остальные порта — и это порт для telnet, который часто используется в незащищенных маршрутизаторах и прочих IoT-устройствах.

Зная об этом, я ускорился и отправил ICMP-пинг каждому хосту в Интернете, чтобы посмотреть, как большая часть Интернета ответит на данный пинг (и покажет мне, есть ли на той стороне подключенный к сети компьютер).

Днем позже я отправил 3,7 миллиарда пакетов и получил большущий текстовый файл. Теперь нам остается лишь найти способ нарисовать эту карту!

Знакомимся с кривыми Гильберта


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

К счастью, математика спешит нам на помощь — на этот раз в виде параметрических кривых Пеано (space filling curves):

image

Для меня все никак не доходило, как можно это использовать, пока я не пронумеровал узлы, сквозь которые проходит кривая.

image

Еще больше времени у меня ушло, прежде чем я догадался, что мы снова можем отобразить эту же анимацию в одном измерении, «распутав» ее:

image

В общем, теперь когда мы разобрались, как работают эти графики, можем применить их к IP-адресам.

К счастью, существуют инструменты, которые позволяют строить подобные графики на основании собранных данных об IP-адресах, поэтому нам остается лишь «скормить» одному из них наши данные и дождаться результата:

cat ping.txt | pcregrep -o1 ': (\d+\.\d+\.\d+\.\d+)' | ./ipv4-heatmap -a ./labels/iana/iana-labels.txt -o out.png

Эта команда отрисует кривую Гильберта при помощи градинта, показываещуго, как много систем находятся онлайн в тех /24

И так, позвольте представить вам — карта IPv4 Интернета по состоянию на 16 апреля 2018 года:

image

Вы можете кликнуть по изображению и открыть несжатую версию в полном разрешении — только учтите, что весит оно 9 Мб.

Последний публичный скан, о котором мне известно, был выполнен в 2012 году ботнетом Carna размером 420 тысяч устройств. Используя полученные ботнетом данные, мы можем ясно увидеть некоторые изменения.

image

В 2012 году RIPE еще даже не трогала 185.0.0.0/8, позже это станет диапазоном, который они будут использовать для последних распределений, и будут давать лишь /22 от пространства IP каждому новому члену RIPE. Из-за этого диапазон 185.0.0.0/8 выглядит странно на фоне других диапазонов и в нем нет массовых аллокаций, поэтому он выглядит весьма «подтянутым» на фоне всех остальных.

RIPE — не единственные, кто полностью использовали диапазоны за прошедшее время. Ниже мы видим три других различных интернет-регистраторов (RIR), которые потребили свои диапазоны за прошедшие 6 лет:

image

В придачу ко всему этому, я также просканировал несколько диапазонов IP в APNIC (Asia-Pacific Network Information Centre) каждые 30 минут в течение 24 часов. Данные, полученные мною из этого эксперимента, позволяют вам увидеть, как Интернет «дышит» по мере того, как клиенты выходят в онлайн утром и уходят в оффлайн ночью:

image

Самым интересным в этой «гифке» является то, как выглядит динамический пул IP от ISP, показывающий клиентов, выходящих онлайн на короткий промежуток времени, и затем присоединяющихся и получающих новый IP-адрес (вот почему более активные IP-адреса «переезжают» в течение дня):
image

Ах да, и если вам интересно, как выглядит IPv6 в таком формате и сколько адресов мы уже используем, то вот вам заключительный график:

image

Комментарии (22)


  1. Readme
    21.04.2018 15:27
    +3

    Ммм, а зачем пытаться уложить линейный диапазон в кривую? Как мне кажется, проще и нагляднее, например, на одной оси отмечать первые 16 бит адреса (шкала от 0 до 65536), а на второй — хвост из тех же 16 бит. Дыры и плотные блоки как раз тогда должны выглядеть непрерывными более-менее прямоугольными «кирпичами», а не зигзагообразными паттернами. Можно даже поиграться и выбрать разные диапазоны (подсети, старшие биты) для рисования, хотя и получатся уже прямоугольники, а не квадраты (и можно даже при выборе пропорций руководствоваться минимизацией энтропии в результирующем изображении :).


    1. lorc
      21.04.2018 18:47

      Фокус этой кривой в том, что близко расположенные адреса будут находится близко на двумерной плоскости. А в вашем случае — в двух соседних столбцах или строках — будут абсолютно разные адреса.


      1. Readme
        21.04.2018 19:52

        Не совсем: предположим, по оси X откладываем младшие биты, по оси Y — старшие (подсеть). Тогда адреса, например, вида xxx.yyy.*.* (/16) будут занимать отрезок строки xxx.yyy. То есть, за исключением граничных случаев, близкие адреса будут находиться рядом на прямой. И со столбцами тоже спорно — по-моему, довольно распространенный случай, когда одному регистратору принадлежит агрегат диапазонов типа 70.121.0.0/16 + 126.120.128.0/24 + ...


        Но вы, вероятно, правы, т.к. необходимо разрешение порядка 65536 (216), чтобы разглядеть маленькие подсети (состоящие всего из одной-двух строк). Можно ли где-то найти сырые данные? Не проверишь, не узнаешь :)


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


  1. capslocky
    21.04.2018 15:48

    Оборонка и IT компании еще понятно, но Ford и Daimler было неожиданно. Причем они получили эти блоки еще в середине 90-х. Чем-то похоже на киберсквоттинг.


    1. capslocky
      21.04.2018 16:05

      В 2011 году Microsoft купил 666 624 IP адреса за 7.5 миллионов долларов. По масштабам это немного больше чем /13 (524 286 адресов).


      1. ATwn
        22.04.2018 10:10

        Учитывая то, как «стремительно» внедряется IPv6, и как скоро заканчиваются IPv4 адреса, можно сказать, что Microsoft заплатил не такую уж и высокую цену. В какой-то момент этот актив конечно может обесцениться, но произойдет это скорее позже, чем раньше.


  1. Apache02
    21.04.2018 16:53

    Я так понял 1 пиксель = 256 адресов? В статью бы скинуть логику как зная для IP адреса A.B.C.0-255 A,B и С получить координаты (x,y) пикселя.


  1. rogoz
    21.04.2018 17:18
    +1

    В таблице не вижу
    100.64.0.0/10
    192.168.0.0/16


    1. maxzhurkin
      22.04.2018 17:43

      Это перевод. Вам, видимо, к автору


  1. Alex_ME
    21.04.2018 17:41

    Куда уж без этого


    XKCD


  1. AndreyNagih
    21.04.2018 21:10

    Так вот что, оказывается, Малевич нарисовал!


    1. maxzhurkin
      22.04.2018 17:47

      Это правильный квадрат, а Малевич нарисовал квадрат, у которого все стороны разные и нет ни одного угла 90%


  1. nanshakov
    21.04.2018 21:38

    А сколько времени заняла рассылка пакетов?


  1. k0ldbl00d
    21.04.2018 23:07

    Извините, но «локальная LAN» звучит как «Соединённые США» или «Федеральная ФСБ»


  1. shukshinivan
    21.04.2018 23:31

    Было бы интересно на этой карте отразить заблокированные Роскомнадзором ресурсы, которые по wsdl можно вытащить — vigruzki.rkn.gov.ru/auto


  1. shukshinivan
    22.04.2018 01:25
    +1

    Отобразил выгрузку РКН (только диапазоны) в таком же представлении IPv4

    картинка заблоченного и ссылка для того, чтобы поиграть зумом :)

    Ну и можно включить показ основных отметок, чей диапазон
    (ссылки вверху) rkn.ishukshin.ru


    1. vlanko
      24.04.2018 12:44

      а что означает прицел?


      1. shukshinivan
        24.04.2018 13:02

        наведите мышку, увидите «you are here». Это то, где открывший ссылку находится на данной карте :)


  1. capslocky
    22.04.2018 08:55

    Один из просчетов было отдать 127.0.0.0/8 под loopback. В теории, это может пригодится, чтобы использовать разные IP (127.0.0.2, 127.0.0.3… ) для разных соединений, но на практике достаточно разных портов на 127.0.0.1. Думаю, хватило бы и 127.0.0.0/24 для разных случаев. Может какой-нибудь highload это как-то использует, кто подскажет? Кстати, в IPv6 всего один адрес — ::1.


    1. firk
      22.04.2018 09:46

      Там 127.0.0.0/8 было крайней сетью класса А, и так и так непригодной для обычного использования. Так же как и 0.0.0.0/8, вот им и придумали спец. функции. Что касается идеи оставить всего 1 адрес — было бы неудобно, разные адреса реально иногда нужны, а вот /24 вполне хватило бы да.


  1. capslocky
    22.04.2018 09:17
    +1

    Кому интересно, подсетки особых адресов согласно RFC 5735.

    Скрытый текст
    image


    1. GamePad64
      23.04.2018 13:57

      За такими реестрами правильнее идти не в старый RFC, а в IANA.