多实例服务器上的SQL Server Reporting Services(SSRS)IP处理

TL;博士

我有一个多实例SQL Server上的专用IP地址和端口(162.xxx.xxx.51:1433)的SQL Server实例(SQLSERVER01-i01)(Windows Server上的每个SQL Server实例都有自己的IP地址)全部运行在一台Windows服务器上(SQLSERVER01 / 162.xxx.xxx.50)。

我还有一个专用的具有自己的IP地址和端口(168.xxx.xxx.71:1433)的Reporting Services实例(SQLSERVERRS01-i01),该实例运行在具有自己的IP地址的不同Windows服务器(SQLSERVERRS01)上.xxx.xxx.70)。

专用的Reporting Services服务器具有应用程序APPL1 ,可以通过http://SQLSERVERRS01-i01:80/Reports_APPL1或通过http://SQLSERVERRS01:80/Reports_APPL1

由于主机报头的Reporting Servicesconfiguration中的*:80configuration,SSRS将select这两个请求。

我们在每个IP范围之间都有多个防火墙,这意味着我们必须为每个IP到IP或IPrange到IP的连接申请一个特定的规则。 但是,如果涉及两台服务器,则安全性要求防火墙始终必须是IP到IP的规则。

(基于屏幕截图进一步下降)

当Reporting Services服务器连接到SQL Server实例(位于162.xxx.xxx.51)以检索数据时,是否始终会与Windows服务器的基础IP地址(168.xxx.xxx.70 / preferred)build立连接)SSRS正在运行,还是将(有时)使用SQL Server Reporting Services实例的IP地址(168.xxx.xxx.71)?

这与使用IP到IP方法的防火墙规则的configuration相关。 我将要么申请一个规则,通过端口1433或168.xxx.xxx.70到162.xxx.xxx.51连接定义一个168.xxx.xxx.71到162.xxx.xxx.51连接港口1433。

目前我会申请两个防火墙规则。

奖金问题

我可以configurationReporting Services服务器与专用IP地址进行通信吗? 在这种情况下与168.xxx.xxx.71地址。

解决scheme我不是在找

我不是在寻求如何优化防火墙configuration或如何为我们的networking实施分区概念的build议。 (它已经在pipe道中)。 另外,我对反馈表示不感兴趣,build议在同一台服务器上安装SQL Server和SSRS可以解决我的问题。 我知道,很乐意这样做,但需要与SSRS组件一起运行的第三方软件。

有用

如果我在SSRS和SQL Server实例之间应用两个防火墙规则,我的configuration工作。

 168.xxx.xxx.71 --> 162.xxx.xxx.51 : 1433 168.xxx.xxx.70 --> 162.xxx.xxx.51 : 1433 

我想安全地减less一个防火墙规则,并确保一切仍然有效。 (看下面的截图)
编辑:到目前为止我阅读的文章是暗示我只需要第二条规则,但没有保证。

我已经咨询的文章

  1. SQL Server安装的安全注意事项
    基地文章。

  2. configurationWindows防火墙以允许SQL Server访问
    本文指向有关SQL Server的防火墙configuration的所有其他文章。

  3. 为数据库引擎访问configurationWindows防火墙
    没有使用IP地址的字。

  4. 为报告服务器访问configuration防火墙
    这篇文章是非常有趣的,因为它指出:

    如果您正在外部计算机上访问SQL Server关系数据库,或者如果报表服务器数据库位于外部SQL Server实例上,则必须在外部计算机上打开端口1433和1434。

    …但仍然没有关于IPconfiguration/设置/默认值。

  5. 多宿主Windows计算机上的源IP地址select

  6. Windows Server 2008和Windows Vista中的源IP地址selectfunction与早期版本的Windows中的相应function不同

詹姆斯 (dba.se)向我提供了第5和第6条。 他们目前似乎是最合适的答案。 然而,我有点怀疑,有一篇文章提到使用多个NIC,而我只有一个网卡分配了多个IP。 汤姆 (dba.se)也提供了build议和一般性意见。

为什么在这里,而不是在dba.stackexchange.com

