쉘을 통해서 서버 포트 스캔하기 (port scan in bashshell)

hearbeat

최근에 저희 팀에서 “Hadoop Jobtracker“가 느려지는 현상이 발생 했습니다.
경험이 많이 없기 때문에 원인을 찾는데 삽질을 많이 했습니다.
하지만 허탈하게도 “Data Node” 서버 한대가 네트워크 연결이
끊겨 있었습니다.

이렇게 어느날 갑자기 “연동 서버“가 응답이 없을 경우 원인을 찾기란
쉽지가 않습니다.

이유는다양한 원인이 존재하기 때문입니다. 그 중에서 네크워크
연결 체크는 필수 요소 이고, 원인을 찾아가는데 있어서 경우에
수를 줄여주기 때문 입니다.

각 사이트 마다  아마도 “네트워크 모니터링 툴“을 사용해서 진단을 많이 하는 것으로
알고 있습니다. 또한 “오픈소스로 제공하는 툴“도 존재를 합니다.

하지만 실제 배포된 서버에서 직접 확인 해야 하는 경우가 필요 합니다.
이유는 “툴에 대한 버그도 있을수 있으며, 실시간으로 조회가 어렵기 때문 입니다.

그렇기 때문에 개발자가 “직접 서버의 포트 체크“를 해야할 필요성이 있습니다.
대부분 “telnet, nc, ping, netstat“등 다양한 방법을 사용 할것 입니다.

이중에서 “nc” 명령어를 통해서 다수의 서버를 쉽고 편리하게 “포트 체크“를
위한 쉘을 만들어 봤습니다.

사용 방법은 아래와 같습니다.
※ 테스트 환경은 “CentOS 5.8, BashShell” 입니다.
또한 파일 생성시 반드시 같은 디렉토리에 2개의 파일이 존재해야 합니다.

“checkport.env” : Port 스캔 대상이 되는 서버들에 대한 정보
“scanport.sh” : Port 스캔을 수행하는 쉘

먼저 “checkport.env” 파일을 생성 후 Port 스캔대상 서버 정보를 설정 합니다.

#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# file name : checkport.env
# date      : 2012-12-05 13:05:05
# writer    : @beyondj2ee for twitter, beyondj2ee@gmail.com
# -----------------------------------------------------------------------------
#
# 설정 방법
# (1) 작성 규칙 : 서버명 + 구분자 + IP + 구분자 + PORT
# 예) NAMENODE_SERVER:127.0.0.1:4444, NAENODE_SERVER:www.beyondj2ee.com:80
#
# (2) 서버명은 반드시 영문 또는 숫자로 작성하고, 공백은 허용하지 않는다.
# 예) DATA NODE SERVER (X), DATA_NODE_SERVER (O)
#
# (3) 구분자는 ":"로 설정 한다. 또한 공백은 허용하지 않는다.
#
# -----------------------------------------------------------------------------
NAVER_SERVER:202.131.30.12:80
DAUM_SERVER:www.daum.net:80
GOOGLE_SERVER:74.125.128.104:80

그 다음 “scanport.sh” 파일을 생성 합니다. 여기서는 “timeout” 설정 값만 상황에 맞게 변경 합니다.
단위 는 “초” (기본 값은 10초)

#!/usr/bin/env bash
# -----------------------------------------------------------------------------
# file name : scanport.sh
# date      : 2012-12-05 13:05:05
# writer    : @beyondj2ee for twitter, beyondj2ee@gmail.com
# -----------------------------------------------------------------------------
#
# 실행 방법
# (1) 반드시 동일 디렉토리에 "checkport.env"이 있어야 한다.
#  만약 경로를 변경 하려고 하면  "LINES"에서 경로를 수정 한다.
#
#  (2) 구분자를 변경하고 싶을 경우 "PARSE_CHAR"를 변경하고
#  "checkport.env" 파일의 구분자를 변경 한다.
#
#  (3) 별다른 파라미터 설정 없이 "./scanport.sh"를 실행 한다.
# -----------------------------------------------------------------------------

PARSE_CHAR=":"
REQ_TIMEOUT=10
LINES="$(awk '/^[a-zA-Z1-9]/ {print}' ./checkport.env)"
RESULT

set LINE_ARRAY
echo "- server port scanning............................"
for i in $LINES
do
    LINE_ARRAY="$(echo $i | sed -e 's/'$PARSE_CHAR'/ /g')"
    LINE_ARRAY=($LINE_ARRAY)
    RESULT="$(nc -z -w $REQ_TIMEOUT  ${LINE_ARRAY[1]} ${LINE_ARRAY[2]})"

    if [ "$?" -ne 0 ]; then
       echo "*Connection to ${LINE_ARRAY[0]}  on port ${LINE_ARRAY[1]}:${LINE_ARRAY[2]}  failed"
    else
       echo "Connection to ${LINE_ARRAY[0]}  on port ${LINE_ARRAY[1]}:${LINE_ARRAY[2]}  succeeded"
    fi

sleep 1
done

exit 0

설정이 완료가 되었으면 아래와 같이 쉘을 실행 합니다.
[mspider@beyondj2ee ~]$ ./scanport.sh 

이미지 4

만약 서버에 네트워크가 접속이 안될 경우 아래와 같이 에러 메세지를
출력 합니다.

Daum Port를 아래와 같이 변경하고 실행을 합니다.
DAUM_SERVER:www.daum.net:9999

이미지 6

스크립트가 어렵지 않기 때문에 각자 개발환경에 맞게 수정하셔서 사용하시길
바랍니다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중