Составляем карту всего Интернета при помощи кривых Гильберта  



Составляем карту всего Интернета при помощи кривых Гильберта +65

Интернет велик. Очень велик. Вы просто не поверите, насколько умопомрачительно он велик. В смысле, вам может показаться, что диапазон блоков /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
    /#10767074 / +3

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

    • lorc
      /#10767250

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

      • Readme
        /#10767348

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


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


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

  2. capslocky
    /#10767090

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

    • capslocky
      /#10767124

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

      • ATwn
        /#10767862

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

  3. Apache02
    /#10767146

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

  4. rogoz
    /#10767186 / +1

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

    • maxzhurkin
      /#10768464

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

  5. Alex_ME
    /#10767196

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


    XKCD

  6. AndreyNagih
    /#10767438

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

    • maxzhurkin
      /#10768466

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

  7. nanshakov
    /#10767472

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

  8. k0ldbl00d
    /#10767530

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

  9. shukshinivan
    /#10767536

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

  10. shukshinivan
    /#10767600 / +1

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

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

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

    • vlanko
      /#10772236

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

      • shukshinivan
        /#10772302

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

  11. capslocky
    /#10767778

    Один из просчетов было отдать 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.

    • firk
      /#10767838

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

  12. capslocky
    /#10767802 / +1

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

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

    • GamePad64
      /#10770222

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