Azure が認識している IP アドレスを予測する方法に関するドキュメントを見つけることができませんでした。
これが、私が参照している IP です。赤で示しています。
プログラムで CURRENT CLIENT IP ADDRESS xxx.xxx.xxx.xxx ADD TO ALLOWED IP ADDRESSES を実装しようとしています。
Azure が認識している IP アドレスを予測する方法に関するドキュメントを見つけることができませんでした。
これが、私が参照している IP です。赤で示しています。
プログラムで CURRENT CLIENT IP ADDRESS xxx.xxx.xxx.xxx ADD TO ALLOWED IP ADDRESSES を実装しようとしています。
IPアドレスは、固定のパブリックIPアドレスを持つマシンから来ている場合を除き、接続しているネットワークのNATによって決定されます。同じネットワークから接続しているクライアントマシンがあり、ネットワークを詳細に理解していない限り、クライアントのIPアドレスを確実に予測できるとは限りません。唯一の解決策は、たとえば86.0.0.0から86.255.255.255までの範囲を追加し、接続元のネットワークをカバーすることを期待することです。ただし、多くの「望ましくないもの」もその範囲に到達します。
クライアントIPアドレス機能は、必要に応じて手動で設定できる直接管理者アクセス以外には使用しないでください。ポート1433を介したアクセスを特定のローカルネットワークマシンに制限することにより、ローカルファイアウォールルールを使用してロックダウンすることもできます。より一般的なアクセスは、ODataスタイル、モバイルサービス、またはVPN、VM、その他のIaaSサービスによって促進できるある種のポートブリッジの使用など、ある種のサービスに制限する必要があります。
まず、ユースケースについて強く考えることをお勧めします。SQLへの直接アクセスは、クラウドコンピューティングにとって実行可能なパターンではありません。より速く、より安全で、より管理しやすい多くの選択肢が存在します。その上、少なくともあなたは、セキュリティの人たちにSQLポート用のファイアウォールに穴を開けさせようとする苦痛の世界に入っています。
これが私にとってうまくいったことです:既存のファイアウォール例外を発信者のIPアドレスに更新する「AutoDetectClientIP」管理API呼び出しがあります。
ただし、特定のサブスクリプション、サブスクリプション ID、SQL Azure サーバーの名前、およびファイアウォール例外の名前に対して有効な管理証明書にアクセスする必要があります。
public static bool SetFirewallRuleAutoDetect(string certFilename, string certPassword, string subscriptionId, string serverName, string ruleName)
{
try
{
string url = string.Format("https://management.database.windows.net:8443/{0}/servers/{1}/firewallrules/{2}?op=AutoDetectClientIP",
subscriptionId,
serverName,
ruleName);
HttpWebRequest webRequest = HttpWebRequest.Create(url) as HttpWebRequest;
webRequest.ClientCertificates.Add(new X509Certificate2(certFilename, certPassword));
webRequest.Method = "POST";
webRequest.Headers["x-ms-version"] = "1.0";
webRequest.ContentLength = 0;
// call the management api
// there is no information contained in the response, it only needs to work
using (WebResponse response = webRequest.GetResponse())
using (Stream stream = webResponse.GetResponseStream())
using (StreamReader sr = new StreamReader(stream))
{
Console.WriteLine(sr.ReadToEnd());
}
// the firewall was successfully updated
return true;
}
catch
{
// there was an error and the firewall possibly not updated
return false;
}
}