Nginxで名前ベースのバーチャルホストで複数のWebサイトを公開している環境では、要求されたFQDN名に応じてそれぞれのサイトに振り分けられますが、設定ファイルに定義してない名前(たとえば、IPアドレス直打ちなど)でアクセスされたときに、意図していないサイトに振り分けられてしまう場合があります。
そのため、バーチャルホストで複数のサイトを公開している場合は、定義していない名前でのアクセスは、指定したサイトに振り分けるか、アクセスそのものを遮断するのがおすすめです。
そこでここでは、Nginxでバーチャルホストで複数のサイトを公開している場合に、IPアドレスなど未定義の名前でのアクセスを特定のサイトに振り分けたり、アクセスを切断(ブロック)する方法を紹介します。
目次
特定のサイトに振り分ける
IPアドレスなど未定義の名前でのアクセスを特定のサイトに振り分けには、2通りの方法があります。
Nginxの既定の動作では、設定ファイルに定義されていない名前でアクセスされた場合、設定ファイルの先頭に記述されているserverブロックに振り分けられるので、未定義の名前でのアクセスを受け付けたいサイトのseverブロックの記述を設定ファイルの先頭に移動させることで、常にそのサイトでアクセスを受け付けるようにできます。
もう一つの方法は、未定義の名前でのアクセスを受け付けたいサイトのlistenディレクティブ設定に「default_server」の記述を追加することで、未定義の名前でのアクセスをすべてそのサイトに振り分けることができます。
server {
listen 80 default_server;
listen 443 ssl default_server;
・・・・・
}
すでに別のserverブロックのlistenディレクティブに「default_server」を記述している場合は、その記述を削除します。
アクセスを切断する
未定義の名前でのアクセスを受け付けたくない時は、以下のserverブロック設定を追記することで、IPアドレスなどの未定義の名前でのアクセスを切断することができます。
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /etc/nginx/ssl/selfcert.crt;
ssl_certificate_key /etc/nginx/ssl/selfcert.key;
return 444;
}
リターンコード「444」は、Nginx独自のコードで、アクセス元に何も応答することなくコネクションを閉じます。
すでに別のserverブロックのlistenディレクティブに「default_server」を記述している場合は、その記述を削除しておいてください。
server_nameディレクティブに指定している「_(アンダースコア)」は、定義されていないすべての名前を指定するワイルドカードです。
自己署名証明書の作成
443番ポート(HTTPS)でのアクセスを定義するには、証明書が必要となります。(ここで使用する証明書は、⾃⼰署名証明書で構いません)
自己署名証明書は、以下のコマンドを順に実行することで簡単に作成できます。
以下のコマンドでは、「秘密鍵ファイル作成」>「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