谈到 RPC Dynamic Port Range Restriction (动态RPC 端口范围限制)的中文类文章很少很少,希望籍此文浅谈一下AD Dynamic Port Range 在 Server 2008 / Server 2008 R2上是如何做限制的,当大家有需要的时候,可以做一个参考。选 AD 来举例,是因为AD是生产环境中 IT 其中最重要的一环了,假如能对AD的Domain Controller做端口范围限制,其他服务器做类似改变就更有信心了。

为什么Dymanic Port Range 要提及呢?因为这个默认动态端口范围在 Server 2008/2008 R2改变了!一般的企业可能对此还没有很多的留意,因为很可能内网是没有防火墙的, 但对于对数据敏感的机构,例如某些银行或金融机构,他们可能在内网竖起了重重的防火墙,这就不得不提到防火墙在Server 2008/Server 2008 R2情况下防火墙要开什么新端口的问题,而Server 2008之后使用的端口哦和以前Server 2003的环境有差异,不能照搬。

 


什么是RPC

 

“RPC 是一种进程间通信 (IPC) 方法,客户端和服务器可使用这种方法来进行相互之间的通信。简单地说,RPC 可被程序(通常是客户端计算机上的程序)用来执行服务器计算机上的程序。例如,Microsoft Outlook 客户端可通过使用 RPC 与 Microsoft Exchange Server 通信。客户端计算机会使用某些参数将消息发送到服务器计算机。而服务器则会以一条包含执行程序的结果的消息响应客户端。

此过程的组成部分是终结点,即计算机上的名称、端口或端口组,由服务器监视经过其传入的客户端请求。更具体地讲,它是用于 RPC 的服务器进程特定于网络的地址。

终结点映射程序 (Endpoint Mapper) 是 RPC 子系统的一个组成部分,负责响应客户端要解析动态终结点的请求。在某些情况下,终结点映射程序还负责动态地将终结点分配给服务器。

另一个重要的 RPC 组件就是 Locator 服务。它维护网络上的 RPC 服务和服务器列表。Windows 客户端会连接到服务器消息块 (SMB) 端口(TCP 139 和 445)上的域控制器,并通过 Locator 服务搜索 RPC 服务或服务器。

大多数内置的 Windows 服务都通过 RPC 相互通信。例如,证书服务、DCOM、FRS、MSMQ、MAPI 和 Active Directory 复制服务都使用 RPC 来进行通信。因此,如果 RPC 服务不能网络上正常运行,则您可能就会遇到很多通信问题。

在RPC通讯中,Endpoint Mapper 是一个用来存储RPC服务信息的数据库。RPC服务侦听TCP135端口来获知哪个客户端尝试调用相关的RPC请求。当得到相关的客户请求,RPC服务则动态分配一个端口供客户端的服务器通讯使用。”

这些概念和原理看上去深奥难懂,有兴趣可以去看看是RPC的工作原理 “How RPC Works”(只有英文网页)
http://technet.microsoft.com/zh-cn/library/cc738291(v=ws.10).aspx
 

我在这里只想通俗地说一下动态RPC端口运作的过程。

动态RPC端口是如何运作的呢?举一个例子,一台应用程序服务器( App Server ) 与域控制器( DC ) 之间的通信,App Server先连接DC 的RPC Endpoint Mapper (RPC Locator Services, 使用TCP端口135),接着 RPC Endpoint Mapper再通知App Server应该要连接的端口(它是动态的,使用的端口可能是1024-5000,可能是49152-65535,也可能是其他预先预定的范围),App Server得知端口后, 再连接DC上的这个动态端口。

 

 


RPC 动态端口在2003到2008/2008R2的转变

在由基于 Windows Server(R) 2003 的域控制器、基于 Microsoft(R) Windows(R) 2000 Server 的域控制器或以前版本的客户端计算机组成的混合模式的域中,默认动态端口范围为 1025 到 5000。Windows Server 2008 和 Windows Vista(R) 根据 Internet 号码分配机构 (IANA) 建议增加了传出连接的动态客户端端口范围。新的默认开始端口为 49152,新的默认结束端口为 65535。因此,必须在防火墙中增加远程过程调用 (RPC) 端口范围。如果您拥有包含一个 Windows Server 2008 服务器的混合域环境,则允许从端口 1025 到 5000 的通信以及从 49152 到 65535 的通信。

端口 1025 到 5000,这是 Windows Server 2003 和以前版本的客户端操作系统的默认端口范围,对于 Windows Server 2008 和 Windows Vista,则为端口 49152 到 65535。

明显,在Server 2008之后,假如Dynamic Port 按默认全开,49152-65535要放16000多个端口,比以前03时代多了很多。有些客户就想在内网也限制防火墙端口以变得更安全。

