[Перевод] Составляем карту всего Интернета при помощи кривых Гильберта
Интернет велик. Очень велик. Вы просто не поверите, насколько умопомрачительно он велик. В смысле, вам может показаться, что диапазон блоков /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 адресов, это вроде бы не так уж и много, и находится в идеальной достижимости для отправки пакета каждому из них.
Итак… Это конечно же не первый раз, когда кто-то пытается сделать подобное — в Интернете хватает достаточного количества «фонового шума» (незатребованных пакетов), большинство из них создается системами, которые пытаются взломать другие системы.
Здесь мы можем наблюдать, что порт 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 в таком формате и сколько адресов мы уже используем, то вот вам заключительный график: