목적지 포트 확인
서버를 운영할 때 목적지 서버의 포트가 열려있는지 확인이 필요할 때가 있습니다.
nmap과 같은 오픈소스 네트워크 스캐너를 이용하여 확인이 가능하지만 서버에 설치되어있지 않은 경우에는 다른 방법이 필요합니다.
여러가지 방법이 있지만 그 중 bash의 내장된 기능인 /dev/{tcp,udp}를 활용하여 목적지 서버 포트가 열려 있는지 확인하는 방법을 정리하였습니다.
명령어 예시 및 상황별 Exit status 값
1) 포트가 열려있는 경우
포트가 열려있는 경우에는 Exit Status로 0을 반환합니다
$ bash -c "</dev/tcp/xxx.xxx.xxx.xxx/8000"
$ echo $?
0
2) 포트가 닫혀있는 경우
포트가 닫혀있는 경우에는 Exit Status로 1을 반환합니다
$ bash -c "</dev/tcp/xxx.xxx.xxx.xxx/8001"
bash: connect: Connection refused
bash: /dev/tcp/xxx.xxx.xxx.xxx/8001: Connection refused
$ echo $?
1
3) 네트워크 문제 or 방화벽, 필터가 연결을 막는 경우
네트워크 문제가 있거나 방화벽, 필터가 연결을 막는 경우 1을 반환합니다.
$ bash -c "</dev/tcp/xxx.xxx.xxx.xxx/8000"
bash: connect: No route to host
bash: /dev/tcp/xxx.xxx.xxx.xxx/8000: No route to host
$ echo $?
1
방화벽 체크 스크립트
아래는 /dev/tcp를 사용해서 만든 방화벽 확인 bash 스크립트입니다.
checkFirewall 함수의 인자에 "프로토콜/호스트/포트"를 전달하여 방화벽 오픈 여부를 확인할 수 있습니다.
timeout 값을 주어 "3) 네트워크 문제 or 방화벽, 필터가 연결을 막는 경우" 케이스인 경우 Filtered로 출력하도록 만들었습니다.
#!/bin/bash
# Open -> Port is open.
# Closed -> There is no firewall or filter, but no service listening for connections.
# Filtered -> Network issue, firewall or filter blocking connections.
checkFirewall() {
endpoint=(${1//:/ })
protocol=${endpoint[0]}
host=${endpoint[1]}
port=${endpoint[2]}
timeout 3 bash -c "</dev/$protocol/$host/$port" &> /dev/null
case "$?" in
0)
printf "%-25s Open\n" $1
;;
1)
printf "%-25s Closed\n" $1
;;
124)
printf "%-25s Filtered\n" $1
;;
*)
printf "%-25s Unexpected error(%d)\n" $1 $?
;;
esac
}
checkFirewall "tcp:127.0.0.1:80"
checkFirewall "tcp:127.0.0.1:443"
반응형
'Dev > Linux' 카테고리의 다른 글
리눅스 sudo 패스워드 없이 사용 (0) | 2021.01.29 |
---|---|
리눅스 scp 명령어 (0) | 2021.01.29 |
리눅스 du 명령어 (0) | 2021.01.29 |
find 명령어 (0) | 2020.03.29 |
logrotate (0) | 2019.12.20 |