私は多かれ少なかれ、AWSの構成に従っています:
3台のマシンと3つの異なる可用性ゾーンを備えたElastic Load Balancer。私のセキュリティグループでは、私のRailsアプリケーション(nginx、Unicorn))であるため、0.0.0.0/0:80を許可しています。
特定のパブリックIPアドレスへのアプリへのアクセスを拒否する方法があるかどうか疑問に思っていましたか?私はAWSのドキュメントを読んでいますが、SGは「すべて拒否」なので、1つだけ特定のIPアドレスを拒否する方法はありません。
何か案は?ロードバランサーの背後にある3台のマシンのiptables?
ありがとう!
簡単な解決策は、VPCネットワークACL受信ルールを使用することです。これは、ELBがVPC内にある場合にのみ機能しますが、過去数年間に作成した場合は、デフォルトのELBになるはずです。
たとえば1.2.3.4を禁止するには、次のようにします。
VPC
に移動します。Network ACLs
を選択します。Inbound Rules
タブを選択します。Edit
を選択し、次の属性を持つ新しいルールを追加します。ネットワークACLについてのより多くの情報がここにあります: http://docs.aws.Amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html
そのためには、あなたが言ったように、3つの異なるマシンのIPtablesが最善の解決策です。
実際には、リモートIP(Nginxでは$remote_addr
)はAmazonのロードバランサーからのものになるため、これは良い解決策ではありません。これを禁止すると、転送されるすべてのトラフィックが禁止されます。
パケットを検査してHTTP X-Forwarded-For
ヘッダーを見つける必要があります。IPtablesはそのようなプロトコルに対応していません。
私はNginxの2つのいたずらなIPに対する次の解決策に落ち着きました
set $client_ip $remote_addr;
if ($http_x_forwarded_for) {
set $client_ip $http_x_forwarded_for;
}
if ($client_ip = "123.123.123.123") {
return 403;
}
if ($client_ip = "123.123.123.234") {
return 403;
}
変数$client_ip
の紹介。これは、http_x_forwarded_for
が利用できない場合に、ローカルでこれをテストできるようにするためです。
少し話題から外れていますが、便宜上投稿していますが、そのクライアントIPをアクセスログに追加しました。
log_format main "\$client_ip - \$remote_user [\$time_local] \"\$request\" \$status \$body_bytes_sent \"\$http_referer\" \"\$http_user_agent\"";
access_log /var/log/nginx.access.log main;
それはきれいではありませんが、それが役に立てば幸いです
いいえ、セキュリティグループでIPをブロックするオプションはありません。
セキュリティグループは、ブラックリストではなく、基本的にホワイトリストです。
デフォルトではすべてが拒否されており、必要に応じて選択的にポートを開くことができますが、特定の人物/ IPをブロックすることはできません。
そのためには、あなたが言ったように、3つの異なるマシンのIPtablesが最善の解決策です。
今後、AWSセキュリティグループにもこの機能が追加されると確信していますが、現時点ではサポートされていません。
いくつかのIPのみをブラックリストに登録する必要がある場合は、おそらくWebサーバーで nginx_http_access_module を使用できます。