~ To be, or not to be, or to let it 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がどの程度普及して更新されるものなのか見当がつきません。 |
|