LINUX.ORG.RU

Match ip address to ip range

 


0

2

Всем привет! Пишу скриптец, для определения дос атак, наткнулся на одну маленькую проблему. У меня есть например сеть 10.1.1.0/24, например я хочу проверить принадлежность адреса 10.10.10.1 к этой сети и получить результат match/not match. Каким образом сделать такую проверку? Благодарю!

★★★

Вроде такое уже тут давал...

#!/usr/bin/env bash

declare -i u u2 tu
ip2u32() {
        local -i _o1 _o2 _o3 _o4 _m
        IFS=./ read _o1 _o2 _o3 _o4 _m <<< "${2}"
        printf -v $1 $((_o4+_o3*256+_o2*256*256+_o1*256*256*256))
        [[ $3 ]] && printf -v $3 $((u+2**(32-_m)))
}

read -p "IP/mask: " IP
ip2u32 u $IP u2
read -p "test ip: " TI
ip2u32 tu $TI
((((tu>=u)+(tu<u2))==2)) && echo Ok

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Спасибо :) Нашел функцию уже в инете и натравил ее на свой скриптец

#! /bin/bash
# Set DEBUG=1, in order to see it iterate through the calculations.

DEBUG=0
MAXCDN_ARRAY="$1"
IP="$2"

function in_subnet {
    # Determine whether IP address is in the specified subnet.
    #
    # Args:
    #   sub: Subnet, in CIDR notation.
    #   ip: IP address to check.
    #
    # Returns:
    #   1|0
    #
    local ip ip_a mask netmask sub sub_ip rval start end

    # Define bitmask.
    local readonly BITMASK=0xFFFFFFFF

    # Set DEBUG status if not already defined in the script.
    [[ "${DEBUG}" == "" ]] && DEBUG=0

    # Read arguments.
    IFS=/ read sub mask <<< "${1}"
    IFS=. read -a sub_ip <<< "${sub}"
    IFS=. read -a ip_a <<< "${2}"

    # Calculate netmask.
    netmask=$(($BITMASK<<$((32-$mask)) & $BITMASK))

    # Determine address range.
    start=0
    for o in "${sub_ip[@]}"
    do
        start=$(($start<<8 | $o))
    done

    start=$(($start & $netmask))
    end=$(($start | ~$netmask & $BITMASK))

    # Convert IP address to 32-bit number.
    ip=0
    for o in "${ip_a[@]}"
    do
        ip=$(($ip<<8 | $o))
    done

    # Determine if IP in range.
    (( $ip >= $start )) && (( $ip <= $end )) && rval=1 || rval=0

    (( $DEBUG )) &&
        printf "ip=0x%08X; start=0x%08X; end=0x%08X; in_subnet=%u\n" $ip $start $end $rval 1>&2
    echo "${rval}"
}

for subnet in $MAXCDN_ARRAY
do
!	(( $(in_subnet $subnet $IP) )) && echo 1
	(( $(in_subnet $subnet $IP) )) && echo 0
done

init_ ★★★ ()
$ grepcidr 10.1.1.0/24 <(echo 10.10.10.1) > /dev/null && echo "Принадлежит" || echo "Не принадлежит"
Не принадлежит

$ grepcidr 10.1.1.0/24 <(echo 10.1.1.109) > /dev/null && echo "Принадлежит" || echo "Не принадлежит"
Принадлежит
anonymous ()
Ответ на: комментарий от vodz

Когда речь идет об обычной деятельности на обычных дистрибутивах гну/линукс, а не дистрибутивах для энтузиастов. Те, кто использует слаку и подобные ей, лучше знают, что у них там в системе и как это поставить, если нет в репах. Для всех остальных проблема отсутствия пакета в системе обычно решается установкой с помощью пакетного менеджера из реп.

Но это уже оффтоп, конечно. Про греп уже сказали и показали.

anonymous ()
Ответ на: комментарий от vodz

grepcidr закуривал конечно, но больше интересовала реализация на баше, за функцию спасибо, на дурачков внимания не обращай, слака отличный дистрибутив, сам с него и начинал :)

init_ ★★★ ()