淺談如何鎖定AD動態RPC埠範圍
序
談到 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或者VPN 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 VPN 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_MACHINESYSTEMCurrentControlSetServicesNTDSParameters
Registry value: TCP/IP Port
Value type: REG_DWORD
Value data: (available port)
Registry key 2
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetlogonParameters
Registry value: DCTcpipPort
Value type: REG_DWORD
Value data: (available port)
參考
http://support.microsoft.com/kb/224196
方法二:修改登錄檔,將動態RPC埠限制在指定範圍內。可以對DHCP, WINS等可能使用到動態埠範圍做鎖定。
在以下路徑下新增一個名為Internet的項,並新增如下三個數值
HKEY_LOCAL_MACHINESOFTWAREMicrosoftRpc
數值名稱 |
資料型別 |
數值 |
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
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
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
一口氣寫完了,以上是淺談一下Dymanic Port Range 動態埠範圍做鎖定限制的方法,因行文稍顯倉促,如有錯漏,請多多指正。給點鼓勵吧,假如有大家的支援和回覆,下一節將說下做埠限制可能需要注意的一些技術和非技術性細節問題。
本文轉自 VirtualTom 51CTO部落格,原文連結:http://blog.51cto.com/virtualtom/831963,如需轉載請自行聯絡原作者
相關文章
- 動態範圍控制原理
- 常用埠及埠範圍(學習筆記)筆記
- 淺談前端安全以及如何防範前端
- 淺談動態規劃動態規劃
- 短效動態代理ip的使用範圍有哪些
- javascript如何設定嚴格模式的作用範圍JavaScript模式
- 淺談埠掃描原理
- 淺談動態追蹤技術
- MySQL淺談(索引、鎖)MySql索引
- 淺談死鎖原理
- 【JavaSE】淺談偏向鎖、輕量級鎖和重量級鎖,如何獲取鎖,如何撤銷鎖。Java
- 程式碼規範淺談
- 記錄一下MySql update會鎖定哪些範圍的資料MySql
- 淺談併發加鎖
- 淺談偏向鎖、輕量級鎖、重量級鎖
- Range Addition II 範圍求和 II
- 淺談HadoopHadoop
- 談談如何抓取ajax動態網站網站
- 淺談應用動態體驗設計
- JavaScript 限定範圍拖動效果JavaScript
- Docker 如何動態修改容器埠對映Docker
- [分散式][分散式鎖]淺談分散式鎖分散式
- 淺談Innodb的鎖實現
- 淺談Java中的鎖:Synchronized、重入鎖、讀寫鎖Javasynchronized
- Java RPC 框架 Solon 1.3.7 釋出,增強Cloud介面能力範圍JavaRPC框架Cloud
- 淺談專案程式碼規範
- 淺談軟體測試規範
- 淺談JavaScript的編碼規範JavaScript
- 你用對鎖了嗎?淺談 Java “鎖” 事Java
- 淺扒Android動態設定字型大小Android
- 淺談前端狀態管理前端
- 淺談如何確定伺服器的數量伺服器
- CSS 設定指定範圍li元素樣式CSS
- CoffeeScript攻略4.5:定義陣列範圍陣列
- 淺談專案的規範管理(轉)
- Python | 淺談併發鎖與死鎖問題Python
- 淺談自旋鎖和 JVM 對鎖的最佳化JVM
- MySQL next-key lock 加鎖範圍是什麼?MySql