Балансировка сетевой нагрузки Windows дублирует пакеты UDP?

Фон

У меня есть две виртуальные машины Windows Server 2012R2 (каждая с одной сетевой платой), прослушивающие порт 514 для сообщений Syslog UDP, которые обрабатывают и затем сохраняют сообщения в базе данных. Я попытался настроить балансировку сетевой нагрузки, чтобы распределить трафик системного журнала между ними.

Когда я проверил конфигурацию, отправив один пакет UDP из PowerShell на кластерный IP-адрес, я заметил, что получу две записи системного журнала в базе данных. Сначала я думал, что каждый хост получил и обработал пакет отдельно, поэтому я добавил тег к обоим, чтобы они также сохранили свой выделенный 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)

Host 1 Properties

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

Host 2 Properties

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 для отправки сообщения системного журнала на определенный 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 на другом хосте не показывает трафик.

В сумме я получу 2 пакета на одном хосте через один IP на каждый отправленный 1 пакет

1 ответ

Решение

У гипервизора были неправильно распределенные сетевые карты, которые вызывали дублирование всех широковещательных пакетов. Отключение одного из сетевых адаптеров гипервизора решило проблему.

Другие вопросы по тегам