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ディレクティブを使った方法を使うとよいでしょう。