Конечно, на самом деле, он оказался не настолько уж и велик — не просто же так нам потребовался 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 | “Для использования в будущем” |
Однако, учитывая, что у нас остается 3 706 650 624 адресов, это вроде бы не так уж и много, и находится в идеальной достижимости для отправки пакета каждому из них.
Итак… Это конечно же не первый раз, когда кто-то пытается сделать подобное — в Интернете хватает достаточного количества «фонового шума» (незатребованных пакетов), большинство из них создается системами, которые пытаются взломать другие системы.
Здесь мы можем наблюдать, что порт 23 гораздо выше (по логарифмической шкале), чем все остальные порта — и это порт для telnet, который часто используется в незащищенных маршрутизаторах и прочих IoT-устройствах.
Зная об этом, я ускорился и отправил ICMP-пинг каждому хосту в Интернете, чтобы посмотреть, как большая часть Интернета ответит на данный пинг (и покажет мне, есть ли на той стороне подключенный к сети компьютер).
Днем позже я отправил 3,7 миллиарда пакетов и получил большущий текстовый файл. Теперь нам остается лишь найти способ нарисовать эту карту!
Знакомимся с кривыми Гильберта
Проблема с отображением IP-адресов состоит в том, что они являются одномерными, изменяясь в сторону увеличения или уменьшения, а люди не настолько хороши в восприятии большого количества одномерных точек. Поэтому, нам нужно найти способ представить их таким образом, чтобы мы могли заполнить двумерное пространство ими, что также поможет нам получить более полезные графики.
К счастью, математика спешит нам на помощь — на этот раз в виде параметрических кривых Пеано (space filling curves):
Для меня все никак не доходило, как можно это использовать, пока я не пронумеровал узлы, сквозь которые проходит кривая.
Еще больше времени у меня ушло, прежде чем я догадался, что мы снова можем отобразить эту же анимацию в одном измерении, «распутав» ее:
В общем, теперь когда мы разобрались, как работают эти графики, можем применить их к 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 года:
Вы можете кликнуть по изображению и открыть несжатую версию в полном разрешении — только учтите, что весит оно 9 Мб.
Последний публичный скан, о котором мне известно, был выполнен в 2012 году ботнетом Carna размером 420 тысяч устройств. Используя полученные ботнетом данные, мы можем ясно увидеть некоторые изменения.
В 2012 году RIPE еще даже не трогала 185.0.0.0/8, позже это станет диапазоном, который они будут использовать для последних распределений, и будут давать лишь /22 от пространства IP каждому новому члену RIPE. Из-за этого диапазон 185.0.0.0/8 выглядит странно на фоне других диапазонов и в нем нет массовых аллокаций, поэтому он выглядит весьма «подтянутым» на фоне всех остальных.
RIPE — не единственные, кто полностью использовали диапазоны за прошедшее время. Ниже мы видим три других различных интернет-регистраторов (RIR), которые потребили свои диапазоны за прошедшие 6 лет:
В придачу ко всему этому, я также просканировал несколько диапазонов IP в APNIC (Asia-Pacific Network Information Centre) каждые 30 минут в течение 24 часов. Данные, полученные мною из этого эксперимента, позволяют вам увидеть, как Интернет «дышит» по мере того, как клиенты выходят в онлайн утром и уходят в оффлайн ночью:
Самым интересным в этой «гифке» является то, как выглядит динамический пул IP от ISP, показывающий клиентов, выходящих онлайн на короткий промежуток времени, и затем присоединяющихся и получающих новый IP-адрес (вот почему более активные IP-адреса «переезжают» в течение дня):
Ах да, и если вам интересно, как выглядит IPv6 в таком формате и сколько адресов мы уже используем, то вот вам заключительный график:
Комментарии (22)
capslocky
21.04.2018 15:48Оборонка и IT компании еще понятно, но Ford и Daimler было неожиданно. Причем они получили эти блоки еще в середине 90-х. Чем-то похоже на киберсквоттинг.
capslocky
21.04.2018 16:05В 2011 году Microsoft купил 666 624 IP адреса за 7.5 миллионов долларов. По масштабам это немного больше чем /13 (524 286 адресов).
ATwn
22.04.2018 10:10Учитывая то, как «стремительно» внедряется IPv6, и как скоро заканчиваются IPv4 адреса, можно сказать, что Microsoft заплатил не такую уж и высокую цену. В какой-то момент этот актив конечно может обесцениться, но произойдет это скорее позже, чем раньше.
Apache02
21.04.2018 16:53Я так понял 1 пиксель = 256 адресов? В статью бы скинуть логику как зная для IP адреса A.B.C.0-255 A,B и С получить координаты (x,y) пикселя.
Alex_ME
21.04.2018 17:41Куда уж без этого
XKCDAndreyNagih
21.04.2018 21:10Так вот что, оказывается, Малевич нарисовал!
maxzhurkin
22.04.2018 17:47Это правильный квадрат, а Малевич нарисовал квадрат, у которого все стороны разные и нет ни одного угла 90%
k0ldbl00d
21.04.2018 23:07Извините, но «локальная LAN» звучит как «Соединённые США» или «Федеральная ФСБ»
shukshinivan
21.04.2018 23:31Было бы интересно на этой карте отразить заблокированные Роскомнадзором ресурсы, которые по wsdl можно вытащить — vigruzki.rkn.gov.ru/auto
shukshinivan
22.04.2018 01:25+1Отобразил выгрузку РКН (только диапазоны) в таком же представлении IPv4
картинка заблоченного и ссылка для того, чтобы поиграть зумом :)vlanko
24.04.2018 12:44а что означает прицел?
shukshinivan
24.04.2018 13:02наведите мышку, увидите «you are here». Это то, где открывший ссылку находится на данной карте :)
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.
firk
22.04.2018 09:46Там 127.0.0.0/8 было крайней сетью класса А, и так и так непригодной для обычного использования. Так же как и 0.0.0.0/8, вот им и придумали спец. функции. Что касается идеи оставить всего 1 адрес — было бы неудобно, разные адреса реально иногда нужны, а вот /24 вполне хватило бы да.
Readme
Ммм, а зачем пытаться уложить линейный диапазон в кривую? Как мне кажется, проще и нагляднее, например, на одной оси отмечать первые 16 бит адреса (шкала от 0 до 65536), а на второй — хвост из тех же 16 бит. Дыры и плотные блоки как раз тогда должны выглядеть непрерывными более-менее прямоугольными «кирпичами», а не зигзагообразными паттернами. Можно даже поиграться и выбрать разные диапазоны (подсети, старшие биты) для рисования, хотя и получатся уже прямоугольники, а не квадраты (и можно даже при выборе пропорций руководствоваться минимизацией энтропии в результирующем изображении :).
lorc
Фокус этой кривой в том, что близко расположенные адреса будут находится близко на двумерной плоскости. А в вашем случае — в двух соседних столбцах или строках — будут абсолютно разные адреса.
Readme
Не совсем: предположим, по оси X откладываем младшие биты, по оси Y — старшие (подсеть). Тогда адреса, например, вида
xxx.yyy.*.*
(/16) будут занимать отрезок строкиxxx.yyy
. То есть, за исключением граничных случаев, близкие адреса будут находиться рядом на прямой. И со столбцами тоже спорно — по-моему, довольно распространенный случай, когда одному регистратору принадлежит агрегат диапазонов типа70.121.0.0/16 + 126.120.128.0/24 + ...
Но вы, вероятно, правы, т.к. необходимо разрешение порядка 65536 (216), чтобы разглядеть маленькие подсети (состоящие всего из одной-двух строк). Можно ли где-то найти сырые данные? Не проверишь, не узнаешь :)
Кстати говоря, помимо кривой Гильберта есть ещё много других семейств заполняющих кривых, и с разными элементарными паттернами — возможно, какие-то из них могут быть более или менее выразительны для визуализации/кластеризации именно диапазонов ip. Но тут уже можно улететь во фрактальную размерность, опять-таки минимизацию энтропии и прочие интересные дебри.