由于问题的复杂性,我一开始并不情愿在serverfault.com上发布这个问题。 这个问题既有SQL Server特有的倾向,也有Windows Server特有的倾向。 最终我决定把它发布在这里,因为我认为这是一个Windows服务器IP处理thingy(损失更好的单词)。

如果主持人认为我会在dba.stackexchange.com上得到更好的回应,那么请把问题转移到那里。

长期的解释

在我们的环境中,我们有托pipe多个SQL Server实例和多个IP设置的Windows服务器。 我们添加了复杂的防火墙configuration,专用的SQL Server Reporting Services(SSRS)服务器,并提出了一个如下所示的环境:

环境概述

基本上我们可以有一个Windows Server在单个IP地址上运行多达15个(15个)SQL Server实例。 这对于专门的Reporting Services实例也是一样的。

防火墙规则

不同的IP范围当前没有configuration为区域,这意味着我们必须将每个防火墙规则独立configuration为IP到IP或IPrange到IP的规则。 当涉及两台服务器时,安全性要求它始终是一个IP到IP的规则。 每个SQL Server实例都有自己的通信涉及的防火墙的规则,这是一个服务器到服务器或客户端到服务器的链接。 申请防火墙规则目前需要四到六周的等待时间。 减less防火墙规则的数量将减lessnetworking安全团队的压力。

SQL Server实例IPconfiguration

通过修改SQL Serverconfigurationpipe理器实用程序中的某些设置来configurationSQL Server实例以仅在专用IP和端口上启动。 第一步是启动SQL Serverconfigurationpipe理器,在左侧selectSQL Servernetworkingconfiguration| InstanceName的协议 。 在左侧窗格中,左键单击TCP / IP协议名称并启用协议。 然后再次左键单击协议并调出TCP / IP属性窗口。

然后确保在协议寄存器中设置了以下设置:

 Enabled : Yes Listen All : No 

IP地址注册中,检查以下有关IP地址的设置(例如,对于本示例中的Reporting Services服务器,将为168.xxx.xxx.71)

 Active : Yes Enabled : Yes IP Address : 168.xxx.xxx.71 TCP Dynamic Ports : TCP Port : 1433 

注意:重要的是TCPdynamic端口的设置是空的而不是0(零)。

现在你有一个SQL Server实例,它只能使用端口1433从168.xxx.xxx.71获取数据库连接。

SQL Server实例摘要

SQL Server Browser服务未运行,并且每个单独的SQL Server实例都configuration为仅在端口1433上使用自己的IP地址。给定一个名为GENERAL的SQL Server实例,一个主机名为SQLSERVER01的Windows服务器和两个IP地址162.xxx .xxx.50(主机)和162.xxx.xxx.51(SQL实例)我将得到以下configuration项目:

 Windows Server : SQLSERVER01 Windows Server IP : 162.xxx.xxx.50 SQL Server Instance : SQLSERVER01-i01 (DNS A record) SQL Server Instance : GENERAL (can only be used on the host itself) SQL Server IP/Port : 162.xxx.xxx.51:1433 

SQL Server将不会选取162.xxx.xxx.50:1433的请求,因为没有将SQL Server实例configuration为在SQL Serverconfigurationpipe理器实用程序中侦听此IP地址。 SQL Server将仅接收对SQLSERVER01-i01(端口1433)或162.xxx.xxx.51,1433的请求。

SQL Server报告服务实例摘要

SQL Server Browser服务未运行,并且每个单独的SQL Server Reporting Services实例都configuration为仅在端口1433上使用自己的IP地址。给定一个名为GENERAL的SQL Server Reporting Services实例,一个主机名为SQLSERVERRS01的Windows服务器,一个应用程序在名为APPL1的SSRS和两个IP地址168.xxx.xxx.70(主机)和168.xxx.xxx.71(SQL实例)上,我将得到以下configuration项:

 Windows Server : SQLSERVERRS01 Windows Server IP : 168.xxx.xxx.70 SQL Server Instance : SQLSERVERRS01-i01 (DNS A record) SQL Server Instance : GENERAL (can only be used on the host itself) SQL Server IP/Port : 168.xxx.xxx.71:1433 Reporting Services : http://sqlserverrs01-i01/Reports_APPL1 http://sqlserverrs01/Reports_APPL1 

