mainvisual

nginxである条件下で特定のIPアドレスや、ネットワークアドレス単位でアクセス制限をかけたい事もあると思います。nginx deny で制限をかけるのですが、そこの部分いついてまとめていこうと思います。

構文

deny  ([address] [CIDR] [unix:] [all])
allow ([address] [CIDR] [unix:] [all])
パラメータ 説明
address IPアドレス (例:192.168.11.1、2011:01bd::)
CIDR IPアドレス範囲指定 (例:192.168.1.0/24)
unix IPアドレス範囲指定 (例:192.168.1.0/24)
all すべて

使い方

location / {
  deny  192.168.1.1;
  allow 192.168.1.0/24;
  allow 10.1.1.0/16;
  allow 2001:0db8::/32;
  deny  all;
}

解説

アクセス制限は、deny, allowで制限したいものをIPアドレスやネットワークアドレス単位で行います。
上記の例では、locationディレクティブに入れていますが、http, server, locationディレクティブのどこでも設定する事ができます。
このアクセスdeny,allowmは、設定された順番に解釈されていきます。

deny all の使用例

調べていくと、「deny all」を上手に利用するには、「geoディレクティブ」を使用すると良さそうです。

管理画面など、何か特定のIPからしかアクセスさせたくないコンテンツがあるとします。今回は 「/admin/」へのアクセスを制限する方法を紹介します。 具体的には、このように使います。

# ここでは、"disable"は拒否、"allow"は許可を表す。
geo $allow_ip {
  default disable;
  93.184.216.119 allow;  # 自社IP(example.com)
}

server{
  ....
  
  # geoで許可したIP以外は拒否
  location ~ ^/admin/ {
    if ($access_allowd = "disable") { deny all; }
    proxy_pass http://sub.example.com;
  }
}

geoの使い方の詳細は、こちら見た方が早いです。

参考文献