Azure サービス バス リレーを使用してクラウドに公開されるオンプレミス ソフトウェアを提供します。公開するために使用する基本的なコードは次のとおりです (識別可能なものはすべて削除しました)。
ServiceHost sh = new ServiceHost(typeof(BasicHttpEntityService));
BasicHttpRelayBinding basicHttpRelayBinding = new BasicHttpRelayBinding();
Uri uriEndPointAddress = ServiceBusEnvironment.CreateServiceUri("https", "ourdomain", "test-url-appendage");
m_shRelayServiceHost.AddServiceEndpoint(
typeof(IMyService),
basicHttpRelayBinding,
uriEndPointAddress
).Behaviors.Add(
new TransportClientEndpointBehavior
{
TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(
"MyUser",
"MyPassword")
});
sh.Open();
これはほとんどのお客様で問題なく機能しますが、あるお客様は厳格なファイアウォール ポリシーを持っています。
私たちが見つけた SB ガイドラインに従って、ポート 9351 ~ 9354 を ourdomain.servicebus.windows.net に開くように依頼しました。ここで、着信要求があると、サービスが「私たちのドメイン」(これは Wireshark と WCF ログでも成功していることがわかります) と 40.112.124.x 上の未知の (私たちにとって) サービスの両方に接続することがわかります。 9352 (最後のオクテットはリクエストごとに変わります)。
どのポートでも 40.xxx アドレスへの接続を禁止することで、開発環境で問題を再現できました。これは、WCF ログで発生することです。
System.Net.Sockets.SocketException (0x80004005): An attempt was made to access a socket in a way forbidden by its access permissions 40.112.124.25:9352
Server stack trace:
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
at Microsoft.ServiceBus.RelayedConnectionSession.ConnectAsyncResult.<GetAsyncSteps>b__4(ConnectAsyncResult thisRef, IAsyncResult r)
at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result)
Exception rethrown at [0]:
at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)
at Microsoft.ServiceBus.RelayedConnectionSession.EndConnect(IAsyncResult result)
この間、DNS 要求は送信されないため、この送信接続の機能の手がかりとなるホスト名はありません。
私の調査によると、これは Microsoft が制御するサブネットのようです。そのため、リレー サービスが接続されていることに問題はありませんが、次のことを知りたいです。
- この追加接続はオプションですか?
- そうでない場合、サブネット全体を許可する必要がありますか?
- この IP 範囲は将来変更される可能性がありますか? どこかにハードコードされていますか?