NginxでIPアドレスでのアクセスを禁止する方法

NginxでIPアドレスでのアクセスを禁止する方法

Nginxで名前ベースのバーチャルホストを構成している環境では、要求されたドメイン名に応じてそれぞれのサイトに振り分けられますが、想定外の名前(たとえば、IPアドレス直打ちなど)でアクセスしてきた場合にどのような動作になるかご存知ですか?

Nginxの既定の動作では、設定ファイル(nginx.conf)に定義されていない名前でアクセスされた場合、設定ファイルの先頭に記述してあるserverブロックに振り分けられます。

この既定の動作は、1サイトの運用なら特に気にする必要はないかもしれませんが、バーチャルホスト環境で複数のサイトを運用している場合だと、意図しないサイトへアクセスされる可能性があります。

そこでここでは、CentOS 7のNginxを例に、IPアドレスなど未定義の名前でアクセスしてきた場合に、アクセスをブロックする方法を紹介します。

この記事は、以下の環境での動作結果を基にしています。他のディストリビューションやバージョンでは、動作結果が異なる場合があることをご了承ください。

ソフトウェアバージョン
CentOS Linux7.6.1810
Nginx1.15.12

IPアドレスでのアクセスを禁止する

nginxの設定ファイルで、serverブロック内のlistenポート番号の後ろに「default_server」を付けると、未定義の名前でのアクセスは、すべてそのserverブロックで処理されます。

この仕様に従い、IPアドレスなどの未定義の名前でのアクセスに対して、エラーコード「444」を応答する設定を追記します。

注意点としては、443番ポートでのアクセスを受け付ける場合は、証明書が必要となります。(ここで使用する証明書は、⾃⼰署名証明書で構いません)

以上の内容を設定ファイルに追記すると以下のようになります。

server {
   listen 80 default_server;
   listen 443 ssl default_server;
   server_name _;
   ssl_certificate /usr/local/ssl/selfcert.crt;
   ssl_certificate_key /usr/local/ssl/selfcert.key;
   return 444;
}
Memo

すでに別のserverブロックに「default_server」を記述している場合は、その記述を削除しておいてください。

自己署名証明書を作成する

上で使用する自己署名証明書は、CentOS 7なら以下のコマンドを順に実行することで、簡単に作成できます。

以下のコマンドは、「秘密鍵ファイル作成」>「CSRファイル作成」>「証明書ファイル作成」を順に実行しており、10年間有効な証明書を作成しています。

openssl genrsa 2048 > selfcert.key
openssl req -new -key selfcert.key > selfcert.csr
openssl x509 -days 3650 -req -signkey selfcert.key < selfcert.csr > selfcert.crt

参考

Nginx - Server_names

Nginx - How nginx processes a request