Edited at

Nginxで国外からのWEBアクセスを遮断


事の発端

サーバが落ちてたので何気に再起動させたんですが、その数時間後また落ちる・・・。

何故ー?と思って原因を調べてみたところ、国外からのスパムがヒドくて落ちてたようです。

以前ちょろっとスパム対策してたので割と放置してたんですが甘かったです。

今回更にスパム対策を色々試してみたんですが、ボットの投稿がウザいとかそういう問題じゃないんです・・・、アタックのアクセスが多すぎてサーバ落ちるのが問題。


対策の方針

WPのサイトを運営しているのが良くないようでかなり攻撃されます。

相当頭に来たので、ブチ切れモードで海外からのWEBアクセスを全て遮断してやりましょう!w

今回の対策はNginx側で国内IPのアクセスのみを許可して他を全て切り捨てるという強引な方法になります。


対応内容

まず、IPアドレスのリストをダウンロードします。

このサイトからダウンロードできますね、今回は「cidr.txt.gz」というものを使わせて頂くことにします。

http://nami.jp/ipv4bycc/


$ cd /usr/local/src ← 書き込み権限アリにしてあります
$ mkdir ip_list
$ cd ip_list
$ wget http://nami.jp/ipv4bycc/cidr.txt.gz
$ gunzip cidr.txt.gz

次にNginx用の設定ファイルを作成して、Nginxの基本の設定ファイルを書き換えます。

$ su -

# cd /usr/local/src/ip_list
# sed -n 's/^JP\t\(.*\)/allow \1;/p' cidr.txt > /etc/nginx/allowip.conf
# vi /etc/nginx/nginx.conf

こんな感じ

http {

・・・
# Allow IP
include /etc/nginx/allowip.conf;
deny all;

include /etc/nginx/conf.d/*.conf;
}

そしてNginxを再起動すれば海外からのアクセスを全て遮断することになります。

Apacheと違ってallowとdenyを書く順序は逆になるみたいですね。 ^^A

ちなみに余談ですが、WPの場合は管理画面だけ個別にアクセス制限することもできます。

そうしたい場合はこんな感じの設定をそれらしい該当箇所に書けば良いかと思います。

※ただしこの場合は海外からのアクセスを受け入れる形になるのでタイトル詐欺です。

    location ~* /wp-login\.php|/wp-admin/((?!admin-ajax\.php).)*$ {

include /etc/nginx/allowip.conf;
deny all;
・・・
}

あとは再起動。

# /etc/init.d/nginx restart

おわり