|
~ To be, or not to be, or to ask someone to be. ~ null-i.net |
| Linux/Apache/国内アクセスへの限定 | |
|
日本国内からのアクセスのみを許可するように設定する(2014-11-22) 海外からの掲示板荒らしを避けるために、 まず、APNIC*1からIPアドレス割り当て表を取得します。 $ wget http://ftp.apnic.net/stats/apnic/delegated-apnic-latest 中身はこんな感じ。IPアドレスの各国への割り当て状態が確認できます。 (抜粋) apnic|AU|ipv4|1.0.4.0|1024|20110412|allocated apnic|CN|ipv4|1.0.8.0|2048|20110412|allocated apnic|JP|ipv4|1.0.16.0|4096|20110412|allocated ちょっと何行あるか見てみましょうか。 $ grep JP delegated-apnic-latest | grep ipv4 | wc -l 3266 $ grep JP delegated-apnic-latest | egrep 'ipv4|ipv6' | wc -l 3738 おおぅ、フィルタにかけると3738行か。結構多いな。 $ grep JP delegated-apnic-latest |
egrep 'ipv4|ipv6' |
awk -F'|' '{print $3 "#" $4 "#" $5}' |
perl -e '
while(<STDIN>){
if(/ipv(.)#(.*)#(\d*)/){
if($1 == 4){
$ip=$2; $num=$3;
do {
if($ip =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/){
$bin=$1*256*256*256
+$2*256*256
+$3*256
+$4; # IP表記から数値に戻す
}
# ホストIPからネットマスクの数をカウント
$bip=0;
for($p=$bin; $p%2==0; $p>>=1){$bip++;}
# 個数からマスクをカウント、小数点切り捨て
$sub=sprintf("%d", log($num)/log(2));
# ホスト、個数のどちらのマスクを使うか判定
if($sub>$bip){ $sub=$bip; }
printf("%s/%d\n", $ip, 32-$sub);
$old = $num;
$num = $num - (2 ** $sub);
if($num > 0){
if($ip =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/){
$b = $bin + $old - $num;
$ip = sprintf("%d.%d.%d.%d",
$b/(256*256*256),
$b/(256*256)%256,
$b/256%256,
$b%256
); # 数値から、個数を足してIP表記に戻す
}
}
} while($num > 0);
}
if($1 == 6){
printf("%s/%d\n", $2, $num);
}
}
}'
(で、エンター押して、実行結果が以下) 1.0.16.0/20 1.0.64.0/18 (中略) 240d::/20 240f::/20 英語苦手なんで、delegated-apnic-latestファイルの書式について、CIDRの解釈に自信が無いのですが・・・ 上記コマンドの内容についてざっくり書くと、 ちょっと行数が多い気がするので、 grep JP delegated-apnic-latest |
egrep 'ipv4|ipv6' |
awk -F'|' '{print $3 "#" $4 "#" $5}' |
perl -e '
while(<STDIN>){
if(/ipv(.)#(.*)#(\d*)/){
if($1 == 4){
$subnet = 32 - log($3)/log(2);
if($subnet < 17){
printf("%s/%d\n", $2, $subnet);
}else{
if($2 =~ /^(\d+\D\d+)\D/){
printf("%s.0.0/16\n", $1);
}
}
}
if($1 == 6){
printf("%s/%d\n", $2, $num);
}
}
}' | sort -u
それでも千行超えてしまいますけどね。 | awk '{printf "Allow from " $0 "\n"}' > allow_list.txt
echo "Allow from localhost" >> allow_list.txt
とかすれば良いでしょう。 では、httpd.confを編集 <Location />
Order Allow,Deny
(上記で作ったallow_list.txtを全部)
</Location>
掲示板だけ制限すれば良いんですが、いっそ全サイト(Location /)に制限かけてみました。 ただ、問題点もあるのは分かっています。
1つめは、IPv4は既に枯渇しているから更新不要だと思うのですが、IPv6がどの程度普及して更新されるものなのか見当がつきません。 |
|