Linux. SH. Скрипт для определения ip сетей по имени домена.

В жизни сисадмина бывают моменты, когда начальство даёт ЦУ: заблокировать вконтактик (например). Но вся проблема в том, что ip адресов у него немерено! Так как узнать весь диапазон ip адресов? Но помощь приходит утилита whois.

Алгоритм действия следующий: узнаём ip адрес сайта и через сервис whois узнаём всю подсеть. Но это всё-равно не даёт 100% результат.


Как я поступил?


Первым делом я с помощью утилитки dig узнаю A записи и "запоминаю" их.


Потом я узнаю NS записи домена. Потом той же командой dig я "достаю" ip адреса домена уже на сервере NS, который получил ранее и запонимаю и их.


Потом я по очереди смотрю ip диапазоны через сервис whois. всё очень просто.


Вот готовый скрипт:


#!/bin/sh

f_out=.get_ip_ranges

f_tmp=.ips

echo "*********************************************"

echo "Get A records from DNS:"

dig $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

dig $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" > $f_out

dig $1 A | grep "^www.$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

dig $1 A | grep "^www.$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" >> $f_out

echo "*********************************************"

echo "Get NS records from DNS:"

dig $1 NS | grep "^$1" | awk {'print $NF}' | while read nsserv

do

nsname=${nsserv:0:${#nsserv}-1}

echo "=================================="

echo "NS: $nsname"

dig @$nsname $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

dig @$nsname $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" >> $f_out

done

echo "*********************************************"

echo "Resolve ip range from whois service:"

sort -h $f_out | uniq > $f_tmp

rm $f_out

cat $f_tmp | while read ip

do

echo "Get ip range for $ip"

whois $ip | grep -E -i "inetnum|route|netrange|cidr" >> $f_out

done

echo "*********************************************"

echo "Result"

echo "*********************************************"

sort $f_out | uniq | while read range

do

echo "${range:16}"

done

rm $f_out

rm $f_tmp

Linux. SH. Скрипт для определения ip сетей по имени домена. GNU, Linux, Free Software, Open Source, Тег, Скрипт, Блокировка, Длиннопост

GNU/Linux

1K поста15.5K подписчиков

Добавить пост

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

5
Автор поста оценил этот комментарий

Зачем так сложно? ВК сам свободно даёт информацию о своих сетях https://vk.com/help.php?page=peering

И скрипту недостаёт коментариев.

раскрыть ветку
1
Автор поста оценил этот комментарий

Комменты не читал, но я просто оставлю это здесь:

dig A vk.com +short|head -1|xargs whois|grep origin|awk '{print $2}'|xargs whois -i origin|grep route:|awk '{print $2}'|tr '\n' ' '

2
Автор поста оценил этот комментарий

Решил посмотреть можно ли заменить регекс на что-то более читаемое, каково же было моё удивление, что хватило просто прочитать мануал!

Вот это:

dig $1 A | grep "^$1" | grep -o -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

магически превращается в:

dig $1 A +short

поправьте меня, если это не одно и то же.


Так что лучше понять возможности программы, перед тем как городить жуткие костыли.

2
Автор поста оценил этот комментарий

Есть одна проблема, так ты не увидишь все сети, принадлежащие вк. Сети могут быть разбиты и иметь разный netname к примеру. Реально принадлежащие сети видно только через регистраторов Интернет, например ripe. А эти костыли годятся на посмотреть, что умеют команды. Не занимайтесь фигней, лучше потратьте время на изучение хотя бы прокси.

раскрыть ветку
Автор поста оценил этот комментарий
Самый простой вариант обхода такой блокировки - на домашнем роутере ставится SSH и ходишь в интернет через него. Роутер же всегда включен, чего ему простаивать?

https://habrahabr.ru/post/116214/ вот тут хорошая инструкция.