__JMY__
MY Devblog
__JMY__
전체 방문자
오늘
어제
  • 분류 전체보기 (52)
    • Dev (52)
      • Algorithm (6)
      • Linux (12)
      • Network (7)
      • Container (2)
      • Python (14)
      • Frontend (2)
      • Etc (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Sorting
  • network
  • flask
  • Ingress
  • flexbox
  • Python
  • Docker
  • frontend
  • certificate
  • wget
  • tcpdump
  • Tuple
  • react
  • Linux
  • hikaricp
  • SCP
  • algorithm
  • hash
  • springboot
  • Kubernetes

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
__JMY__

MY Devblog

Dev/Linux

목적지 포트 확인

2021. 7. 6. 21:34

목적지 포트 확인

서버를 운영할 때 목적지 서버의 포트가 열려있는지 확인이 필요할 때가 있습니다.

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
    'Dev/Linux' 카테고리의 다른 글
    • 리눅스 sudo 패스워드 없이 사용
    • 리눅스 scp 명령어
    • 리눅스 du 명령어
    • find 명령어
    __JMY__
    __JMY__
    공부내용 정리 블로그

    티스토리툴바