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

Joh*_* N. 9 firewall ssrs ip sql-server windows-server-2012-r2

Tl;博士

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

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

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

由于*:80主机标头的 Reporting Services 配置中的配置,SSRS 将接收这两个请求。

我们在每个 IP 范围之间有多个防火墙,这意味着我们必须为每个 IP 到 IP 或 IP 范围到 IP 的连接应用特定的规则。但是,当涉及两台服务器时,安全性规定它始终必须是防火墙中的 IP 到 IP 规则。

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

当 Reporting Services 服务器连接到 SQL Server 实例(在 162.xxx.xxx.51 上)以检索数据时,它是否会始终与 Windows 服务器的底层 IP 地址(168.xxx.xxx.70/首选)建立连接? ) SSRS 正在运行,还是会(有时)使用 SQL Server Reporting Services 实例 (168.xxx.xxx.71) 的 IP 地址?

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

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

奖金问题

我可以将 Reporting Services 服务器配置为与专用 IP 地址进行通信吗?在本例中为 168.xxx.xxx.71 地址。

我不是在寻找答案

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

有用

如果我在 SSRS 和 SQL Server 实例之间应用这两个防火墙规则,我的配置就可以工作。

168.xxx.xxx.71 --> 162.xxx.xxx.51 : 1433
168.xxx.xxx.70 --> 162.xxx.xxx.51 : 1433
Run Code Online (Sandbox Code Playgroud)

我想安全地减少一个防火墙规则并确保一切仍然有效。(请参阅进一步的屏幕截图)
编辑:到目前为止,我阅读的文章建议我只需要第二条规则,但不能保证。

我已经咨询过的文章

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

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

  3. 为数据库引擎访问配置 Windows 防火墙
    使用任何 IP 地址。

  4. 为报表服务器访问配置防火墙
    本文非常有趣,因为它指出:

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

    ...但仍然没有提及 IP 配置/设置/默认值。

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

  6. Windows Server 2008 和 Windows Vista 中的源 IP 地址选择功能与早期版本的 Windows 中的相应功能不同

第 5 条和第 6 条由James (dba.se) 友情提供给我。它们目前似乎是最合适的答案。然而,我有点怀疑一篇文章提到使用多个网卡,而我只有一个网卡,并为其分配了多个 IP。Tom (dba.se) 也提出了建议和一般性评论。

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

由于问题的复杂性,我起初不愿意在 serverfault.com 上发布这个问题。该问题既有特定于 SQL Server 的趋势,也有特定于 Windows Server 的趋势。最终我决定把它贴在这里,因为我认为它是一个 Windows Server IP 处理对象(为了更好的词的丢失)。

如果版主认为我会在 dba.stackexchange.com 上得到更好的回复,那么请将问题移到那里。

冗长的解释

在我们的环境中,我们有托管多个 SQL Server 实例和多个 IP 设置的 Windows 服务器。我们添加了复杂的防火墙配置、专用的 SQL Server Reporting Services (SSRS) 服务器,并提出了一个看起来像这样的环境:

环境概览

基本上,我们可以让一台 Windows Server 在单个 IP 地址上运行多达 15(十五)个 SQL Server 实例。这同样适用于专用的 Reporting Services 实例。

防火墙规则

不同的 IP 范围当前未配置为区域,这意味着我们必须将每个防火墙规则独立配置为 IP-to-IP 或 IPrange-to-IP 规则。当涉及两台服务器时,安全性规定它始终必须是 IP 到 IP 规则。每个 SQL Server 实例都有自己的一组规则,用于通信中涉及的防火墙,无论是服务器到服务器还是客户端到服务器链接。申请防火墙规则目前需要四到六周的等待期。减少防火墙规则的数量将减少网络安全团队的压力。

SQL Server 实例 IP 配置

通过修改 SQL Server 配置管理器实用程序中的一些设置,将 SQL Server 实例配置为仅在专用 IP 和端口上获取。第一步是启动 SQL Server 配置管理器,然后在左侧部分选择SQL Server 网络配置 | InstanceName 的协议。在左窗格中,左键单击TCP/IP协议名称并启用该协议。然后再次左键单击协议并调出TCP/IP 属性窗口。

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

Enabled           : Yes
Listen All        : No
Run Code Online (Sandbox Code Playgroud)

