日本国内のIPアドレス一覧を取得して海外からのアクセスを遮断する.htaccessをcronを使って作成する方法
2018/03/06
海外からの意味不明なコメントやトラックバックなど、迷惑なアクセスを全て遮断してみようということで、日本に割り当てられているIPアドレスを取得し、その情報を元に『cron』機能で.htaccessを作成してみたいと思います。
ただし、googleなどの海外IPのクローラーまでも遮断するのは運営上よろしくないので、ちょっとだけ工夫します。
日本に割り当てられているIPの一覧は下記サイトのものを利用させて頂きます。
http://www.cgis.biz/tools/access/
前提として
- .htaccess及びcronが使えるサーバー環境
- SSHを利用して、ターミナルからサーバにアクセスできる事
を満たしている事とします。
.htaccessの作り方
get_ip.phpを作成
まずは日本国内IPを取得し、成形するルーチンをphpで作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
// IP配布元 $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'; } } // 検索エンジンbotは許可する $jp_ip4 .= '\n'; $jp_ip4 .= 'Allow from .googlebot.com' . '\n'; $jp_ip4 .= 'Allow from .yahoo.net' . '\n'; $jp_ip4 .= 'Allow from .msn.com' . '\n'; print $jp_ip4; |
上記コードは、文字コード:UTF8、改行コード:LF で保存してください。
jpip_get.sh(シェル)を作成
次に cron で作動させるシェルスクリプトを作成。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/sh #phpにパスを通しながら実行する /usr/local/bin/php /var/www/develop/public_html/htaccesscron/get_ip.php > /var/www/develop/public_html/htaccesscron/.htaccess.new if [ -e /var/www/develop/public_html/htaccesscron/.htaccess.new ]; then rm /var/www/develop/public_html/htaccesscron/.htaccess.old mv /var/www/develop/public_html/htaccesscron/.htaccess /var/www/develop/public_html/htaccesscron/.htaccess.old mv /var/www/develop/public_html/htaccesscron/.htaccess.new /var/www/develop/public_html/htaccesscron/.htaccess fi |
上記コードも、文字コード:UTF8、改行コード:LF で保存してください。
中にあるphpのパスは、SSHで接続し、ターミナルから以下のコマンドで調査してください。
1 |
which php |
アップロード
設置ディレクトリ(/var/www/develop/public_html/htaccesscron/)にFTPでアップロードします。
ダミーの .htaccess 及び .htaccess.old も作成し、アップロードしてください。
アップした実行ファイル2つのパーミッションを755に変更します。
テスト
cronで動かす前に、きちんとhtaccessが作成されるかをテストします。
1 2 |
$ cd /var/www/develop/public_html/htaccesscron/ $ jpip_get.sh |
としても、
-bash: jpip_get.sh: command not found
と、エラーになります。
シェルスクリプトはドキュメントルートのフルパスを書かないと動かないので、正しくは、
1 |
$ /var/www/develop/public_html/htaccesscron/jpip_get.sh |
となります。
正常動作すると、アップロードしていたダミーの .htaccess が生まれ変わるのが確認出来ると思います。
失敗する場合は、ファイルのパーミッション、phpへのパス、設置場所のパスなどを確認してください。
『cron』について
「cronを使って自動作成」云々と上の方にも書いていますが、そもそも cron とは何なのかを簡潔に書きますと、コマンドやシェルスクリプトを「指定した日時に自動実行する」機能のことです。
データベースのバックアップを作成したり、逆に古いログを削除したりする場合などに使用されます。
cron を使用するためには、「crond」というデーモンが起動している必要がありますが、通常は、OSのインストール時にサービスが自動起動するように設定されています。
ちなみに読み方は「クローン」とか「クーロン」となります。
cronの作成
SSH接続し、crontabを作成します。
# crontab -e
上記コマンドで vi が起動するので編集します。
1行に、分、時、日、月、曜日(0=Sun,1=Mon,2=Tue,3=Wen,4=Thu,5=Fri,6=Sat)、
実行するコマンドを入力します。ワイルドカード『*』は、全てを意味します。
編集開始:[i]キー
1 2 3 4 |
(例)毎日朝の6:00に実行 0 6 * * * /var/www/develop/public_html/htaccesscron/jpip_get.sh (例)10分毎に実行 0,10,20,30,40,50 * * * * /var/www/develop/public_html/htaccesscron/jpip_get.sh |
保存:[Escキー]:wq[Enterキー]
確認
1 |
# crontab -l |
1 |
0,10,20,30,40,50 * * * * /var/www/develop/public_html/htaccesscron/jpip_get.sh |
上記一文が追加されています。
日時の設定方法
Cron の日時設定には入力の規則がありますので、以下の内容を参考に必要な設定を行ってください。
フィールド | 設定値 / 説明 |
---|---|
分 | 『0~59』で指定。 ワイルドカード『*』を指定すると毎分となります。 |
時 | 『0~23』で指定。 ワイルドカード『*』を指定すると毎時となります。 |
日 | 『1~31』で指定します。ワイルドカード『*』を指定すると毎日となります。 |
月 | 『1~12』または『jan~dec』で指定。 ワイルドカード『*』を指定すると毎月となります。 |
曜日 | 『0~7』(0,7は日曜日)または『sun~sat』で指定します。 ワイルドカード『*』を指定すると毎日となります。 |
コマンド | 実行したいコマンドやシェルを指定します。 |
設定内容 | 入力例 | ||||
---|---|---|---|---|---|
分 | 時 | 日 | 月 | 曜日 | |
毎時 0 分に実行する | 0 | * | * | * | * |
2 時間おきに実行する | * | */2 | * | * | * |
0 時と12 時に実行する | * | 0,12 | * | * | * |
0 時から 12 時までの毎時 15 分に実行する | 15 | 0-12 | * | * | * |
毎月 1 日の 0 時 0 分に実行する | 0 | 0 | 1 | * | * |
毎月 1 日または毎週金曜日の 23 時 59 分に実行する | 59 | 23 | 1 | * | 5 |