Nginx は、高性能 Web サーバーおよびリバース プロキシ サーバー ソフトウェアです。 Linux、Windows、FreeBSD などのさまざまなオペレーティング システム上で実行できるオープン ソース ソフトウェアです。 Nginx は、リバース プロキシ、負荷分散、HTTP キャッシュ、セキュリティ認証、その他のシナリオで一般的に使用されます。リバース プロキシ シナリオでは、Nginx はユーザー リクエストを複数のバックエンド サーバーに転送して、システムのパフォーマンスと信頼性を向上させることができます。この記事では、Nginx リバース プロキシでユーザーの動作に基づいて ACL を構成する方法を紹介します。
ACL とは Access Control List の略で、アクセス制御に使用される技術です。ネットワークでは、ACL テクノロジーはファイアウォール、ルーター、プロキシ サーバー、その他の機器で広く使用されています。 ACL は、IP アドレス、ポート番号、プロトコル タイプなどのさまざまな条件に基づいてユーザー アクセスを制限または許可できます。 Nginx リバース プロキシでは、ACL はユーザーのリクエストの特性に基づいてリクエストの転送を制限または許可できます。
Nginx の ACL 設定構文は次のとおりです:
location / {
# allow或deny用于定义访问控制规则,如:
allow ip; # 允许IP地址访问
deny ip; # 禁止IP地址访问
allow all; # 允许所有访问
deny all; # 禁止所有访问
}
ログイン後にコピー
その中で、ip は単一の IP アドレス、IP アドレス セグメント、または次のような CIDR 形式の IP アドレスです。 ##
allow 192.168.1.1; # 允许单个IP地址访问
allow 192.168.0.0/16; # 允许IP地址段访问
allow 192.168.1.0/24; # 允许CIDR格式的IP地址访问
ログイン後にコピー
IP に加えて、ACL はアドレスに加えて、HTTP リクエスト ヘッダー、リクエスト メソッド、リクエスト パスなどの他の条件もサポートします。 Nginx リバース プロキシでは、HTTP リクエスト ヘッダーはユーザーの行動特性を表す可能性があるため、特に重要です。
最新の Web アプリケーションでは、ユーザーの動作特性がますます複雑になっており、アクセス制御のためにより柔軟でインテリジェントな ACL 構成が必要になっています。たとえば、ユーザーのログイン状態、リクエストの頻度、リクエストのソースなどの要因に基づいて、リクエストの転送を制限または許可する必要がある場合があります。 Nginx では、次の方法でユーザーの行動に基づいた ACL 構成を実装できます。
リクエスト ヘッダーに基づく
Nginx では、if ステートメントを使用して HTTP リクエスト ヘッダーをチェックし、必要に応じて許可または拒否の命令を実行できます。たとえば、リクエスト ヘッダーの User-Agent フィールドをチェックすることで、特定のブラウザまたはオペレーティング システムへのアクセスを制限できます。設定例は次のとおりです。
location / {
if ($http_user_agent ~* MSIE) {
deny all;
}
allow all;
}
ログイン後にコピー
上記の設定は、User-Agent に「MSIE」が含まれるすべてのユーザーがアクセスを禁止され、その他のユーザーはアクセスが許可されることを意味します。
Cookie に基づく
最新の Web アプリケーションでは、通常、ユーザーは特定のリソースにアクセスするためにログインする必要があります。ログインしていないユーザーへのアクセスを制限するには、リクエストの Cookie フィールドを確認し、必要に応じて許可または拒否ディレクティブを実行する必要があります。たとえば、リクエスト ヘッダーの Cookie フィールドをチェックすることで、ログインしていないユーザーへのアクセスを制限できます。サンプル構成は次のとおりです:
location /protected {
if ($http_cookie !~* "access_token=.*") {
return 401; # 请求未携带access_token
}
allow all;
}
ログイン後にコピー
上記の構成は、リクエストに「access_token」フィールドが含まれていない場合は 401 エラーが返され、そうでない場合はすべてのユーザーがアクセスを許可されることを意味します。
アクセス頻度に基づく
一部のシナリオでは、ユーザーのアクセス頻度に基づいてユーザー アクセスを制限または許可する必要があります。たとえば、API インターフェイスのシナリオでは、リクエストの頻度をチェックすることで DDoS 攻撃を回避できます。 Nginx では、limit_req ディレクティブを使用して、アクセス頻度に基づいた ACL 構成を実装できます。設定例は次のとおりです。
http {
# 定义限制访问频率的配置
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
# 定义反向代理配置
server {
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://api.example.com/;
}
}
}
ログイン後にコピー
上記の設定は、各 IP アドレスが /api/ パスに 1 秒あたり最大 10 回アクセスでき、20 回のバースト アクセスが許可されることを示しています。ユーザーのアクセス頻度が制限を超えると、503 エラーが返されます。
リクエスト ソースに基づく
シナリオによっては、リクエストのソース IP アドレスまたはドメイン名に基づいてユーザー アクセスを制限または許可する必要があります。たとえば、一部のセキュリティ認証シナリオでは、リクエストの送信元 IP またはドメイン名をチェックすることでアクセス制御を実装できます。 Nginx では、 geo ディレクティブを使用して、リクエスト ソースに基づいて ACL 構成を実装できます。設定例は次のとおりです。
http {
# 定义IP地址库文件
geoip_country /usr/share/GeoIP/GeoIP.dat;
# 定义反向代理配置
server {
location / {
# 根据请求IP的国家代码进行访问控制
if ($geoip_country_code != CN) {
deny all;
}
proxy_pass http://proxy.example.com/;
}
}
}
ログイン後にコピー
上記の設定は、要求された IP が存在する国が中国でない場合、アクセスが禁止されることを意味します。ドメイン名に基づいてアクセスを制御する必要がある場合は、geoip_host ディレクティブを使用できます。
つまり、Nginx の ACL 構成は非常に柔軟かつ強力で、さまざまなニーズに応じてユーザーの行動に基づいてアクセス制御を実装できます。 ACL を使用する場合は、if ステートメントを乱用しないように注意する必要があります。if ステートメントは Nginx のパフォーマンスと安定性に影響を与えるためです。 ACL 設定を実装するには、できる限り Nginx の組み込み命令と変数を使用することをお勧めします。同時に、ACL 設定がシステム パフォーマンスに与える影響を最小限に抑えるために、実際の条件に基づいてパフォーマンス テストと最適化を実行する必要もあります。
以上がNginx リバース プロキシでのユーザーの動作に基づく ACL 構成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。