Поделиться через


Проверка зеркального отображения портов

Область применения: Advanced Threat Analytics версии 1.9

Примечание.

Эта статья относится только к развертыванию шлюзов ATA вместо упрощенных шлюзов ATA. Сведения о том, нужно ли использовать шлюзы ATA, см. в статье Выбор правильных шлюзов для развертывания.

Ниже описан процесс проверки правильности настройки зеркального отображения портов. Для правильной работы ATA шлюз ATA должен иметь возможность видеть трафик на контроллер домена и из нее. Источник данных main, используемый ATA, — это глубокая проверка пакетов сетевого трафика в контроллеры домена и из него. Чтобы ATA отображала сетевой трафик, необходимо настроить зеркальное отображение портов. Зеркальное отображение портов копирует трафик из одного порта (исходный порт) в другой порт (порт назначения).

Проверка зеркального отображения портов с помощью скрипта Windows PowerShell

  1. Сохраните текст этого скрипта в файл с именем ATAdiag.ps1.
  2. Запустите этот скрипт в шлюзе ATA, который требуется проверить. Скрипт создает трафик ICMP из шлюза ATA к контроллеру домена и ищет этот трафик в сетевой карте записи на контроллере домена. Если шлюз ATA видит трафик ICMP с IP-адресом назначения, который совпадает с IP-адресом контроллера домена, указанным в консоли ATA, он считает, что зеркальное отображение портов настроено.

Пример запуска скрипта:

# ATAdiag.ps1 -CaptureIP n.n.n.n -DCIP n.n.n.n -TestCount n
param([parameter(Mandatory=$true)][string]$CaptureIP, [parameter(Mandatory=$true)][string]$DCIP, [int]$PingCount = 10)

# Set variables
$ErrorActionPreference = "stop"
$starttime = get-date
$byteIn = new-object byte[] 4
$byteOut = new-object byte[] 4
$byteData = new-object byte[] 4096  # size of data

$byteIn[0] = 1  # for promiscuous mode
$byteIn[1-3] = 0
$byteOut[0-3] = 0

# Convert network data to host format
function NetworkToHostUInt16 ($value)
{
    [Array]::Reverse($value)
    [BitConverter]::ToUInt16($value,0)
}
function NetworkToHostUInt32 ($value)
{
    [Array]::Reverse($value)
    [BitConverter]::ToUInt32($value,0)
}
function ByteToString ($value)
{
    $AsciiEncoding = new-object system.text.asciiencoding
    $AsciiEncoding.GetString($value)
}

Write-Host "Testing Port Mirroring..." -ForegroundColor Yellow
Write-Host ""
Write-Host "Here is a summary of the connection we will test." -ForegroundColor Yellow

# Initialize a first ping connection
Test-Connection -Count 1 -ComputerName $DCIP -ea SilentlyContinue
Write-Host ""
Write-Host "Press any key to continue..." -ForegroundColor Red
[void][System.Console]::ReadKey($true)
Write-Host ""
Write-Host "Sending ICMP and Capturing data..." -ForegroundColor Yellow

# Open a socket
$socket = new-object system.net.sockets.socket([Net.Sockets.AddressFamily]::InterNetwork,[Net.Sockets.SocketType]::Raw,[Net.Sockets.ProtocolType]::IP)

# Include the IP header
$socket.setsocketoption("IP","HeaderIncluded",$true)
$socket.ReceiveBufferSize = 10000
$ipendpoint = new-object system.net.ipendpoint([net.ipaddress]"$CaptureIP",0)
$socket.bind($ipendpoint)

# Enable promiscuous mode
[void]$socket.iocontrol([net.sockets.iocontrolcode]::ReceiveAll,$byteIn,$byteOut)

# Initialize test variables
$tests = 0
$TestResult = "Noise"
$OneSuccess = 0

