我们使用 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 指南,我们要求他们向 ourdomain.servicebus.windows.net 开放端口 9351-9354。现在我们发现,当有传入请求时,服务会连接到“ourdomain”(我们在 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 范围将来会改变吗?它是在某处硬编码的吗?