IT/리눅스마스터1급

대상 서버의 포트가 열려 있는지 확인하는 3가지 방법

알콩달콩아빠 2023. 1. 19. 18:14
728x90
반응형

ACL이나 보안 그룹(security group)으로 포트가 막혀 있는지 확인하고 싶을 때가 많습니다.

보통은 ping 같은 명령어로 ICMP 패킷을 쏴보고 해당 서버가 살아있는지 먼저 확인합니다.
그러나 ping으로는 살아 있는데, ssh 나 http 같은 건 안 될 때가 있죠.
이 때는 TCP 포트가 열려 있는 상태를 봐야 합니다.

1. tcpping

TCP SYN 패킷을 보내서 해당 포트가 열려 있는지 확인해주는 간단한 프로그램입니다.
이런 종류의 프로그램에 보통 이런 이름으로 불러주는 듯합니다.
그런데 CentOS나 Ubuntu에 해당 이름으로 패키지는 올라와 있지 않습니다.
github에서 찾아보면 누가 원조인지 모르겠는 여러 버전의 tcpping이 올라가 있습니다.
--- 번거로워서 결국 안 씁니다.

번외로, tcpping을 쓰게 되면, ping처럼 round-trip time을 보여줍니다.
TCP 연결 속도를 볼 수 있는 거죠.
예전에는 라우터에서 ping의 우선순위가 낮아서(?) 천천히 처리하는 바람에
실제 인터넷 속도보다 느리게 나온다는 썰이 있었는데요.
TCP 연결은 최대한 빠르게 처리하기 때문에 latency를 좀 더 정확히 보려면 ping보다는 tcpping을 써야 한다고 그러더군요.

2. telnet <IP> <port>

텔넷으로 IP, port를 명시하면 해당 서버에 저 포트가 열려 있는지 간단히 확인 가능합니다.

$ telnet 127.0.0.1 10002
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

$ telnet 127.0.0.1 22
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.1
^C^]
telnet> quit
Connection closed.

연결이 되어 버리면, Ctrl+C 도 먹지 않습니다. 놀라지 마시고 Ctrl+']' 를 누르시면 텔넷 프롬프트가 나옵니다.
여기서 quit 하면 됩니다.

텔넷은 수십 년 전(?)에나 쓰던 거라 요즘은 기본으로 설치되어 있지 않습니다.
그래서 다음 명령을 쓸 수도 있습니다.

3. echo > /dev/tcp/<ip>/<port>

오늘 이 글을 쓰게 된 주인공입니다. bash의 built-in 기능이라고 합니다.

$ echo > /dev/tcp/127.0.0.1/22
$ echo $?
0

포트가 열려 있는 경우라면, 아무 메시지가 나오지 않은 상태로 끝납니다.
응? 하지 마시고 echo $? 해보면 0 이 나옵니다.
바로 전 실행 명령이 정상적으로 끝났다는 유닉스 세계의 메시지입니다.

$ echo > /dev/tcp/127.0.0.1/10002
bash: connect: 연결이 거부됨
bash: /dev/tcp/127.0.0.1/10002: 연결이 거부됨
$ echo $?
1

포트가 열려 있지 않은 경우에는 에러 메시지도 나오며,
$? 의 값이 1로 나옵니다.
성공적으로 끝나지 않았다는 뜻입니다.

 

출처 : 대상 서버의 포트가 열려 있는지 확인하는 3가지 방법 : NHN Cloud Meetup

728x90
반응형