其实,微软并不建议做端口范围的限制,假如真的需要,仍然建议开放所有的动态端口,封装在IPSEC或者*** tunnel中。

“Generally speaking, we don't recommend that you restrict traffic between servers on your internal network. If you must deploy firewalls between servers, you should use IPSEC or *** tunnels to allow all traffic between those servers to pass through, regardless of source or destination ports. “
参考
http://blogs.technet.com/b/askds/archive/2007/08/24/dynamic-client-ports-in-windows-server-2008-and-windows-vista-or-how-i-learned-to-stop-worrying-and-love-the-iana.aspx
 

 

 

 


操作方法比较


 


然而,客户真的要求要做AD Port Dynamic Port Restriction呢?微软提供了3个KB说类似这个。

方法一: 修改注册表,将AD复制锁定到某个特定的端口。假如不做限制,默认AD会使用到动态端口去做AD复制,例如AD站点间的复制。这种方法只适用于AD复制。

 

Registry key 1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters
Registry value: TCP/IP Port
Value type: REG_DWORD
Value data: (available port)
Registry key 2
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters
Registry value: DCTcpipPort
Value type: REG_DWORD
Value data: (available port)
参考
http://support.microsoft.com/kb/224196
 

方法二:修改注册表,将动态RPC端口限制在指定范围内。可以对DHCP, WINS等可能使用到动态端口范围做锁定。

在以下路径下添加一个名为Internet的项,并添加如下三个数值

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc

数值名称

数据类型

数值

Ports

REG_MULTI_SZ(多字符串值)

自定义,例如5000~5020

PortsInternetAvailable

REG_SZ(字符串值)

Y

UseInternetPorts

REG_SZ(字符串值)

Y

参考
http://support.microsoft.com/kb/154596

方法三:命令行输入

这种方法适用于Server 2008以及Server 2008 R2,以改变动态端口范围。对于旧的Server 2003不适用。 端口范围最少为255个。

例如需要设置1000个端口,在防火墙上放端口50000-51000,那可以输入

  • netsh int ipv4 set dynamicport tcp start=50000 num=1000
  • netsh int ipv4 set dynamicport udp start=50000 num=1000
  • netsh int ipv6 set dynamicport tcp start=50000 num=1000
  • netsh int ipv4 set dynamicport udp start=50000 num=1000

参考
http://support.microsoft.com/kb/929851

方法一当域功能级别不是Server 2008或以上版本,在复制SYSVOL文件夹时,会使用FRS(File Replication Service)。FRS可以用这样做限制,但当域功能级别提升到Server 2008的时候,会使用DFS代替FRS进行AD复制,而DFS也是采用动态RPC端口,我们需要使用另外的DFSRDIAG.EXE程序来将其设置到一个静态端口,这样可能会增加我们操作的复杂度。而且方法一只能用于AD的复制,假如这台DC上运行了其他服务,那动态端口需要用其他方法做限制。方法二在没有方法三的时候,在Server 2003时代用得比较多,现在有Server 2008之后有了命令行的方法,显得更为方便。

 

 

 


详细操作

 

以下是方法三的详细操作.
 

1. netsh int ipv4 show dynamicport 命令可以列出Dynamic port range。


打开命令行,Run as administrator

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp

image_thumb
 

2. 例如要将动态端口范围限制到50000到53000,输入

netsh int ipv4 set dynamicport tcp start=50000 num=3000
netsh int ipv4 set dynamicport udp start=50000 num=3000
netsh int ipv6 set dynamicport tcp start=50000 num=3000
netsh int ipv6 set dynamicport udp start=50000 num=3000


3. 确认一下更改是否成功

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp

image_thumb2

4. 重启并查看Event Log看下有无异常。当所有服务器都锁定了端口范围后,防火墙就可以做相应的设置了,将端口限制到50000-53000。

 

回滚计划 (Roll back plan)
在生产环境,做任何的操作都需要备份和回滚计划,特别是AD的操作,因为是用输入命令的方法,所以输入相应命令并重启,就返回到原来的默认端口范围49152-65535了。

netsh int ipv4 set dynamicport tcp start=49152 num=16384
netsh int ipv4 set dynamicport udp start=49152 num=16384
netsh int ipv6 set dynamicport tcp start=49152 num=16384
netsh int ipv6 set dynamicport udp start=49152 num=16384

image_thumb3

 

一口气写完了,以上是浅谈一下Dymanic Port Range 动态端口范围做锁定限制的方法,因行文稍显仓促,如有错漏,请多多指正。给点鼓励吧,假如有大家的支持和回复,下一节将说下做端口限制可能需要注意的一些技术和非技术性细节问题。