Udostępnij za pośrednictwem


Weryfikowanie dublowania portów

Dotyczy: Advanced Threat Analytics w wersji 1.9

Uwaga

Ten artykuł jest odpowiedni tylko w przypadku wdrażania bram usługi ATA zamiast uproszczonych bram usługi ATA. Aby określić, czy musisz używać bram usługi ATA, zobacz Wybieranie odpowiednich bram dla wdrożenia.

Poniższe kroki przeprowadzą Cię przez proces sprawdzania, czy dublowanie portów jest prawidłowo skonfigurowane. Aby usługa ATA działała prawidłowo, brama usługi ATA musi mieć możliwość wyświetlenia ruchu do i z kontrolera domeny. Głównym źródłem danych używanym przez usługę ATA jest głęboka inspekcja pakietów ruchu sieciowego do i z kontrolerów domeny. Aby usługa ATA wyświetlała ruch sieciowy, należy skonfigurować dublowanie portów. Dublowanie portów kopiuje ruch z jednego portu (portu źródłowego) do innego portu (portu docelowego).

Weryfikowanie dublowania portów przy użyciu skryptu Windows PowerShell

  1. Zapisz tekst tego skryptu w pliku o nazwie ATAdiag.ps1.
  2. Uruchom ten skrypt w bramie usługi ATA, którą chcesz zweryfikować. Skrypt generuje ruch ICMP z bramy usługi ATA do kontrolera domeny i szuka tego ruchu na karcie sieciowej przechwytywania na kontrolerze domeny. Jeśli brama usługi ATA widzi ruch ICMP z docelowym adresem IP takim samym, jak adres IP kontrolera domeny wprowadzony w konsoli usługi ATA, uzna to za skonfigurowane dublowanie portów.

Przykładowy sposób uruchamiania skryptu:

# 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)

Weryfikowanie dublowania portów przy użyciu usługi Net Mon

  1. Zainstaluj program Microsoft Network Monitor 3.4 w bramie usługi ATA, którą chcesz zweryfikować.

    Ważna

    Nie instaluj programu Microsoft Message Analyzer ani żadnego innego oprogramowania do przechwytywania ruchu w bramie usługi ATA.

  2. Otwórz monitor sieci i utwórz nową kartę przechwytywania.

    1. Wybierz tylko kartę sieciową Przechwytywanie lub kartę sieciową podłączoną do portu przełącznika skonfigurowanego jako miejsce docelowe dublowania portów.

    2. Upewnij się, że tryb P jest włączony.

    3. Kliknij pozycję Nowe przechwytywanie.

      Zrzut ekranu przedstawiający okno dialogowe Microsoft Network Monitor z przyciskiem Nowe przechwytywanie.

  3. W oknie Filtr wyświetlania wprowadź następujący filtr: KerberosV5 LUB LDAP , a następnie kliknij przycisk Zastosuj.

    Zrzut ekranu przedstawiający okno dialogowe Microsoft Network Monitor z wyświetlonym obszarem Filtr wyświetlania.

  4. Kliknij przycisk Rozpocznij , aby rozpocząć sesję przechwytywania. Jeśli nie widzisz ruchu do i z kontrolera domeny, przejrzyj konfigurację dublowania portów.

    Zrzut ekranu przedstawiający okno dialogowe Microsoft Network Monitor z wyświetlonym przyciskiem Start.

    Uwaga

    Ważne jest, aby upewnić się, że widzisz ruch do i z kontrolerów domeny.

  5. Jeśli ruch jest widoczny tylko w jednym kierunku, należy współpracować z zespołami ds. sieci lub wirtualizacji, aby rozwiązać problemy z konfiguracją dublowania portów.

Zobacz też