Задача: как найти список всех российских IP-адресов?
Цель
Полный список российских IP-адресов (а также список адресов другой страны – аналогично) требуется в случаях:
- выполнение требований российского законодательства по ограничению доступа к ресурсам (например, VoIP в России может работать только от российских сетей)
- допуск нужной аудитории к ресурсу
- Категоризация аудитории
И так далее.
Источник данных
Данные о принадлежности IP-адресов разным странам собирают различные сервисы. Например тут перечислено более 50 сайтов/сервисов, предоставляющих такие услуги.
Однако, алгоритмы сбора данных о принадлежности адресов в подавляющем большинстве случаев закрыты, не всегда понятно на основании каких именно критериев адреса относят к тем или иным странам.
Наиболее популярный – GeoIP.
Однако, нужно понимать, что в случае соблюдения требований российского законодательства источник данных должен быть:
- достоверным
- признанным
Вряд ли вы сможете доказать, что GeoIP предоставляет действительно достоверные данные. И эта проблема касается как ложно-положительных, так и ложно-отрицательных случаев.
С точки зрения российского законодательства существует только три достоверных источника данных об IP-адресах: IANA, RIPE и РАНР.
IANA – управляет глобальным распределением крупных адресных блоков континентальным регистратурам. Принадлежность заданной сети конкретному пользователю тут не узнаешь, зато можно получить вообще представление о том, какой диапазон выделен какому континенту.
RIPE – региональная Европейская регистратора (если быть точным, то Europe, the Middle East, and Central Asia). При выделении сети конечному клиенту RIPE обязательно спрашивает в каком регионе будет использоваться заданная сеть.
РАНР (Реестр адресно-номерных ресурсов) – копия базы данных RIPE российских ресурсов. Реестр пока ещё только создаётся, поэтому пока нельзя сказать, что его база хоть сколько-нибудь полная. Да и вытащить оттуда список ресурсов (не один конкретный, а именно список) – та ещё задачка.
Таким образом, если список адресов нужен для целей, связанных с определением достоверности информации, стоит полагаться именно на RIPE
Как получить актуальный список адресов
#curl https://stat.ripe.net/data/country-resource-list/data.json?resource=RU | jq -r '.data.resources.ipv4 | .[]' > ru.txt
stat.ripe.net – ресурс предоставляет статистические данные об использовании интернет-ресурсов, в том числе в формате JSON
resource=RU – российские ресурсы
jq -r ‘.data.resources.ipv4 | .[]’ – извлекает IPv4 адреса из JSON, полученного от stat.ripe.net. Извлекает из строки JSON-а каждый IPv4-элемент.
> ru.txt – складываем полученные данные в файл ru.txt
В итоге у вас получается файл размером примерно 11тыс. строк.
ВАЖНО: НЕ ВСЕ строки в файле одинакового формата!
В подавляющем большинстве строки в файле выглядят как CIDR-подсеть:
2.56.24.0/23
2.56.26.0/23
2.56.88.0/22
2.56.112.0/22
Однако, если сделать поиск строк, в которых нет слеша, получим примерно 20 строк в формате диапазона:
$ cat ru.txt | grep -v "/"
31.135.244.0-31.135.251.255
46.149.66.0-46.149.71.255
62.122.208.0-62.122.212.255
78.31.178.0-78.31.183.255
81.162.48.0-81.162.53.255
87.239.32.0-87.239.34.255
Их можно либо игнорировать, либо поправить вручную – как вам больше нравится.
В итоге, получаем файл из которого можно далее собрать либо ACL, либо правило для firewall, либо использовать этот список ещё каким-либо образом.
Кроме того, вы всегда можете сослаться на достоверный источник данных – RIPE. Достовернее не бывает.
Ручная проверка принадлежности сети
На сайте RIPE.net в правом верхнем углу – строка поиска:
В выдаче вас будет интересовать объект inetnum (все остальные объекты создаются на его основе):
Может ли одна и та же сеть использоваться в разных странах одновременно?
Да, запросто. В случае честного оформления объекта в БД RIPE будет несколько строчек country: с разными идентификаторами стран, в которых сеть будет использоваться.
В выгрузку stat.ripe.net такая сеть попадёт несколько раз – по одному разу для каждой страны.