수십~수백개 이상의 서버들 간의 방화벽 개방 여부 확인을 수동으로 하면 매우 귀찮고 말도 안되는 작업이므로 스크립트로 실행해야 함.

 

특정 서버에서 서버 리스트에 있는 서버들로 10000 포트 개방 여부 확인은 아래와 같은 스크립트를 이용가능.

#!/bin/sh
 
# netcat이 설치가 되어 있어야 함.
 
# 방화벽 개방확인 함수. $1=hostname $2=port
checkConnection() {
    # 타임아웃은 2초
    output=$(nc -zv -w 2 $1 $2 2>&1)
 
    if [[ "$output" == *"timed"* ]]; then
        echo "[$(hostname)] Failed to access $1 on port $2"
    fi
}
 
 
# 체크하려는 hostname이 숫자가 증가하는 형태면 for 를 사용해도 되지만 아니라면 배열로 하나씩 기입해줘야 함...
HOSTLIST=(
    "hostname1"
    "hostname-x-11"
    "hostname-y-012"
    "hostname-xxx"
    "hostname-yy"
    ... ...
)
 
CURRENT_HOSTNAME=$(hostname)
 
 
 
for hostname in "${HOSTLIST[@]}"
do
    # 자기 자신 제외
    if [ "$hostname" == "$CURRENT_HOSTNAME" ]; then
        continue
    fi
 
    checkConnection $hostname 10000
done

 

 

 

위 스크립트를 각 서버마다 전송해서 실행시키고 결과를 보고 판단하면 됨.

 

각 서버마다 전송해서 실행하는 부분도 자동화 하고 싶으면,

위 스크립트를 check_port.sh 같은 파일명으로 저장한 후,

전체 서버에 ssh 접근이 가능한 커맨더 서버(?) 같은데서 아래 스크립트를 실행하면 됨.

#!/bin/sh
 
HOSTLIST=(
    "hostname1"
    "hostname-x-11"
    "hostname-y-012"
    "hostname-xxx"
    "hostname-yy"
    ... ...
)
 
 
for hostname in "${HOSTLIST[@]}"
do
    scp ./check_port.sh USER@$hostname:~/
 
    ssh USER@$hostname "~/check_port.sh ; rm -f ~/check_port.sh"
done

 

 

 

 

HOSTLIST를 텍스트 파일로 저장해놓고 2개 스크립트 파일에서 각각 사용하고 싶으면,

hostname을 hostlist.txt 같은 파일로 한줄씩 저장한 다음 아래처럼 가져다 쓰면 됨.

scp 전송, 삭제도 함께 해줘야 함...

# 배열 초기화
HOSTLIST=()
 
# 파일에서 한줄씩 읽어 배열에 추가
while IFS= read -r line; do
    HOSTLIST+=("$line")
done < "hostlist.txt"
 
# 루프 돌리면서 필요한 작업 수행
for hostname in "${HOSTLIST[@]}"; do
    # 필요한 작업...
    echo $hostname
done

 

 

 

 

 

 

Posted by bloodguy
,