Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

事の発端

サーバが落ちてたので何気に再起動させたんですが、その数時間後また落ちる・・・。
何故ー?と思って原因を調べてみたところ、国外からのスパムがヒドくて落ちてたようです。
以前ちょろっとスパム対策してたので割と放置してたんですが甘かったです。
今回更にスパム対策を色々試してみたんですが、ボットの投稿がウザいとかそういう問題じゃないんです・・・、アタックのアクセスが多すぎてサーバ落ちるのが問題。

対策の方針

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

おわり

KensukeSakakibara
ずっとお絵描きをして生きてきましたが、趣味だったプログラミングがいつのまにか本職になっていたWEBプログラマです。 高負荷環境でのLAMPが得意でソシャゲとか作ってました。 PerlからのJavaからのPHPerで、次はGoがやりたいと思ってますが現在はUnityでC#が多いです。 あと電子工作とかも割と好きでAVR派です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away