Бывают ситуации, когда требуется получить список всех IP-сетей, принадлежащих определённому провайдеру (чтобы забанить его на фаерволе, например). Столь нужную информацию можно отыскать в базе данных региональных регистратур, например, в RIPE:
ftp://ftp.ripe.net/ripe/dbase/split/
Но информация в этой базе представлена не в самом оптимальном виде и скорее всего потребует обработки как минимум двух файлов с занесением в CSV или в СУБД в подходящем формате.
Можно решить задачу с помощью консольных утилит.
1. whois — утилита, входящая в состав bind. Позволяет получать информацию из баз данных региональных регистратур.
2. bgpq — утилита, позволяющая вывести список сетей, анонсируемых от имени определённой автономной системы.
3. aggregate — утилита, объединяющая несколько мелких IP-сетей в одну более крупную. Часто провайдеры делят свои сети на более мелкие, чтобы анонсировать их через разных магистральных провайдеров, но для фаервола такие подробности не нужны, ему чем меньше записей — тем лучше :).
4. awk — это, я думаю, у всех есть.
Алгоритм прост. Берём любой IP-адрес провайдера и применяем к нему whois. В строке Origin находим автономную систему этого провайдера. Затем запускаем bgpq с уже известной нам AS. Полученный список сетей отдаём на вход утилите aggregate. Окончательный результат выводим на консоль или в удобное место.
C:\>whois 217.150.32.50 | awk '/^origin/{print "bgpq -qP "$2}' | sh | \ awk '/^ip/{print $5}' | aggregate -q
Скрипт на PHP будет выглядеть примерно так:
<html><head></head><body> <?php $ip = $_SERVER["REMOTE_ADDR"]; $s = "/usr/bin/whois $ip | ". "/usr/bin/awk '/^origin/{print \"/usr/local/bin/bgpq -qP \" $2}' | ". "/bin/sh | ". "/usr/bin/awk '/^ip/{print $5}' | ". "/usr/local/bin/aggregate -q 2>&1"; exec($s, $w); foreach ($w as $addr) { echo $addr."<br>"; } ?> </body></html>