Validación de la creación de reflejo de puertos
Se aplica a: Advanced Threat Analytics versión 1.9
Nota:
Este artículo solo es relevante si implementa puertas de enlace de ATA en lugar de puertas de enlace ligeras de ATA. Para determinar si necesita usar puertas de enlace de ATA, consulte Elección de las puertas de enlace adecuadas para la implementación.
Los pasos siguientes le guiarán por el proceso para validar que la creación de reflejo del puerto está configurada correctamente. Para que ATA funcione correctamente, la puerta de enlace de ATA debe poder ver el tráfico hacia y desde el controlador de dominio. El origen de datos principal que usa ATA es la inspección profunda de paquetes del tráfico de red hacia y desde los controladores de dominio. Para que ATA vea el tráfico de red, es necesario configurar la creación de reflejo del puerto. La creación de reflejo del puerto copia el tráfico de un puerto (el puerto de origen) a otro puerto (el puerto de destino).
Validación de la creación de reflejo de puertos mediante un script de Windows PowerShell
- Guarde el texto de este script en un archivo denominado ATAdiag.ps1.
- Ejecute este script en la puerta de enlace de ATA que desea validar. El script genera tráfico ICMP desde la puerta de enlace de ATA al controlador de dominio y busca ese tráfico en la NIC de captura en el controlador de dominio. Si la puerta de enlace de ATA ve el tráfico ICMP con una dirección IP de destino igual que la dirección IP de controlador de dominio que especificó en la consola de ATA, considera configurada la creación de reflejo del puerto.
Ejemplo para ejecutar el script:
# 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)
Validación de la creación de reflejo de puertos mediante Net Mon
Instale Microsoft Network Monitor 3.4 en la puerta de enlace de ATA que quiera validar.
Importante
No instale Microsoft Message Analyzer ni ningún otro software de captura de tráfico en la puerta de enlace de ATA.
Abra Monitor de red y cree una nueva pestaña de captura.
Seleccione solo el adaptador de red capture o el adaptador de red que está conectado al puerto de conmutador configurado como destino de creación de reflejo del puerto.
Asegúrese de que el modo P está habilitado.
Haga clic en Nueva captura.
En la ventana Mostrar filtro, escriba el siguiente filtro: KerberosV5 O LDAP y, a continuación, haga clic en Aplicar.
Haga clic en Iniciar para iniciar la sesión de captura. Si no ve tráfico hacia y desde el controlador de dominio, revise la configuración de creación de reflejo del puerto.
Nota:
Es importante asegurarse de que ve el tráfico hacia y desde los controladores de dominio.
Si solo ve el tráfico en una dirección, debe trabajar con los equipos de redes o virtualización para ayudar a solucionar problemas de la configuración de creación de reflejo del puerto.