Nginxで一部海外IPからのアクセスを遮断する

最近海外からのサイトアクセスが増加しているのですが、 ログを見ると、明らかに攻撃対象を調査している履歴があったので、今回Nginxで一部海外からのアクセスを遮断する設定を行いました。
なお、特定のIPのみからのアクセスを拒否したい場合は以下の記事を御覧ください
海外IPからアクセスを遮断するには
Nginx はdeny <180.76.186.86>;と記載すれば、指定IPアドレスからのアクセスを削除できます。
今回Nginxでアクセス対象のIPアドレスリストを作成し、 遮断ルールとして反映します。
海外からのアクセスを全て遮断してもいいのですが、 グーグルのbotは海外からアクセスされるため、全て遮断するとSEO的にもあまりよくないので、今回は特定国の中国・ロシア・フランスのIPアドレスを遮断します。
海外IPからのアクセスログ
当サイトのプログラミング言語はRubyでフレームワークはRuby on Railsです。
その為そもそもindex.phpなどのルートは存在しないのですが、 以下ログの通り、1秒以内に中国からアクセス履歴がありました。
180.76.186.86 - - [09/Jun/2018:19:31:28 +0000] "GET /phpMyAdmin.old/index.php HTTP/1.1" 301 185 "-" "Mozilla/5.0" 180.76.186.86 - - [09/Jun/2018:19:31:28 +0000] "GET /pma-old/index.php HTTP/1.1" 301 185 "-" "Mozilla/5.0" 180.76.186.86 - - [09/Jun/2018:19:31:29 +0000] "GET /claroline/phpMyAdmin/index.php HTTP/1.1" 301 185 "-" "Mozilla/5.0" 180.76.186.86 - - [09/Jun/2018:19:31:29 +0000] "GET /typo3/phpmyadmin/index.php HTTP/1.1" 301 185 "-" "Mozilla/5.0" 180.76.186.86 - - [09/Jun/2018:19:31:29 +0000] "GET /phpma/index.php HTTP/1.1" 301 185 "-" "Mozilla/5.0" 180.76.186.86 - - [09/Jun/2018:19:31:29 +0000] "GET /phpmyadmin/phpmyadmin/index.php HTTP/1.1" 301 185 "-" "Mozilla/5.0"
※IP180.76.186.86は中国
国別のIPアドレスリストをダウンロードする
有志の方が作成された国別IPアドレスリストを、nginxのディレクトリへダウンロードします。
操作権限及び保存先のディレクトリは適時変更してください。
$ cd /etc/nginx $ wget http://nami.jp/ipv4bycc/cidr.txt.gz $ gunzip cidr.txt.gz
アクセス拒否リストを作成する
nginxのディレクトリで deny.confを新規作成します
この deny.confファイルは先程ダウンロードした国別IPアドレスリストからアクセス拒否したい国のIPアドレスを流しこみ、nginxへincludeします。
コマンドは以下のような形です
sed -n 's/^国のコード\t\(.*\)/deny \1;/p' cidr.txt > /etc/nginx/deny.conf
※国名の指定はIPアドレスリストを提供している このサイトから御覧ください
例えば以下ではロシア フランス 中国からのアクセスを拒否
$ cd /etc/nginx $ touch deny.conf # sed -n 's/^CN\t\(.*\)/deny \1;/p' cidr.txt > /etc/nginx/deny.conf # sed -n 's/^FR\t\(.*\)/deny \1;/p' cidr.txt >> /etc/nginx/deny.conf # sed -n 's/^RU\t\(.*\)/deny \1;/p' cidr.txt >> /etc/nginx/deny.conf
流し込みが完了したら内容を見てみましょう。 大量のIPアドレスが記載されています。
vi deny.conf deny 213.111.0.0/18; deny 213.128.32.0/19; deny 213.138.0.0/19; deny 213.139.96.0/19;
Nginxへルールを設定する
etc/nginx/nginx.conf http { include /etc/nginx/deny.conf; #VirtualHostを設定している場合は以下を記載 #include /etc/nginx/deny.d/*.conf; }
Nginxをリロード
あとはリロードすれば反映されます。
nginx -s reload
ログでの見え方
ルールに合致すると、Nginxのnginx.error.logで以下のような感じで access forbidden by ruleと記載され拒否されていることが分かります。 ※host とserverには自身の環境内容が反映
2019/07/06 06:48:44 [error] 29322#0: *416232 access forbidden by rule, client: 58.17.148.116, server: , request: "GET / HTTP/1.1", host: "" 2019/07/06 06:48:54 [error] 29322#0: *416234 access forbidden by rule, client: 122.228.19.80, server:, request: "GET /HNAP1 HTTP/1.1", host: "", referrer:
※58.17.148.116と122.228.19.80は中国
以上になります。
国指定のIPアドレスでも定期的に追加されるので、 リストを自動アップデートするようなプログラムを組む必要もありますが、取り急ぎの対応としては紹介した内容で 対応可能です。
また無料のCDN クラウドフレアでも無料のファイアウォール機能を利用して、指定国からのアクセス拒否や DDOS攻撃対策やサイト読み込みの高速化などは以下で対応可能です。
詳細はクラウドフレアのファイアウォール機能を利用して特定国からのアクセスを除外するをご覧ください。
その他関連記事
Nginxでトレイリングスラッシュ (trailing slash)をリダイレクトする
Amazon Linux 、Nginx、CertbotでLet’s Encryptを利用し、無料でSSL対応する