while ($tests -le $PingCount)
{
    if (!$socket.Available)  # see if any packets are in the queue
    {
        start-sleep -milliseconds 500
        continue
    }

    # Capture traffic
    $rcv = $socket.receive($byteData,0,$byteData.length,[net.sockets.socketflags]::None)

    # Decode the header so we can read ICMP
    $MemoryStream = new-object System.IO.MemoryStream($byteData,0,$rcv)
    $BinaryReader = new-object System.IO.BinaryReader($MemoryStream)

    # Set IP version & header length
    $VersionAndHeaderLength = $BinaryReader.ReadByte()

    # TOS
    $TypeOfService= $BinaryReader.ReadByte()

    # More values, and the Protocol Number for ICMP traffic
    # Convert network format of big-endian to host format of little-endian
    $TotalLength = NetworkToHostUInt16 $BinaryReader.ReadBytes(2)
    $Identification = NetworkToHostUInt16 $BinaryReader.ReadBytes(2)
    $FlagsAndOffset = NetworkToHostUInt16 $BinaryReader.ReadBytes(2)
    $TTL = $BinaryReader.ReadByte()
    $ProtocolNumber = $BinaryReader.ReadByte()
    $Checksum = [Net.IPAddress]::NetworkToHostOrder($BinaryReader.ReadInt16())

    # The source and destination IP addresses
    $SourceIPAddress = $BinaryReader.ReadUInt32()
    $DestinationIPAddress = $BinaryReader.ReadUInt32()

    # The source and destimation ports
    $sourcePort = [uint16]0
    $destPort = [uint16]0

    # Close the stream reader
    $BinaryReader.Close()
    $memorystream.Close()

    # Cast DCIP into an IPaddress type
    $DCIPP = [ipaddress] $DCIP
    $DestinationIPAddressP = [ipaddress] $DestinationIPAddress

    #Ping the DC at the end after starting the capture
    Test-Connection -Count 1 -ComputerName $DCIP -ea SilentlyContinue | Out-Null

    # This is the match logic - check to see if Destination IP from the Ping sent matches the DCIP entered by in the ATA Console
    # The only way the ATA Gateway should see a destination of the DC is if Port Spanning is configured

    if ($DestinationIPAddressP -eq $DCIPP)  # is the destination IP eq to the DC IP?
    {
        $TestResult = "Port Spanning success!"
        $OneSuccess = 1
    } else {
        $TestResult = "Noise"
    }

    # Put source, destination, test result in Powershell object
    new-object psobject | add-member -pass noteproperty CaptureSource $([system.net.ipaddress]$SourceIPAddress) | add-member -pass noteproperty CaptureDestination $([system.net.ipaddress]$DestinationIPAddress) | Add-Member -pass NoteProperty Result $TestResult | Format-List | Out-Host
    #Count tests
    $tests ++
}

if ($OneSuccess -eq 1)
{
    Write-Host "Port Spanning Success!" -ForegroundColor Green
    Write-Host ""
    Write-Host "At least one packet which was addressed to the DC, was picked up by the Gateway." -ForegroundColor Yellow
    Write-Host "A little noise is OK, but if you don't see a majority of successes, you might want to re-run." -ForegroundColor Yellow
} else {
    Write-Host "No joy, all noise.  You may want to re-run, increase the number of Ping Counts, or check your config." -ForegroundColor Red
}

Write-Host ""
Write-Host "Press any key to continue..." -ForegroundColor Red
[void][System.Console]::ReadKey($true)

Проверка зеркального отображения портов с помощью Net Mon

  1. Установите Microsoft Network Monitor 3.4 на шлюз ATA, который требуется проверить.

    Важно!

    Не устанавливайте анализатор сообщений Майкрософт или любое другое программное обеспечение для сбора трафика на шлюз ATA.

  2. Откройте монитор сети и создайте новую вкладку записи.

    1. Выберите только сетевой адаптер Захвата или сетевой адаптер, подключенный к порту коммутатора, который настроен в качестве назначения зеркального отображения портов.

    2. Убедитесь, что режим P включен.

    3. Щелкните Создать запись.

      Снимок экрана: диалоговое окно

  3. В окне Фильтр отображения введите следующий фильтр: KerberosV5 ИЛИ LDAP и нажмите кнопку Применить.

    Снимок экрана: диалоговое окно

  4. Нажмите кнопку Пуск , чтобы запустить сеанс записи. Если трафик из контроллера домена не отображается, проверьте конфигурацию зеркального отображения портов.

    Снимок экрана: диалоговое окно

    Примечание.

    Важно убедиться, что вы видите трафик к контроллерам домена и из него.

  5. Если трафик отображается только в одном направлении, обратитесь к командам по работе с сетью или виртуализацией, чтобы устранить неполадки с конфигурацией зеркального отображения портов.

См. также