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アドレスについて覚えておくべき1つのことは、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)を取得するために使用します

関連情報