Windows-Server-2012-R2

Windows 網路負載平衡重複 UDP 包?

  • July 3, 2018

背景

我有兩個Windows Server 2012R2虛擬機(每個都有一個 NIC)在埠 514 上偵聽 Syslog UDP 消息,它們處理然後將消息保存到數據庫中。我嘗試設置網路負載平衡以在兩者之間分配 Syslog 流量。

當我通過從 PowerShell 向集群IP發送一個UDP 數據包來測試配置時,我注意到我會在數據庫中獲得兩個syslog 條目。起初,我以為每個主機都分別接收和處理了數據包,所以我給它們都添加了一個標籤,這樣它們也可以保留它們的專用 IP 地址。從那我知道我實際上是從同一個主機收到兩個數據包。

使用 Wireshark,我可以確認介面接收到了兩個數據包,它們都來自同一個 IP。但是如果我將UDP數據包發送到專用IP,我只會收到一個數據包。NLB 在介面上複製包是正常行為嗎?對於負載平衡,這似乎適得其反,因為集群必須為每發送一個數據包處理兩個數據包。如何配置 NLB 不給接收主機兩個相同的數據包?

我的 NLB 配置

集群屬性:

Cluster IP Address: 192.168.1.100  
Subnet Mask: 255.255.255.0  
Full Internet name: mysyslogcluster.local  
Network Address: 03-bf-c0-a8-01-64  
Cluster Operation Mode: Multicast  
Port Rules: 0-513 (disabled), 514 (udp), 515-65535 (disabled)

主機 1 屬性

IP Address: 192.168.1.1
Subnet Mask: 255.255.255.0
Load Weight: Equal

主機 2 屬性

IP Address: 192.168.1.2
Subnet Mask: 255.255.255.0
Load Weight: Equal

埠 514 規則

Protocols: UDP
Filtering mode: Multiple host
Affinity: None

測試

我在兩台主機上都安裝了 Wireshark,並帶有過濾器:udp port 514

我編寫了一個 PowerShell 函式來將 Syslog 消息發送到某個 IP 和埠

function Get-UdpClient($IP, $Port){
   $UDPClient = New-Object System.Net.Sockets.UdpClient
   $UDPClient.Connect($IP, $Port)
   return $UDPClient
}
function Send-Syslog($UDPClient, $facility = 5, $severity = 7, $program = "PSSyslogGen", $hostname = $env:COMPUTERNAME, $category = "TEST", $message){        
   $priority = ($facility * 8) + $severity    
   $datetime = Get-Date -Format "MMM dd HH:mm:ss"    
   $FSyslogMessageStr = "<{0}>{1} {2} {3} {4}: {5}" -f $priority, $datetime, $hostname, $program, $category, $message    
   $SyslogMessageBytes = [System.Text.Encoding]::ASCII.GetBytes($FSyslogMessageStr)    
   $resp = $UDPClient.Send($SyslogMessageBytes, $SyslogMessageBytes.Length)    
}

如果我在單獨的主機上執行 Powershell 中的命令:

PS C:>$client = Get-UDPClient -IP "192.168.1.100" -Port 514
PS C:>Send-Syslog -UDPClient $client -message "Test NLB"

我將在 Wireshark 中看到:

No. Time    Source  Destination Protocol    Length  Info
1   0.000000    192.168.1.200   192.168.1.100   Syslog  115 SYSLOG.DEBUG: Jun 29 12:00:00 PSSyslogGen HOST-NAME TEST: Test NLB
2   0.000077    192.168.1.200   192.168.1.100   Syslog  115 SYSLOG.DEBUG: Jun 29 12:00:00 PSSyslogGen HOST-NAME TEST: Test NLB

然後如果我再次執行它,但這次是專用 IP

PS C:>$client = Get-UDPClient -IP "192.168.1.1" -Port 514
PS C:>Send-Syslog -UDPClient $client -message "Test NLB"

我只會在 Wireshark 中得到一個數據包

3   10.384867   192.168.1.200   192.168.1.1 Syslog  115 SYSLOG.DEBUG: Jun 29 12:00:10 PSSyslogGen HOST-NAME TEST: Test NLB

編輯 1

我可以確認 TCP 數據包表現出相同的行為。我還嘗試使用單播集群操作模式配置 NLB,並遇到了同樣的問題。

另一台主機上的 Wireshark 顯示沒有流量。

總之,每發送1 個數據包,我將通過單個IP在單個主機上獲得2 個數據包

Hypervisor 的 NIC 負載平衡不當,導致所有廣播數據包重複。禁用 Hypervisor 的 NIC 之一解決了該問題。

引用自:https://serverfault.com/questions/918877