네트워크_06 서버의 특정 포트가 열려 있는지 확인하는 스크립트 작성하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: nc
키워드: 네트워크, 포트 번호, 포트 스캔, 파이어월, 방화벽
사용처: 네트워크 방화벽 설정이 바른지 확인하는 스크립트를 실행하고 싶을 때

실행 예제

$ ./chkckport.sh
Connection to 192.168.2.52 80 port [tcp/http] succeeded!
Connection to 192.168.2.52 8080 port [tcp/webcache] succeeded!

# cat fail-port.log
Failed at port: 2222 <- 접속에 실패한 포트 번호가 로그에 출력됨

스크립트

#!/bin/sh

ipaddr="192.168.2.52"
faillog="fail-port.log"

# 확인할 포트는 80, 2222, 8080
for port in 80 2222 8080 # ------------------------- 1
do
  nc -w 5 -z $ipaddr $port # ------------------------ 2

  if [$? -ne 0 ]; then
    echo "Failed at port: $port" >> "$faillog" # --- 3
  fi
done

   

해설

이 스크립트는 nc 명령어로 대상 서버 TCP 포트 상태를 확인해서 접속 불가능한 TCP 포트를 fail-port.log 파일에 출력합니다.

서버 구축 시 네트워크나 방화벽 설정이 제대로 되었는지 확인해야 할 때가 있습니다. 포트마다 일일이 확인하는 것은 힘드므로 필요한 포트를 한꺼번에 확인해주는 스크립트를 사용하면 편리하겠지요. 또한 스크립트를 사용하면 실수나 빠트림 방지가 가능하므로 자동화 장점이 있습니다.

우선 확인할 TCP 포트 번호를 정의하는 1에서 for문을 써서 셸 변수 port에 80, 2222, 8080을 순서대로 대입합니다. 이 숫자가 실제로 접속해서 확인할 포트 번호가 됩니다.

2에서 접속 확인을 위해 nc 명령어를 사용합니다. nc 명령어를 Netcat이라고 부르며 TCP/UDP 패킷으로 다양한 네트워크 확인이 가능합니다. 따라서 nc 명령어는 네트워크 기술자가 애용하는 명령어 입니다.

nc [옵션] <대상 호스트> <포트 번호>

여기서 nc 명령어 -w 옵션과 -z 옵션을 사용합니다.

-z 옵션은 TCP 3WAY 핸드 쉐이크만 하고 실제 데이터 통신은 일어나지 않습니다. 이 예제처럼 네트워크/방화벽 확인 목적이라면 서버까지 통신이 되는지만 확인하면 되므로 -z 옵션이 편리합니다.

-w 옵션은 타임아웃 설정입니다. 방화벽 설정에 따라서는 서버 존재 자체를 숨기기 위해 포트 접속 시 아무런 응답을 하지 않도록 무시하는 기능이 있습니다. 이럴 때는 nc 명령어 동작 자체가 정지하게 되는데 예제에서는 -w 5로 5초간 응답이 없으면 타임아웃으로 종료 처리합니다. nc 명령어에서 자주 사용하는 옵션은 아래와 같습니다.

  • nc 명령어 주요 옵션

    옵션 설명
    -k Ctrl + C가 입력될 때까지 계속 실행
    -l 듣기 모드로 실행
    -n 포트 번호 서비스명 변환이나 호스트명 변환을 하지 않음
    -u TCP 패킷이 아닌 UDP 패킷 송신
    -v 상세(verbose) 모드, 통신 상태를 자세히 표시
    -w 타임아웃(초) 설정
    -z 데이터 통신 없이 핸드쉐이크만 실행
    –menu 메뉴 목록 표시

nc 명령어는 접속에 실패하면 종료 스테이터스로 0 이외의 값을 돌려줍니다. 셸 스크립트에서는 직전 명령어의 종료 스테이터스를 $?로 얻을 수 있으므로 3에서 if문으로 nc 명령어가 성공했는지 판별합니다. -ne는 ‘같지 않으면 참’이므로 nc 명령어가 실패했을때 if문 내부가 실행됩니다. 실패한 포트 번호만 fail-port.log에 출력합니다.

   

Netcat

Netcat이라 불리는 명령어는 예제에서 소개한 nc 명령어 외에도 포트 스캔툴 nmap에 따라오는 ncat 명령어가 있습니다. GNU Netcat이란 소프트웨어도 있습니다. 하지만 GNU Netcat은 예전에 개발 중지되어서 현재는 그다지 쓰지 않습니다. 하지만 nc 명령어와 ncat 명령어는 빈번히 사용됩니다.

nc 명령어와 ncat 명령어는 옵션도 거의 같고 동작도 비슷하지만 세부 동작이나 메시지 출력은 조금 다릅니다. 따라서 셸 스크립트에서 사용할 때는 주의해야 합니다. Netcat 명령어라고 할 때는 nc 또는 netcat일 수도 있으므로 미리 확인하기 바랍니다.

   

주의사항

  • 타인의 서버 포트를 임의로 확인하면 포트 스캔이라는 부정 접속 행위로 보일 수 있습니다. 따라서 자신이 관리하는 서버에서만 스크립트를 실행하기 바랍니다.

  • nc 명령어 -w 옵션의 타임아웃 설정은 Mac에서는 동작하지 않습니다. 따라서 Mac에서 응답하지 않을 때는 Ctrl + C 로 종료하기 바랍니다.