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









