Bash скрипт за откриване на дублирани IP адреси в мрежи
В тази статия ще разгледаме Bash скрипт, който проверява за дублирани IP адреси в две мрежи. Ще обясним подробно как работи скриптът и какви стъпки включва. Скриптът използва командата arping
за проверка на IP адресите и командата curl
за изпращане на съобщения до Telegram.
Основни компоненти на скрипта
Скриптът има няколко основни части:
- Дефиниране на мрежите.
- Дефиниране на лог файл.
- Функция за изпращане на съобщения до Telegram.
- Функция за проверка на мрежата за дублирани IP адреси.
- Главен цикъл за проверка на всички мрежи.
Дефиниране на мрежите
Първата част от скрипта дефинира мрежите, които ще бъдат проверени. Това се прави с масив:
networks=("10.110.110.0" "10.20.20.0")
Този масив съдържа две мрежи: 10.110.110.0
и 10.20.20.0
.
Дефиниране на лог файл
След това се дефинира файл за запис на логове:
duplicate_ips_log="duplicate_ips.log"
echo "Duplicate IPs Log" > "$duplicate_ips_log"
ова създава нов лог файл или изчиства съществуващия.
Функция за изпращане на съобщения до Telegram
Следващата част от скрипта е функцията за изпращане на съобщения до Telegram:
send_telegram_message() {
local message="$1"
/usr/bin/curl -s -X POST -F chat_id='ВАШИЯ_CHAT_ID' -F text="$message" https://api.telegram.org/botВАШИЯ_БOT_TOKEN/sendMessage
}
Тази функция използва командата curl
за изпращане на POST заявка към Telegram API. Заявката съдържа идентификатор на чат и текст на съобщението.
Функция за проверка на мрежата
Основната част от скрипта е функцията за проверка на мрежата за дублирани IP адреси:
check_network() {
local network="$1"
echo "Проверка на мрежа: $network"
local found_duplicate=false
for i in {1..254}; do
ip="$network.$i"
output=$(arping -c 3 -w 50000 "$ip" 2>/dev/null)
if [ -z "$output" ]; then
echo "Неуспешна проверка за IP: $ip"
continue
fi
macs=$(echo "$output" | grep -oE '([0-9a-f]{2}:){5}[0-9a-f]{2}' | sort | uniq)
mac_count=$(echo "$macs" | wc -l)
if [[ "$mac_count" -gt 1 ]]; then
echo "Дублирано IP: $ip (MACs: $macs)"
send_telegram_message "Дублирано IP: $ip (MACs: $macs)"
echo "$ip (MACs: $macs)" >> "$duplicate_ips_log"
found_duplicate=true
fi
done
if [ "$found_duplicate" = false ]; then
echo "Няма дублирано IP за мрежа: $network"
send_telegram_message "Няма дублирано IP за мрежа: $network"
fi
}
Обяснение на функцията
- Деклариране на локална променлива: Първият ред от функцията декларира локална променлива
network
, която приема аргумента, подаден при извикването на функцията. - Начало на проверката: Следващият ред отпечатва съобщение за началото на проверката.
- Променлива за състоянието на дублиране: Променливата
found_duplicate
се използва за проследяване дали са намерени дублирани IP адреси. - Цикъл за проверка на IP адресите: Цикълът
for
проверява всички IP адреси в мрежата, от 1 до 254. - Изпълнение на
arping
: За всеки IP адрес се изпълнява командатаarping
и изходът се запазва в променливатаoutput
. - Проверка за изход: Ако
arping
не връща изход, се продължава към следващия IP адрес. - Извличане на MAC адреси: Ако има изход, се извличат MAC адресите с помощта на командата
grep
. - Проверка за дублирани MAC адреси: Ако има повече от един уникален MAC адрес, IP адресът се счита за дублиран.
- Записване и изпращане на съобщение: Ако има дублирани IP адреси, те се записват в лог файла и се изпраща съобщение до Telegram.
- Съобщение за липса на дублиране: Ако не са намерени дублирани IP адреси, се изпраща съобщение "Няма дублирано IP за мрежа: $network".
Главен цикъл за проверка на всички мрежи
Последната част от скрипта е главният цикъл, който извиква функцията за проверка за всяка мрежа:
for net in "${networks[@]}"; do
base_net=$(echo "$net" | cut -d'.' -f1-3)
check_network "$base_net"
done
Обяснение на цикъла
- Цикъл
for
: Цикълът обхожда всички мрежи в масиваnetworks
. - Извличане на базова мрежа: Извлича се базовата мрежа чрез командата
cut
. - Извикване на функцията за проверка: За всяка базова мрежа се извиква функцията
check_network
.
Ето и целият скрипт:
#!/bin/bash
networks=("10.110.110.0" "10.20.20.0")
#networks=("10.110.110.0")
duplicate_ips_log="duplicate_ips.log"
echo "Duplicate IPs Log" > "$duplicate_ips_log"
send_telegram_message() {
local message="$1"
echo "Изпращане на съобщение: $message"
/usr/bin/curl -s -X POST -F chat_id='ВАШИЯ_CHAT_ID' -F text="$message" https://api.telegram.org/botВАШИЯ_БOT_TOKEN/sendMessage
}
check_network() {
local network="$1"
echo "Проверка на мрежа: $network"
local found_duplicate=false
for i in {1..254}; do
ip="$network.$i"
echo "Проверка на IP: $ip"
output=$(arping -c 3 -w 50000 "$ip" 2>/dev/null)
if [ -z "$output" ]; then
echo "Неуспешна проверка за IP: $ip"
continue
fi
macs=$(echo "$output" | grep -oE '([0-9a-f]{2}:){5}[0-9a-f]{2}' | sort | uniq)
mac_count=$(echo "$macs" | wc -l)
if [[ "$mac_count" -gt 1 ]]; then
echo "Дублирано IP: $ip (MACs: $macs)"
send_telegram_message "Дублирано IP: $ip (MACs: $macs)"
echo "$ip (MACs: $macs)" >> "$duplicate_ips_log"
found_duplicate=true
fi
done
if [ "$found_duplicate" = false ]; then
echo "Няма дублирано IP за мрежа: $network"
send_telegram_message "Няма дублирано IP за мрежа: $network"
fi
}
for net in "${networks[@]}"; do
base_net=$(echo "$net" | cut -d'.' -f1-3)
check_network "$base_net"
done
echo "Проверката на всички мрежи завърши."
Заключение
Този скрипт е полезен за мрежови администратори, които искат да следят за дублирани IP адреси в техните мрежи. Скриптът е лесен за настройка и може да бъде адаптиран за различни мрежови среди. Използването на arping
и curl
прави скрипта ефективен и гъвкав. За да работи коректно, трябва да се уверите, че arping
и curl
са инсталирани на вашата система и че сте задали правилните идентификатори за вашия Telegram бот и чат.
Ако имате въпроси или нужда от допълнителна помощ, не се колебайте да потърсите помощ в интернет или да се консултирате със специалисти по мрежова администрация.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut