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簡単にできます。)

おすすめ記事