NginxでIPアドレスでアクセス制限を設定する方法

NginxでIPアドレスでアクセス制限を設定する方法

LinuxでのWebサーバーソフトウェアとして一般的なNginxでは、IPアドレスによるアクセス制限をかけることができます。

そこでここでは、Nginxでアクセス制限をかける方法として、allow/deny ディレクティブを使った方法と、geoディレクティブを使った方法を解説します。

allow/denyディレクティブ

NginxでIPアドレスによるアクセス制限を設定する場合、最も一般的な方法はallow/deny ディレクティブを使った方法です。

allow / denyディレクティブは、http / server / locationコンテキスト内で使用でき、アクセスを拒否されたときは、HTTPステータスコードとして「403 Forbidden」が返されます。

allow / denyディレクティブの一般的な記述例は、以下のとおりです。

location /wp-admin/ {
  allow 192.168.1.0/24;
  allow 127.0.0.1;
  deny all;
}

上の設定は、URLに/wp-admin/を含むアクセスに対して 192.168.1.0/24と127.0.0.1(自分自身)からのアクセスを許可して、それ以外からのアクセスを拒否しています。

なお、allow / denyディレクティブの記述は上から順番に処理され、最後に「deny all;」と記述することで、 許可したIPアドレス以外からのアクセスを拒否しています。

たくさんのIPアドレスを記述する必要がある場合は、許可するIPアドレスを記述したファイルを別に用意して、inculdeディレクティブで読み込むのがおすすめです。

inculdeディレクティブに指定するファイルは、/etc/nginxからの相対パスで記述したり、フルパスで指定できます。

location /wp-admin/ {
  include allowed-address.txt;
}
# vi allowed-address.txt

allow 192.168.1.10;
allow 192.168.1.11;
allow 192.168.1.15;
allow 192.168.1.20;
deny all;

geoディレクティブ

もう一つの方法は、geoディレクティブを使った方法で、allow / denyディレクティブとの違いとしては、任意のHTTPステータスコードを返したり、別ページにリダイレクトさせるといったことができます。

geoディレクティブの記述例は、以下のとおりです。

まず、httpコンテキスト内のgeoディレクティブで、変数「$deny_ip」にクライアントのIPアドレスに応じた値を定義します。

http {
  geo $deny_ip {
    default 1;
    192.168.10.0/24 0;
  }
}

上の設定では、クライアントのIPアドレスが192.168.10.0/24であれば、変数$deny_ipに「0(false)」が格納され、それ以外のアドレスなら「1(true)」が格納されるよう定義しています。

次に、serverコンテキスト内で変数$deny_ipの値に応じた処理を記述し、下の設定では、変数$deny_ipの値が「1(true)」ならHTTPステータスコードとして「444」を返すよう記述しています。

server {
  if ($deny_ip) {
    return 444;
  }
}

あとがき

通常のアクセス制限は、allow / denyディレクティブを使い、アクセス制限時に403以外のステータスコードを返したいときや別のページにリダイレクトしたいときはgeoディレクティブを使った方法を使うとよいでしょう。