IP 地址寄存器中,检查有问题的 IP 地址的以下设置(例如,对于本示例中的 Reporting Services 服务器,它将是 168.xxx.xxx.71)

Active            : Yes
Enabled           : Yes
IP Address        : 168.xxx.xxx.71
TCP Dynamic Ports : 
TCP Port          : 1433
Run Code Online (Sandbox Code Playgroud)

注意:重要的是 TCP 动态端口的设置是空的,而不仅仅是 0(零)。

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

SQL Server 实例摘要

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

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
Run Code Online (Sandbox Code Playgroud)

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

SQL Server Reporting Services 实例摘要

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

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
Run Code Online (Sandbox Code Playgroud)

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

由于主机标头的 Reporting Services 配置中的 *:80configuration,SSRS 将获取对 http://sqlserverrs01-i01/Reports_APPL1http://sqlserverrs01/Reports_APPL1 的请求

我希望我已经为任何愿意花时间写答案的人提供了足够的信息,我期待着您的技术细节和链接。

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

历史

编辑 1:初始版本
编辑 2:重新格式化以提高可读性。将说明 SF / DB 移到下。为 Windows Server
Edit 3添加了主机名:修复了防火墙规则列表中错误的 IP 地址。
编辑 4:在某些地方将托管一词更改为运行(这是一个非虚拟化环境)。在一句话中添加了 IP 地址
编辑 5:添加了我已经查阅和引用的文章列表支持
编辑 6:清理历史部分

Joh*_* N. 6

介绍

根据我在初步研究中找到的各种文件以及链接和讨论中提供的文件,我提出了一个可靠、可靠、合规的解决方案。

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.
Run Code Online (Sandbox Code Playgroud)

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

现在并非 RFC 3484 中的所有规则都适用于 IPv4 地址。Microsoft 博客文章多宿主 Windows 计算机上的源 IP 地址选择解释了哪些规则适用。

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

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

鉴于我在 SQL/SSRS 实例中只有一个 NIC,第一部分没有实际意义。Windows Server 将始终选择唯一可用的 NIC。

到目前为止,将 RFC 3484 与 Microsoft 博客相结合,结果两个 IP 地址都是源 IP 地址的有效候选者。解释在答案中进一步说明。

接线员

来自接线员的文章接线员强和弱主机模型详细介绍了 IP 选择如何在强主机发送和接收环境以及弱主机发送和接收环境中工作。一个很好的补充读物,但没有更多地说明如何选择源 IP。该文章涉及已知的 RFC 3484。

解释无法解释的

为了解释解决方案,我们首先必须将有问题的 IP 地址转换为它们的二进制等价物。鉴于我没有在我的问题中提供网关,我将假设两个值。

源 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
Run Code Online (Sandbox Code Playgroud)

目标 IP 地址和二进制表示法

10101000.00000000.00000000.00110011   168.xxx.xxx.051/128   SQL Server
Run Code Online (Sandbox Code Playgroud)

示例 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)
Run Code Online (Sandbox Code Playgroud)

结果示例 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)
Run Code Online (Sandbox Code Playgroud)

结果示例 2

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

迄今为止的调查结果摘要

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

“当你排除了不可能的事情,剩下的,无论多么不可能,都一定是真相”——夏洛克·福尔摩斯

在某些情况下,源 IP 地址肯定可以通过上述 RFC 和 Microsoft 知识来精确定位/选择/定义。但是,如果 IP 地址彼此太靠近并且靠近网关,那么这完全取决于运气。或者是吗?

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

实现(那个)有其他方式在源地址中进行选择。例如,如果实现以某种方式知道哪个源地址将导致“最佳”通信性能。

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

发生什么了

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

好处

  1. 我绝不干涉 RFC 3484 的实施
  2. 我绝不会处理路由或 ARP 配置
  3. 我遵守 RFC 3484 和 Microsoft 的实施
  4. 我没有破解任何注册表设置或系统配置
  5. 我少了一个防火墙规则

确认

我还没有从防火墙规则中删除 IP 地址,但我相信它会按设计/定义的那样工作。接下来会有总结。

历史

编辑 1初始帖子
编辑 2清理答案,添加历史部分


Jen*_*ich 5

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

因此,按理说,客户端在建立网络连接时将在 Bind() 方法期间使用 IPADDR_ANY。这让 Windows 做出决定。

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

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

我在您的图表中没有看到任何提及路线或网关的内容,因此这是我所能得到的。

祝你好运!