728x90

특정 서버나 장비의 작동여부를 외부에서 확인하기 위해서 ping 테스트를 많이 합니다.

ip 혹은 hostname만으로 간단하게 확인할 수 있어서 편리한 도구입니다.

하지만 보안상 icmp를 활성화 하지 않아 확인이 불가능할 수 있고, ping 테스트 성공이 특정 서비스의 정상작동 여부를 확인해줄 수 없는 단점도 존재합니다.

파워쉘에서는 이러한 ping 테스트를 보완할 수 있는 Test-NetConnection이라는 cmdlet을 제공합니다.

Test-NetConnection cmdlet을 사용하면 ping 테스트 뿐 아니라 TraceRoute도 할 수 있고, ip(혹은 DNS명)와 특정 TCP 포트를 지정하여 해당 포트로 연결이 정상적인지의 여부도 확인 할 수 있습니다.

Test-NetConnection 파워쉘 명령 작성

우선 기본적으로 아무런 옵션을 입력하지 않고 명령을 실행하면 "internetbeacon.msedge.net"이라는 기본사이트로 ping 테스트를 수행합니다. 아마도 Microsoft의 서버 같네요.

만약 어떤 특정서버의 연결상태를 확인하려면 아래와 같이 수행하여 ping 테스트와 같은 효과를 볼 수 있습니다.

Test-NetConnection -ComputerName remoteserver

아래 예는 Test-NetConnection cmdlet을 사용하여 google.com으로 ping 테스트 한 효과를 볼 수 있습니다.

ping 테스트 외 특정 서버의 포트가 활성화 되어 있는지 여부를 확인하기 위해서는 port 옵션을 추가하여 확인하고자 하는 포트를 지정할 수 있습니다.

Test-NetConnection -ComputerName remoteserver -Port port​

 

google.com의 웹서비스인 80 포트로 테스트 해본 결과이며,

구글은 81 포트는 서비스 하지 않아 fail이 발생하는 것을 확인할 수 있습니다. 실패하더라도 친절하게 ping 테스트는 성공했다는 것도 보여주네요.

 

파워쉘 스크립트 작성

파워쉘 커맨드 창에서 직접 확인만 한다면 여기까지만 할 수 있어도 문제는 없을것 같습니다만,

저희의 목적은 파워쉘을 통해 관리업무를 자동화시켜 수작업을 최대한 줄이는 것입니다.

서버가 수십대가 있고, 서버마다 확인이 필요한 포트가 여러 개가 있을 경우 모든 포트마다 이 명령을 수행하는 것은 비 효율적일테니까요.

이를 위해서는 하나의 명령을 사용하는 파워쉘 커맨드에서 파워쉘 스크립트를 작성할 줄 알아야 합니다.

제 개인적으로도 파워쉘을 사용해서 Windows 계열의 서버를 잘 관리하려면 스크립트를 작성할 수 있어야 많은 도움이 된다고 생각합니다.

단순히 파워쉘 명령(cmdlet)만으로 충분하고 자동화까지 할 필요가 없다면 아래 내용은 읽지 않으셔도 됩니다.

관리할 서버가 여러 대라고 가정하면 각 서버들의 ip 혹은 DNS 명을 미리 다른 파일에 등록해 두는 것이 좋습니다.

관리대상 서버가 추가 혹은 삭제되면 이 목록만 변경해주면 되니까요....저는 그렇게 사용합니다.

아래 처럼 2대의 서버와 포트를 ";"(구분자는 다른 것으로 해도 무방합니다.)로 구분한 쌍으로 묶어 서버 목록 파일을 만들어서 별도의 serverlist.txt 파일로 저장합니다. (추후 파워쉘 스크립트 파일에서 이 목록파일(serverlist.txt)을 읽어 올 예정입니다.)

www.google.com;80 www.google.com;81 www.microsoft.com;80

 

이제 파워쉘 스크립트를 작성하기 위해서 Windows Powershell ISE를 오픈합니다. (문서편집기 아무거나 사용하여 작성하셔도 됩니다만, 실행까지 시켜보기 위해서는 Powershell ISE가 편리하겠죠?)

빈 파워쉘 스크립트 파일에 위에서 Get-Content cmdlet을 사용하여 작성한 서버 목록 파일(serverlist.txt)을 읽어오는 스크립트를 작성합니다.

$ServerList = Get-Content .\serverlist.txt

serverlist.txt 파일에는 총 3개의 행이 존재하고 각각의 목록은 ip와 port를 ";"로 구분해 놓았으니, loop를 돌면서 각각의 행을 ip와 port로 구분하도록 $arrSvr라는 배열에 저장합니다.

Foreach ($Server in $ServerList) { $arrSvr = $Server -split ';' }

Test-NetConnection cmdlet을 실행시킬때 ComputerName, Port 옵션에 각각 ip와 port를 지정하고,

저희가 얻고자하는 결과는 특정 포트 연결의 성공여부이기 때문에 TcpTextSucceeded 필드만 추출하여 $ConnState 변수에 저장합니다.

$ConnState = (Test-NetConnection -ComputerName $arrSvr[0] -Port $arrSvr[1]).TcpTestSucceeded;

그 후 Write-Host cmdlet을 사용하여 결과에 따라 테스트 결과를 화면에 출력합니다.

If ($ConnState -eq $False) {
	Write-host $Server "test fail.";
} else {
	Write-host $Server "test succeed.";
}

지금까지의 파워쉘 스크립트를 하나의 파일로 요약하면 아래와 같습니다.

# 서버목록 파일을 읽어서 저장
$ServerList = Get-Content E:\temp\powershell\serverlist.txt;
Foreach ($Server in $ServerList) {
	# ip;port쌍을 구분자 ';'로 구분하여 배열에 저장
	$arrSvr = $Server -split ';'
	
    # Test-NetConnection cmdlet 실행하여 결과를 $ConnState 변수에 저장
 	$ConnState = (Test-NetConnection -ComputerName $arrSvr[0] -Port $arrSvr[1]).TcpTestSucceeded
    If ($ConnState -eq $False) {
        Write-host $Server "test fail.";
    } else {
        Write-host $Server "test succeed.";
    }
}

위와 같은 스크립트를 작성하고 스케쥴을 등록하여 주기적으로 실행시키면 포트의 활성화 여부를 테스트 할 수 있겠죠?

테스트 실패 시 "test fail"이라고 출력하지 않고 등록된 관리자에게 메일을 발송하면 더 편리하겠네요.

 

지금까지 말씀드린 Test-NetConnection 기능 외 자세한 기능을 알고 싶으시다면, Microsoft 매뉴얼을 참고하세요.

Test-NetConnection (nettcpip)

Use this topic to help manage Windows and Windows Server technologies with Windows PowerShell.

docs.microsoft.com

 
반응형

+ Recent posts