Nginxでのアクセス制限

NginxでWEBサイトのメンテナンスなどの対応時に、特定のIPアドレスのみ接続を許可したい場合、ちょっとした設定で対応することが可能です。

今回は、CentOS 7にインストールしたNginxをベースにアクセス制限を行っていきます。

変更前の設定

変更前の default.conf の内容です。

server {
    listen 80;
    server_name hogehoge.com;

    location / {
        root   /var/www;
        index  index.html index.htm;
    }
}

アクセス拒否の設定

まずは、全てのアクセスを拒否する状態にします。
deny all; の記述をすることで、全てのアクセスを拒否する状態になります。

server {
    listen 80;
    server_name hogehoge.com;

    location / {
        root   /var/www;
        index  index.html index.htm;

        deny all;
    }
}

設定の反映

設定を反映しないと、何も変化がありません。
以下のコマンドを実行しましょう。

systemctl reload nginx

コマンド実行後に、サイトへアクセスすると「403 Forbidden」が表示されるはずです。
※設定によっては、別のページが表示されるかもしれません。

特定のIPアドレスのみアクセスを許可

このままでは、なにも見れない使えないサイトになってしまうので、特定のIPアドレスだけでアクセスが可能になるように設定を変更しましょう。

server {
    listen 80;
    server_name hogehoge.com;

    location / {
        root   /var/www;
        index  index.html index.htm;

        allow 192.168.0.100;
        deny all;
    }
}

この設定で、IPアドレスが192.168.0.100のアクセスだけ正常なページの表示となります。

それ以外のIPアドレスからのアクセスについては、先ほどと変わらず「403 Forbidden」となります。

複数のIPアドレスを設定したい場合

Nginxでは、geoモジュールを利用する事で複数のIPアドレスを評価する処理を簡単に記述することが可能となります。

詳細については、以下のURLから確認できます。
http://nginx.org/en/docs/http/ngx_http_geo_module.html

先ほどと同じ内容を、geoモジュールを利用した形式にしてみます。

geo $access_restrict {
    default 1;
    192.168.0.100 0;
}

server {
    listen 80;
    server_name hogehoge.com;

    set $restrict = "off";
    if ($access_restrict) {
        set $restrict = 'on';
    }

    if ($restrict = "on") {
        return 403;
    }

    location / {
        root   /var/www;
        index  index.html index.htm;
    }
}

$access_restrictでは、先ほどと同様に192.168.0.100を設定しています。

設定した192.168.0.100から来た場合には、$access_restrictから”1″が返却されます。

serverディレクティブ内のif文にて、返却値を判定し192.168.0.100からのアアクセス以外については、$restrictに”on”が設定される仕組みです。

$restrictの判定にて、”on”のアクセスについては強制的に403を返却する様にしています。

geoモジュールでの指定については、以下のように複数を記載することも可能です。

geo $access_restrict {
    default 1;
    192.168.0.100 0;
    192.168.0.101 0;
    192.168.0.102 0;
    192.168.0.103 0;
}

記載した4つのIPアドレスについては、アクセスが許可されている状態となります。

また、セグメント単位での指定も可能です。

geo $access_restrict {
    default 1;
    192.168.0.0/24 0;
}

このように設定を行った場合、192.168.0.1~192.168.0.255までのIPアドレスについてはアクセスが許可された状態となります。

総括

Apacheの場合には、.htaccessでも出来るような内容ですが、Nginxでは設定側に記述する必要があります。

設定内容としては、Apacheでやったことがある方は何となく出来ちゃいそうな感じです。

関連する記事