Header
2018-06-10
2019-11-12

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

Denial08120

最近海外からのサイトアクセスが増加しているのですが、 ログを見ると、明らかに攻撃対象を調査している履歴があったので、今回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でgzip圧縮を設定する

Nginxでトレイリングスラッシュ (trailing slash)をリダイレクトする

Amazon Linux 、Nginx、CertbotでLet’s Encryptを利用し、無料でSSL対応する

Ruby単体でAPIを操作する|Udemy

AWS S3コマンドでS3のバケットにzipファイルを転送する

BeautifulSoupとpython3を利用し、画像をスクレイピングしてローカルに保存する

前の記事
次の記事
人気記事
カテゴリーから記事を探す