Windows 網路負載平衡重複 UDP 包?
背景
我有兩個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 之一解決了該問題。