PowerShell을 사용하여 더 빠르게 네트워크 포트 테스트

PowerShell을 사용하여 더 빠르게 네트워크 포트 테스트

Windows 8.1에서 Test-NetConnectioncmdlet은 원격 시스템의 네트워크 포트 상태를 확인하는 데 유용합니다. 그러나 때로는 불필요하게 느려질 수 있습니다. 이 프로세스를 더 빠르게 만들기 위해 조정할 수 있는 몇 가지 옵션이나 사용할 수 있는 대체 PowerShell 명령이 있는지 알고 싶습니다.

Test-NetConnection원격 시스템이 응답하지 않는 경우 결과를 반환하는 데 약 10초가 걸릴 수 있습니다. 포트가 지정될 때마다 시간 초과에 각각 약 5초가 걸리는 두 가지 연결 테스트를 실행합니다. 첫 번째 테스트는 기본적인 ICMP 에코 확인입니다. 시스템이 오프라인이거나 시스템(또는 개입 인프라)이 ICMP 에코 요청을 차단하거나 응답하지 않도록 구성된 경우 시간 초과됩니다. 두 번째 테스트는 지정된 포트에 대한 실제 확인입니다. 시스템이 오프라인이거나 포트를 차단하는 경로에 방화벽이 있는 경우 시간 초과가 발생합니다.

현재 사용 사례에서 원격 시스템은 안정적인 기가비트 이더넷 연결을 통해 단 2홉 거리에 있습니다. 따라서 모든 요청에 ​​대한 5초의 시간 초과는 상당히 과도한 것입니다. 30ms 이하의 시간 초과로도 여전히 신뢰할 수 있는 결과를 얻을 수 있을 것입니다! 또한 시스템이 온라인 상태이고 다른 모든 서비스를 사용할 수 있음에도 불구하고 ICMP 에코에 응답하지 않는 것으로 알려져 있습니다. 따라서 Test-NetConnection이 목적으로 사용하는 스크립트의 속도를 높이기 위해 ICMP 에코 테스트를 완전히 사용하지 않고 TCP 연결 테스트의 시간 초과를 줄일 수 있다면 좋을 것입니다 .

Test-NetConnection이러한 동작을 변경할 수 있는 옵션이 있습니까 ? (자세한 도움말 파일을 읽었으며 대답은 '아니요'인 것 같습니다. 하지만 제가 놓친 내용이 있다는 소식을 듣게 되어 기쁩니다.) 아니면 PowerShell을 사용하여 동일한 검사를 실행할 수 있는 다른 방법이 있습니까? 하지만 더 빠르다?

여러 가지 이유로 저는 가능한 경우 운영 체제에 내장된 기능을 사용하도록 스크립트를 제한하는 것을 선호합니다. 환경이 Windows 8.1의 새로운 빌드이고 모든 적절한 Windows 업데이트가 적용되었으며 타사 도구는 옵션이 아니라고 가정합니다.

답변1

매우 기본적입니다(시간 초과 100ms):

function testport ($hostname='yahoo.com',$port=80,$timeout=100) {
  $requestCallback = $state = $null
  $client = New-Object System.Net.Sockets.TcpClient
  $beginConnect = $client.BeginConnect($hostname,$port,$requestCallback,$state)
  Start-Sleep -milli $timeOut
  if ($client.Connected) { $open = $true } else { $open = $false }
  $client.Close()
  [pscustomobject]@{hostname=$hostname;port=$port;open=$open}
}

testport

hostname  port  open
--------  ----  ----
yahoo.com   80  True

답변2

내가 본 TCP 포트를 테스트하는 가장 짧은 방법은 다음과 같습니다.

(New-Object System.Net.Sockets.TcpClient).ConnectAsync("google.com", 80).Wait(100)

또는

[System.Net.Sockets.TcpClient]::new().ConnectAsync("google.com", 80).Wait(100) 

대기 시간은 ms 단위입니다. 이는 이전 PowerShell 2.0 호환 방법입니다.

답변3

이것을 사용하여 연결을 테스트할 수 있습니다.에서 가져온PowerShell 코드 리포지토리(저자 'BSonPosh'):

"Test-Port는 지정된 포트에 대한 TCP 연결을 생성합니다. 기본적으로 3초의 시간 초과로 포트 135에 연결됩니다."

Param([string]$srv,$port=135,$timeout=3000,[switch]$verbose)

# Test-Port.ps1
# Does a TCP connection on specified port (135 by default)

$ErrorActionPreference = "SilentlyContinue"

# Create TCP Client
$tcpclient = new-Object system.Net.Sockets.TcpClient

# Tell TCP Client to connect to machine on Port
$iar = $tcpclient.BeginConnect($srv,$port,$null,$null)

# Set the wait time
$wait = $iar.AsyncWaitHandle.WaitOne($timeout,$false)

# Check to see if the connection is done
if(!$wait)
{
    # Close the connection and report timeout
    $tcpclient.Close()
    if($verbose){Write-Host "Connection Timeout"}
    Return $false
}
else
{
    # Close the connection and report the error if there is one
    $error.Clear()
    $tcpclient.EndConnect($iar) | out-Null
    if(!$?){if($verbose){write-host $error[0]};$failed = $true}
    $tcpclient.Close()
}

# Return $true if connection Establish else $False
if($failed){return $false}else{return $true}

후속 조치를 위해 해당 저장소 페이지로 이동할 수 있습니다. (이 답변은 이미 복사 작업이 너무 많습니다.)

답변4

더 빠른 방법은 다음과 같습니다.

param($ip,$port)
New-Object System.Net.Sockets.TCPClient -ArgumentList $ip, $port

결과는 다음과 같습니다.

Client              : System.Net.Sockets.Socket
Available           : 0
Connected           : True
ExclusiveAddressUse : False
ReceiveBufferSize   : 65536
SendBufferSize      : 65536
ReceiveTimeout      : 0
SendTimeout         : 0
LingerState         : System.Net.Sockets.LingerOption
NoDelay             : False

흥미로운 가치는 '연결됨'입니다.

편집: 또 하나의 이유: Test-NetConnection은 Powershell v5에서만 작동하지만(정확하게 기억한다면) 이 솔루션은 v2에서 작동합니다. :)

관련 정보