我们使用Azure Service总线中继提供暴露于云的内部部署软件,我们用于公开的基本代码如下(我删除了所有可识别的内容):
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();
这对大多数客户来说都很好,但是,我们的一位客户有严格的防火墙政策。
According to the SB guidelines we have found,我们要求他们将端口9351-9354打开到ourdomain.servicebus.windows.net。现在我们发现当有传入请求时,服务连接到'ourdomain'(我们在Wireshark中看到这个成功,也在WCF日志中成功)和40.112.124.x上的未知(对我们)服务: 9352(最后一个八位字节随每个请求而变化)。
我已经能够通过禁止连接到任何端口上的任何40.x.x.x地址来重现我的开发环境中的问题。这是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请求,因此没有主机名提供此传出连接功能的任何线索。
从我的调查来看,this appears to be a Microsoft controlled subnet,所以我很好地连接到它的中继服务,但我想知道:
答案 0 :(得分:3)
最后,我们要求微软提供支持。 简而言之,他们的答案如下:
此附加连接是否可选?
不,它不是可选的。对于中继侦听器,端口5671上有一个控制通道,此连接始终存在。然后在门户网站9352上有一个数据通道,当有一个中继客户端尝试与监听器通信时建立此连接。
未来这个IP范围会发生变化吗?
目前,对于中继,此IP可以更改,因此您需要允许您所在区域的整个数据中心的IP范围(https://www.microsoft.com/en-us/download/confirmation.aspx?id=41653)。 SB产品团队将在未来大力降低此IP范围,使其更具可预测性。这个未来没有确切的ETA。
所以好消息是他们正在努力。坏消息是,现在,我们需要在白名单中添加大量IP地址,以确保顺利运行。