SQL Server将不会选取168.xxx.xxx.70:1433的请求,因为没有将SQL Server实例configuration为在SQL Serverconfigurationpipe理器实用程序中侦听此IP地址。 SQL Server将只接收SQLSERVER01-i01(端口1433)或162.xxx.xxx.71,1433的请求。

由于主机头的Reporting Servicesconfiguration中的*:80configuration,SSRS将接收对http:// sqlserverrs01-i01 / Reports_APPL1或http:// sqlserverrs01 / Reports_APPL1的请求 。

我希望我已经提供了足够的信息给愿意花时间写回答​​的人,我期待着你的技术细节和链接。

用StackEdit编写 ,后来手动修改为stackexchange兼容。

历史

编辑1 :初始版本
编辑2 :重新格式化以提高可读性。 向下移动了解释SF / DB。 添加了Windows Server的主机名
编辑3 :修复了防火墙规则列表中错误的IP地址。
编辑4 :在一些地方更改了托pipe的字词(这是一个非虚拟化的环境)。 一次添加IP地址
编辑5 :添加了我已经咨询和引用支持的文章列表
编辑6 :清理历史部分

介绍

根据我在最初的研究过程中发现的各种文档以及链接和讨论中提供的文档,我已经提出了一个稳定可靠的兼容解决scheme。

RFC 3484

进一步进行二进制比较,应用规则是根据RFC 3484 ,这显然也适用于IPv4地址。

RFC 3484也就是在规则8之后

 Rule 8 may be superseded if the implementation has other means of choosing among source addresses. For example, if the implementation somehow knows which source address will result in the "best" communications performance. 

多宿主Windows计算机上的源IP地址select

现在并不是RFC 3484中的所有规则都适用于IPv4地址。 Microsoft博客文章多宿主Windows计算机上的源IP地址select说明了适用的规则。

Windows Vista / Windows Server 2008行为下面有一小部分内容如下:

与XP类似,如果程序没有指定源IP,则堆栈引用目标IP地址,然后检查整个IP路由表,以便可以select发送数据包的最佳networking适配器。 在selectnetworking适配器之后,堆栈将使用RFC 3484中定义的地址select过程,并使用该IP地址作为出站数据包的源IP地址。

由于我在SQL / SSRS实例中只有一个NIC,所以第一部分是没有意义的。 Windows Server将始终select唯一可用的NIC。

到目前为止,将RFC 3484与Microsoft Blog结合在一起,使得两个IP地址成为源IP地址的有效候选者。 解释在答案中进一步下面。

有线人

来自networking专家的文章networking专家强大而弱势的主机模型详细介绍了IPselect如何在强大的主机发送和接收环境以及弱主机发送和接收环境中工作。 一个很好的额外阅读,但没有更多的关于如何select源IP。 这篇文章涉及已知的RFC 3484。

解释无法解释的

为了解释我们首先必须将IP地址转换为二进制等价的解决scheme。 由于我没有提供关于我的问题的网关,我将假定两个值。

源IP地址和二进制符号

以下是涉及的IP地址的转换后的二进制值列表。

 10101000.00000001.00000001.01000110 168.xxx.xxx.070/128 Windows Server 10101000.00000001.00000001.01000111 168.xxx.xxx.071/128 SQL Server / SSRS Instance 10101000.00000001.00000001.00000010 168.xxx.xxx.002/128 Gateway (Assumption 1) 10101000.00000001.00000001.01100010 168.xxx.xxx.100/128 Gateway (Assumption 2) 11111111.11111111.11111111.10000000 255.255.255.128/025 Subnet Mask / CIDR 

目标IP地址和二进制符号

 10101000.00000000.00000000.00110011 168.xxx.xxx.051/128 SQL Server 

示例1:网关IP低于SQL / SSRS实例IP

在这个例子中,我将假设网关的IP地址低于SQL Server / SSRS实例的IP地址,即168.001.001.002。

