Bash скрипт за откриване на дублирани IP адреси в мрежи

Bash скрипт за откриване на дублирани IP адреси в мрежи

В тази статия ще разгледаме Bash скрипт, който проверява за дублирани IP адреси в две мрежи. Ще обясним подробно как работи скриптът и какви стъпки включва. Скриптът използва командата arping за проверка на IP адресите и командата curl за изпращане на съобщения до Telegram.

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

Скриптът има няколко основни части:

  1. Дефиниране на мрежите.
  2. Дефиниране на лог файл.
  3. Функция за изпращане на съобщения до Telegram.
  4. Функция за проверка на мрежата за дублирани IP адреси.
  5. Главен цикъл за проверка на всички мрежи.

Дефиниране на мрежите

Първата част от скрипта дефинира мрежите, които ще бъдат проверени. Това се прави с масив:

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
}

Обяснение на функцията

  1. Деклариране на локална променлива: Първият ред от функцията декларира локална променлива network, която приема аргумента, подаден при извикването на функцията.
  2. Начало на проверката: Следващият ред отпечатва съобщение за началото на проверката.
  3. Променлива за състоянието на дублиране: Променливата found_duplicate се използва за проследяване дали са намерени дублирани IP адреси.
  4. Цикъл за проверка на IP адресите: Цикълът for проверява всички IP адреси в мрежата, от 1 до 254.
  5. Изпълнение на arping: За всеки IP адрес се изпълнява командата arping и изходът се запазва в променливата output.
  6. Проверка за изход: Ако arping не връща изход, се продължава към следващия IP адрес.
  7. Извличане на MAC адреси: Ако има изход, се извличат MAC адресите с помощта на командата grep.
  8. Проверка за дублирани MAC адреси: Ако има повече от един уникален MAC адрес, IP адресът се счита за дублиран.
  9. Записване и изпращане на съобщение: Ако има дублирани IP адреси, те се записват в лог файла и се изпраща съобщение до Telegram.
  10. Съобщение за липса на дублиране: Ако не са намерени дублирани IP адреси, се изпраща съобщение "Няма дублирано IP за мрежа: $network".

Главен цикъл за проверка на всички мрежи

Последната част от скрипта е главният цикъл, който извиква функцията за проверка за всяка мрежа:

for net in "${networks[@]}"; do
    base_net=$(echo "$net" | cut -d'.' -f1-3)
    check_network "$base_net"
done

Обяснение на цикъла

  1. Цикъл for: Цикълът обхожда всички мрежи в масива networks.
  2. Извличане на базова мрежа: Извлича се базовата мрежа чрез командата cut.
  3. Извикване на функцията за проверка: За всяка базова мрежа се извиква функцията 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 бот и чат.

Ако имате въпроси или нужда от допълнителна помощ, не се колебайте да потърсите помощ в интернет или да се консултирате със специалисти по мрежова администрация.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: