我们提供使用 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.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 请求发出,因此没有主机名提供此传出连接功能的任何线索。
根据我的调查,这似乎是一个Microsoft控制的子网,所以我对连接到它的中继服务很好,但我想知道:
- 此附加连接是可选的吗?
- 如果不是,我们是否应该允许整个子网?
- 这个IP范围将来会改变吗?它是在某处硬编码的吗?
最后,我们请求Microsoft的支持。简而言之,他们的回答如下:
-
此附加连接是可选的吗?
不,它不是可选的。对于中继侦听器,端口 5671 上有一个控制通道,此连接始终存在。 然后门户 9352 上有一个数据通道,当有中继客户端尝试与侦听器通信时建立此连接。
-
这个IP范围将来会改变吗?
目前,对于中继,此 IP 可能会更改,因此需要允许您所在区域 (https://www.microsoft.com/en-us/download/confirmation.aspx?id=41653) 中整个数据中心的 IP 范围。 SB产品团队将致力于在未来大幅缩小此IP范围,使其更具可预测性。 关于这个未来没有确切的预计到达时间。
所以好消息是他们正在努力。坏消息是,现在,我们需要将大量IP地址添加到白名单中以确保平稳运行。