IP가 특정 범위에 속하는지 확인

IP가 특정 범위에 속하는지 확인

다음과 같이 허용된 IP 범위를 나열하는 로그 파일이 있습니다.

"217.29.0.0-217.29.255.255",
"204.12.0.0-204.12.255.255",
"198.54.223.0-198.54.223.255",

또한 무엇보다도 이 로그 파일을 확인하고 지정된 IP가 화이트리스트에 있는지 확인해야 하는 bash 스크립트를 작성 중입니다.

예를 들어, IP의 경우 204.12.5.10지정된 범위의 로그 파일을 사용하여 IP가 파일의 범위에 속하는지 확인하려면 어떻게 해야 합니까?

답변1

IP 주소에 대해 기억해야 할 한 가지는 IP 주소가 실제로는 32비트 숫자를 표현한 것일 뿐이라는 것입니다.

따라서 옥텟에 256진수를 곱하여 10진수로 변환합니다.

예를 들어:

217.29.0.0 == 216 * 256 ^ 3 + 29 * 256 ^2 + 0 * 256 ^1 + 0 * 256 ^ 0
           == 3640655872

따라서 위와 같은 범위가 주어지면 먼저 둘 다 변환하여 시작과 끝을 갖게 됩니다. 그런 다음 들어오는 모든 IP를 비교하여 "적합"한지 확인하십시오.

따라서 다음과 같은 것입니다(알고리즘 설명).

#!/usr/bin/env perl
use strict;
use warnings;

my $ip_to_check = "204.12.5.10";
my $dword       = 0;
for ( split( '\.', $ip_to_check ) ) { $dword *= 256; $dword += $_ }
print "Checking $dword\n";

while (<DATA>) {
    my ( $start, $finish ) = m/([\d\.]+)/g;
    my $start_dword = 0;
    for ( split '\.', $start ) { $start_dword *= 256; $start_dword += $_ }
    my $end_dword = 0;
    for ( split '\.', $finish ) { $end_dword *= 256; $end_dword += $_ }
    print "Range:\n";
    print "\t$start \t=> $start_dword\n";
    print "\t$finish \t=> $end_dword\n";

    print "$ip_to_check is in $_\n" if $dword >= $start_dword and $dword <= $end_dword;
}

__DATA__
"217.29.0.0-217.29.255.255",
"204.12.0.0-204.12.255.255",
"198.54.223.0-198.54.223.255",

이는 파일을 읽어서( 파일에서 가져오는 DATA대신 ) "검사 스크립트"로 쉽게 실행할 수 있습니다.$ip_to_checkSTDIN

(참고 – pure는 perl쉽게 라이너나 호출할 스크립트로 바뀔 수 있습니다. 또는 다시 작성하면 expr쉽게 할 수 있습니다.)

답변2

이것은버전:

want=204.12.77.5
awk -v want=$want  -F- '
function canon(ip){
    split(" "ip,x,/[^0-9]+/)
    return sprintf("%03d%03d%03d%03d",x[2],x[3],x[4],x[5])
}
BEGIN { val = canon(want) }
{ low = canon($1); high = canon($2);
  if(val>=low && val<=high)print "in range " $0
}' mylogfile

이 함수는 canonIP 주소를 가져와 숫자 필드를 분할하고 각 필드를 3자리로 확장한 후 문자열을 반환합니다. 각 라인에서 2개의 값을 호출하고 이 값을 역시 "정규화"된 원하는 IP 주소(처음에 설정됨)와 비교합니다.

답변3

나는 bash 스크립트를 위해 다음 함수를 작성했습니다:

function int_ip() {
    OIFS=$IFS
    IFS='.'
    ip=($1)
    IFS=$OIFS
    echo "${ip[0]} * 256 ^ 3 + ${ip[1]} * 256 ^2 + ${ip[2]} * 256 ^1 + ${ip[3]} * 256 ^ 0" | bc
}

나는 이것을 다음과 같이 사용합니다 :

HOSTMIN=$(int_ip ${HOSTMIN})
HOSTMAX=$(int_ip ${HOSTMAX})
IPINT=$(int_ip ${NEWIP})

if ! [[ ${IPINT} -le ${HOSTMAX} && ${IPINT} -ge ${HOSTMIN} ]]; then
    echo "IP Out of Range"
    return 1
fi

나는 ipcalc호스트민(hostmin)과 호스트맥스(hostmax)를 얻는데 사용한다

관련 정보