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

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

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

Лишь бы сказануть...


начальство даёт ЦУ: заблокировать вконтактик (например)
Иллюстрация к комментарию
раскрыть ветку (5)
Автор поста оценил этот комментарий
Ну ок. А про вторую часть комментария? Или вы считаете, что скрипт дожуя читабелен?

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

Ну и #comment_67944335

раскрыть ветку (3)
Автор поста оценил этот комментарий
Ну и велосипеды - это плохо, конечно, если они не обеспечивают объективных преимуществ перед готовыми решениями. Но в академических целях - вполне допустимо.

От администрирования я далек, потому не претендую на истину в последней инстанции.
Автор поста оценил этот комментарий
Я отреагировал лишь на бестолковое замечание.

Что касается скрипта, то ТС все этапы описал и даже их отчертил в коде. Не вижу смысла капитанить в комментариях.
1
Автор поста оценил этот комментарий

Не вижу необходимости дублирования вывода echo ещё и в комментарий =)

это просто метод для определения ip подсети по доменному имени. как применять - решает каждый. я привёл пример. ок?

я знаком со сквидом.

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

[... тут должна быть смешная картинка ... ]

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

а что делать, чтобы узнать подсети, например, http://www.***.*u?

раскрыть ветку (2)
Автор поста оценил этот комментарий
squid - acl - bad.acl - *.blabla.*u/*

в случае с https можно почитать что-то подобное https://habrahabr.ru/post/267851/

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
выше и ниже ответил
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку