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
Зачем так сложно? ВК сам свободно даёт информацию о своих сетях https://vk.com/help.php?page=peering
И скрипту недостаёт коментариев.
Комменты не читал, но я просто оставлю это здесь:
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' ' '
Решил посмотреть можно ли заменить регекс на что-то более читаемое, каково же было моё удивление, что хватило просто прочитать мануал!
Вот это:
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
поправьте меня, если это не одно и то же.
Так что лучше понять возможности программы, перед тем как городить жуткие костыли.
Есть одна проблема, так ты не увидишь все сети, принадлежащие вк. Сети могут быть разбиты и иметь разный netname к примеру. Реально принадлежащие сети видно только через регистраторов Интернет, например ripe. А эти костыли годятся на посмотреть, что умеют команды. Не занимайтесь фигней, лучше потратьте время на изучение хотя бы прокси.
https://habrahabr.ru/post/116214/ вот тут хорошая инструкция.