とーますメモ

Ruby on Rails / Goなどの学習メモ

【Nginx】IPアドレス直接アクセスを防ぐ(ドロップさせる)方法

Hostヘッダが未定義なリクエスト、つまりIPアドレス直接アクセスを防ぐために試したことのメモ。

未定義のリクエストをさばくためのServerコンテキストを以下のように定義する。

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

設定で複数のバーチャルサーバがある場合、リクエストのHost ヘッダとserver_nameディレクティブが一致するServerコンテキストが選ばれるが、一致しない場合は、default_serverオプションが付いたServerコンテキストか、設定ファイル内で最初にIPとポート番号に一致したlistenディレクティブを持つServerコンテキストが選ばれる。

そのため明示的に想定外のアクセスを処理するためのServerコンテキストを設定するためにdefault_serverを指定し、server_nameには"_"(アンダースコア)を指定する。"_" を指定することですべての名前に対応する。

ただしこのままだとhttps経由でのアクセスには対応できないので
以下のようにオレオレ証明書を用いた以下の設定をすれば良さそうだったが、

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

自分の場合は、どうやってもうまくできなかったので
最終的にhttps経由でのアクセス対策は以下の方法で対応した。

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

server {
    listen 443;
    server_name example.com;

    if ($host !~* "example.com") {
        return 444;
    }
    ...
}

[参考]
nginx連載4回目: nginxの設定、その2 - バーチャルサーバの設定 - インフラエンジニアway - Powered by HEARTBEATS
Nginx で http も https も IP 直打ちのアクセスを弾きたい - べにやまぶろぐ
Nginxで「default_server」を指定して想定外のアクセスを遮断する方法 | 4thsight.xyz
nginxの設定 その2 - bnote
Nginxで443ポートにデフォルトサーバーを指定する | Junk Works
Nginx: Block Direct IP Access
nginx - Block direct access to webserver IP via HTTPS - Server Fault
ssl - Properly setting up a "default" nginx server for https - Server Fault