
次のように許可された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_check
STDIN
(注 – 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
この関数はcanon
IPアドレスを取得し、数値フィールドを分割し、各フィールドを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)を取得するために使用します