29 мар. 2012 г.

Мониторинг активности хостов в сети

Цель: Вести наблюдение за активность хостов в нашей сети.

Дано: bash, nmap(не пригодится, объясню ниже) и стандартные ping, egrep, arp, по желанию постоянного мониторинга munin (или других систем наблюдения)


Решение:

И так что мы имеем...

Сегмент исследуемый сети 192.168.10.0/24

В сети разные компьютеры: виндовс, линуксы, управляемые свичи, и прочее зверье норовящее съесть тот или иной ИП. Ко всему прочему, у кого включен фаервол, кто вообще без него сидит, одно безобразие.

И было бы всё хорошо, если в сети был бы DHCP!

Но увы, тут полная Ж ... то есть, статика ... А настройка сети, увы, не моя компетенция в данном случае, поэтому про нормальный GW с NAT'ом и прочими радостями говорить не станем. Да, по тем же причинам доступа к свичам нет.

А тем временем парк машин растет и надо давать новые ИПы ... А какие? Так как никто не вел журнал выданных ИПов приходится перебирать ручками и ждать криков "Какого хрена...". Но это же не вариант, надо как то отследить всё это безобразие.

Ну что же, первым наперво вспоминается наша палочка выручалочка NMAP ...
пишем что то подобное:


nmap -v -sP 192.168.10.0/24 2>/dev/null | egrep '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | grep -v 'host down'
вуаля, получаем "как бэ" список активных хостов ...

а вот фиг нам, тут не все будут, те которые глухо зафоерволены сюда не попадут и по понятным нам причинам...

и как же быть? идем на хитрости (костыли очередные)

пишем скриптик:


#!/bin/bash
for i in {1..254}; do 
    ping -c 1 -W 1 192.168.10.$i 2>&1 1>/dev/null & 
done

wait
arp -a | egrep '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+[^<]+eth.*' | egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort
и что же тут происходит?

1) по циклу запускаем одновременно 254 пинга на разные ИПы нашей сети с временем ожидания ответа 1 секундой и максимально ограничивающимся 1 пакетом.

2) ждем пока все наши дочерние процессы завершаться

3) Самая смаковка. Пока мы опрашивали все ИП, наша ARP таблица наполнялась данными, соответствие запрашиваемого ИПа MAC-адресу сетевой карты владельца этого ИПа ... Другими словами, если компьютер в сети, свичь/маршрутизатор разруливающий пакеты в нашем сегменте сети будет о нем знать и передаст нам информацию о MACе владельца данного IP'а, не важно от того зафоерволена машина или нет...

Вот и получаем актуальный список хостов сети на момент выполнения скрипта.

Но ведь хост может быть в данный момент быть выключен, а вчера за ним кто то мог работать... Увы, такими средствами мы этого не увидим.

Вот тут нам поможет какой нибудь демон наблюдения, благо таких много: cacti, zabbix, etc

Мне, за простату свою, понравился MUNIN.

пишем к нему плагинчик:



#cat check_ip
#!/bin/bash
 
if [ "$1" = "config" ]; then
    echo 'graph_title active hosts'
    echo 'graph_vlabel status'
    echo 'graph_noscale true'
    for i in {1..254};
    do  
        echo "ip-$i.label 192.168.10.$i"
    done
    echo 'graph_category network'
    exit 0
fi

for i in {1..254}; do 
    ping -c 1 -W 1 192.168.128.$i 2>&1 1>/dev/null & 
done

wait

IPS=$(arp -a | egrep '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+[^<]+eth.*' | egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')

for i in {1..254};
do
    echo -n "ip-$i.value "
    ok=0
    if [ -n "`echo $IPS | grep \"192.168.10.$i\"`" ];  
    then 
        ok=5
    fi  
    echo $(($i*8 - 500 + $ok)); 
done
и делаем его исполняемым chmod a+x check_ip
и скармливаем munin-node =)

Таким образом мы наблюдаем тенденцию изменений состояний активности IPов.
И если полоска продолжительно долго остается в покое, можно судить что активности тут никакой, и спокойненько использовать данный ИП.


Примечание:
* если ваша сеть с маской к примеру 25, то только хосты из этой подсети будут доступны в данном случае...

** да, учтите, что линия соответствующая ИПу машине с которой будет запускаться данный "чек" будет всегда "лежать" в покое ... при пинге самого себя никакая ARP запись естесно не появится =)


удачи!

Комментариев нет:

Отправить комментарий