zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

.htaccessで日本からのアクセスのみを許可_許可IPの自動取得まで

CNからのコメントスパムがひどいことになってきたので
日本以外のIPを.htaccessで制限した。

※deny .cn で最初試したけどうまくいかなかった。DNSから国コードが引けないのが多い?

当初
http://www.cgis.biz/tools/access/
からとってきたのを置いてて、うまくいってたけど、このIPは
不定期に変わるらしいので毎日1回取りに行くことにした。といっても
http://wataame.sumomo.ne.jp/archives/550
からのコピペ。ありがたい。

こちらでいじったのは
・配置場所を手直し、allow from にお馴染みの「Allow from .il24.net」を追加
・cronで実行されるshに.htaccessのコピー配置も追記
・置き換える前に生成されるファイルのサイズチェックを追加
 (APNICから応答が無くて0バイトのIPリストができてしまう場合は置き換えを実施しない)
程度。

まるごとコピペなのも情けないので、内部で計算していた
サブネットマスクの計算についてチラッとメモ。

1)APNICで取れる情報
apnic|JP|ipv4|216.8.0.0|4096|19990910|allocated
→4096→216.8.0.0から4096個割り当ててる

2)サブネットマスク計算
=32-(LOG(4096)/LOG(2)) →20(255.255.240.0)

3)以下の様に表記される
allow from 216.8.0.0/20

■以下はほぼまるごとコピペの内容。
get_ip.php

<?php 
    // APNIC URL
    $fp_arr = file("http://ftp.apnic.net/stats/apnic/delegated-apnic-latest");
 
    $jp_ip4  = "order deny,allow" . "\n";
    $jp_ip4 .= "deny from all" . "\n\n";
 
    foreach( $fp_arr AS $v )
    {
        if( preg_match('/ipv4/', $v) && preg_match('/JP/', $v) )
        {
            $_line = explode('|', $v);
            $_line[3];
 
            $prefix = log($_line[4]) / log(2);
            $prefix = 32 - $prefix;
 
            $jp_ip4 .= "allow from " . $_line[3] . "/" . $prefix . "\n";
        }
    }
 
    // Search engine bot and YahooBB_InterLink
    $jp_ip4 .= "\n";
    $jp_ip4 .= "Allow from .googlebot.com" . "\n";
    $jp_ip4 .= "Allow from .yahoo.net" . "\n"; 
    $jp_ip4 .= "Allow from .msn.com" . "\n"; 
    $jp_ip4 .= "Allow from .bbtec.net" . "\n"; 
    $jp_ip4 .= "Allow from .il24.net" . "\n"; 

    print $jp_ip4;
?>


★こちらをcronで実行
jpip_get.sh

#!/bin/sh

/usr/local/bin/php /srv/bin/htaccesscron/get_ip.php >  /srv/bin/htaccesscron/.htaccess.new

SIZE=`ls -l /srv/bin/htaccesscron/.htaccess.new | awk '{ print $5 }'`

if [ -e /srv/bin/htaccesscron/.htaccess.new ] && [ $SIZE -gt 50000 ]; then

rm /srv/bin/htaccesscron/.htaccess.old
mv /srv/bin/htaccesscron/.htaccess  /srv/bin/htaccesscron/.htaccess.old
mv /srv/bin/htaccesscron/.htaccess.new  /srv/bin/htaccesscron/.htaccess

\cp -f /srv/bin/htaccesscron/.htaccess /配置先
\cp -f /srv/bin/htaccesscron/.htaccess /配置先

fi