Apache cron

国外IPを遮断する.htaccessをcronで作成する<CPIサーバー編>

2018/03/06

海外からのスパムやDDOS攻撃などを受けた場合に、アクセス自体を遮断し、コンテンツやサーバを守るといった事を目的とする前回のエントリー内容を「CPI」サーバで行う場合の解説です。

CPIサーバは提供されるユーザ用コントロールパネルから cron の設定が可能ですが、CPI独自の設定があったため、 .htaccess を作成するのにキックするシェルスクリプト作成に少しつまづきました。

どこでつまづいたかなども書きましたので、私同様、CPIサーバを使用している方の作業時間が少しでも短縮されれば幸いです。

.htaccessの作り方

get_ip.phpを作成

[php]
<?php
// IP配布元
$fp_arr = file("http://ftp.apnic.net/stats/apnic/delegated-apnic-latest");

$jp_ip4 = "AddHandler x-httpd-php528 .php" . "\n\n";
$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)) {
$_exp = explode('|', $v);
$_exp[3];

$prefix = log($_exp[4]) / log(2);
$prefix = 32 - $prefix;

$jp_ip4 .= "allow from " . $_exp[3] . "/" . $prefix . "\n";
}
}

$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 env=AllowCountry" . "\n";

print $jp_ip4;
?>
[/php]

6行目にCPI独自の設定である、使用するPHPのバージョンを表記します。これが第1のポイント。
phpスクリプトですので文字コードは UTF8、改行コードは LF で保存。

jpip_get.sh(シェル)を作成

[shell]
#!/bin/sh

#phpにパスを通しながら実行する
/usr/local/bin/php-5.2.8 /usr/home/ユーザID/html/test_dir/get_ip.php > /usr/home/ユーザID/html/test_dir/.htaccess.new

if [ -e /usr/home/ユーザID/html/test_dir/.htaccess.new ]; then

rm /usr/home/ユーザID/html/test_dir/.htaccess.old
mv /usr/home/ユーザID/html/test_dir/.htaccess /usr/home/ユーザID/html/test_dir/.htaccess.old
mv /usr/home/ユーザID/html/test_dir/.htaccess.new /usr/home/ユーザID/html/test_dir/.htaccess

fi
[/shell]

注意する点は、PHPへのパスの表記。これが第2のポイントとなります。

CPIサーバは色々なバージョンのPHPが使えるので、どのバージョンを使用するのかを明記する必要があります。
バージョン付きPHPの表記は『php-*.*.*』と、phpの後にハイフン、バージョン番号となります。
これが判明するのに1時間使いました(苦笑)
こちらもやはり、文字コードは UTF8、改行コードは LF で保存します。

アップロード

例として、/html/test_dir/ にアップロードします。
get_ip.php、jpip_get.sh → 755
.htaccess、.htaccess.old → 644 とパーミションを設定。

テスト

SSHでアクセス出来る環境が整っている場合は、テストしてみましょう。
CPIのcron、最短でも20分に1回しか起動できない設定なので、動くかどうか20分待ち通すのもスマートじゃないですからね(苦笑)

とターミナルを叩けば、シェルスクリプトが起動し、新しい .htaccess が作成されると思います。
作成されない場合は、phpのパス、パーミッション等を確認してください。

cronの設定

サーバのコントロールパネルにログインし、「製作ルーツ」タブの「スクリプト定期実行ツール」をクリック。

(1) 先ほどアップロードした 「jpip_get.sh」を選択
(2) PHPプログラムではないので、選択不可になります
(3) 一日一回、6:00にセットする場合は、「毎日」「06時」「00分」とプルダウンを選択
「追加する」ボタンを押下すると、セット完了です。

これで海外からのアクセスが遮断され、幸せになれるはずです。
上手くいきましたら、コメントをお願いします!

-Apache, cron
-, , , ,