如果您比较Windows Server和SQL Server / SSRS实例的二进制地址,则具有以下内容:

 SQL/SSRS Instance IP 10101000.00000001.00000001.00000010 (Gateway Assumption 1) 10101000.00000001.00000001.01000111 (SQL/SSRS) ----------------------------------- xxxxxxxx.xxxxxxxx.xxxxxxxx.x------- (x=matching high order bits) Window Server IP 10101000.00000001.00000001.00000010 (Gateway Assumption 1) 10101000.00000001.00000001.01000110 (Windows) ----------------------------------- xxxxxxxx.xxxxxxxx.xxxxxxxx.x------- (x=matching high order bits) 

结果示例1

在这个例子中,两个IP地址具有相同数量的匹配高位(或最长匹配前缀)。 直到现在,http.sys进程将使用任何一个IP地址进行传出通信。

示例2:网关IP高于SQL / SSRS实例IP

在这个例子中,我将假设网关的IP地址高于SQL Server / SSRS实例的IP地址,即168.001.001.100。

如果您比较Windows Server和SQL Server / SSRS实例的二进制地址,则具有以下内容:

 SQL/SSRS Instance IP 10101000.00000001.00000001.00000010 (Gateway Assumption 2) 10101000.00000001.00000001.01100010 (SQL/SSRS) ----------------------------------- xxxxxxxx.xxxxxxxx.xxxxxxxx.x------- (x=matching high order bits) Windows Server IP 10101000.00000001.00000001.00000010 (Gateway Assumption 2) 10101000.00000001.00000001.01100010 (Windows) ----------------------------------- xxxxxxxx.xxxxxxxx.xxxxxxxx.x------- (x=matching high order bits) 

结果示例2

即使网关的IP地址现在高于Windows服务器的IP地址和SQL / SSRS实例,匹配高位(或最长匹配前缀)的数量仍然相同。 直到现在,http.sys进程将使用任何一个IP地址进行传出通信。

迄今为止的发现总结

到目前为止,无法确定http.sys进程将用于在Windows服务器(.70)上的SQL / SSRS实例(.71)上运行的传出通信的IP地址。

“当你消除了不可能的东西时,不pipe什么东西,不pipe怎么说,都是真相。” – 福尔摩斯

有些情况下,源IP地址可以通过前面提到的RFC和Microsoft的知识来定位/select/定义。 但是,如果IP地址彼此靠得太近,并且靠近网关,那么这只是运气而已。 还是呢?

看到我处于制定(防火墙)规则的位置,微软有一个…

实现()在源地址之间有其他的select方式。 例如,如果实现以某种方式知道哪个源地址将导致“最佳”通信性能。

…然后,我所要做的就是确定http.sys进程的IP地址是仅创build一个具有所需IP地址的防火墙规则。

怎么了

  1. 我定义了一个从168.xxx.xxx.71到168.xxx.xxx.51:1433的防火墙规则
  2. SQL / SSRS实例的http.sys组件符合RFC 3484,并根据定义的规则select源IP
  3. IP地址168.xxx.xxx.71(位于NIC1上)被确定为通过端口1433到达IP地址168.xxx.xxx.51的源IP地址,因此被分配给所有传出数据包

优点

  1. 我绝不干涉RFC 3484的实施
  2. 我没有办法与路由或ARPconfiguration杂耍
  3. 我符合RFC 3484和Microsoft的实施
  4. 我不是黑客任何registry设置或系统configuration
  5. 我有一个防火墙规则

validation

我还没有从防火墙规则中删除IP地址,但我相信它将按devise/定义的方式工作。 总结如下。

历史

编辑1个初始文章
编辑2清理答案,添加历史部分

SSRS支持多种标准数据源以及其他.NET数据源:

https://msdn.microsoft.com/en-ca/library/ms159219.aspx

假设您正在使用SQL本机客户端作为数据源,则无法指定源IP地址:

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring(v=vs.110).aspx

因此,build立networking连接时,客户端将在Bind()方法期间使用IPADDR_ANY。 这让Windows做出决定。

Windows 2008和更高版本的地址select是基于与下一跳相匹配的位数最多的,这意味着答案取决于您的默认网关(或者您可能定义的任何特定路由)。

https://blogs.technet.microsoft.com/networking/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer/

我没有在你的图表中看到任何路线或网关的提及,只要我能得到。

祝你好运!