그러냐

외부 ip 포트 열려있는지 확인방법 본문

Linux

외부 ip 포트 열려있는지 확인방법

관절분리 2023. 4. 27. 11:41
반응형

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

부제 ) telnet 없이 포트 오픈 확인하는 방법

대부분의 서버는 보안 문제로 ssh나 http, telnet 을 사용할 수 없는 경우가 있다.

이런 경우에 대상 버의 포트가 열려 있는지 확인 하는 방법에 대해서 삽질하다, 잊으면 안될것 같아서 남겨본다.

Linux의 경우이다.

echo > /dev/tcp/IP/PORT

bash의 내장 기능으로 자세한 내용은 여기 에서 확인 할 수 있다.
포트가 열린 경우라면, 아무 메세지가 나오지 않는다. echo $? 해보면 정상적인 프로세스의 종료를 의미하는 0이 나온다.
포트가 닫힌 경우라면, 에러메세지가 나오고 echo $?의 결과가 1이 나온다.

포트가 열린 경우

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

포트가 닫힌 경우

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

curl -v telnet://IP:PORT

curl의 파라미터중 url에 telnet 스키마가 허용된다.

포트가 열린 경우

    $ curl -v telnet://IP:PORT
    * About to connect() to IP port PORT (#0)
    *   Trying IP... connected
    * Connected to IP (IP) port PORT (#0)

포트가 닫힌 경우

    $ curl -f telnet://IP:PORT
    curl: (7) couldn't connect to host
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

외부 서버의 포트가 살아있는지 open여부를 점검하기


이런 저런 이유로, 명령어들을 사용할 수 없는 경우가 존재한다.
나도 원격 서버가 살아있는지 점검해야 하는데, host 서버에 telnet등이 지원하지 않아 고생한 경험이 있다.
이러한 경우를 대비해, 서버와 통신이 되는지 확인하는 명령어를 종류에 따라 정리해 보았다.
다음은 지극히 주관적인 (쉬운?) 순서대로 방법이다.

1. Ping

포트고 뭐고 필요 없을 때

ping은 port를 사용하지 않는다.
이유는 TCP/IP 계층에서 사용되고, port가 사용되는 상위 계층인 TCP/UDP 와는 상관이 없기 때문이다.
즉, ping으로는 port 확인이 불가능하다.

$ ping [IP]

// 예시
$ ping 8.8.8.8

 

2. Telnet

특정 port를 확인해야 할 경우

$ telnet [IP] [PORT]  

// 예시
$ telnet 100.1.1.1 8080

 

3. nc(NetCat)

일반적으로 UNIX의 cat명령과 비슷한 사용법 이지만, 대상이 파일이 아니라 network connection이다.
포트 확인 기능 말고도 다양한 기능으로 사용이 된다.

$ nc -z [IP] [PORT]

// 예시
$ nc -z 100.1.1.1 8080

 

4. curl

대부분 서버는 telnet이 설치되어 있지만, 보안이슈나 최소 설치를 한 경우 사용이 불가능한 경우가 있다.
그런 경우 다음의 명령을 사용하자. 아무리 최소 설치를 해도 curl은 설치되어 있기 때문이다.

curl의 parameter중 URL telnet 스키마를 사용하여 서버 통신 확인

$ curl -v telnet://[IP]:PORT  

// 예시
$ curl -v telnet://100.1.1.1:8080

 

5. bash

약간 하드한 방법이다. shell에 익숙하지 않은 사람들은 4번에서 끝내기를 권장한다.
TCP 연결을 간단하게 bash의 내장된 기능으로 확인할 수 있다.

$ timeout 5 bash -c 'cat < /dev/null > /dev/tcp/[IP]/[PORT]'; echo $?

// 예시
$ timeout 5 bash -c 'cat < /dev/null > /dev/tcp/100.1.1.1/8080'; echo $?
// 결과
$ 0   // 성공 
$ 1   // 실패 연결 전 에러(hostname not known등 오류)
$ 124 // 실패 Timeout 에러

echo $?는 UNIX에서 바로 전 실행의 결과를 보여주는 명령어이다.

 
 
 
 
 
 

 

 

 

 

 

 

 

[리눅스] 가장 간단한 3가지 통신 테스트 방법 (telnet, curl, /dev/tcp)

uutopia 2022. 6. 24. 17:42

리눅스 서버에서 어떤 서비스가 동작하고 있고, 해당하는 서비스의 포트가 listen 상태일 때 다른 서버에서 통신을 확인하는 가장 보편적이고 간단한 통신 테스트 방법 3가지를 소개하고자 한다.

 

1. telnet

telnet IP PORT

 

연결 실패 시

$ telnet 10.0.2.16 9936
Trying 10.0.2.16...
telnet: connect to address 10.0.2.16: Connection refused

 

연결 성공 시

$ telnet 10.0.2.16 9936
Trying 10.0.2.16...
Connected to 10.0.2.16.
Escape character is '^]'.

 

간혹 telnet이 설치되어 있지 않거나 보안상 telnet 명령어의 사용이 불가능한 경우 curl을 사용한다.

 

2. curl

curl -v telnet://IP:PORT/

 

연결 실패 시

$ curl -v telnet://10.0.2.16:9936
* About to connect() to 10.0.2.16 port 9936 (#0)
*   Trying 10.0.2.16...
* 연결이 거부됨
* Failed connect to 10.0.2.16:9936; 연결이 거부됨
* Closing connection 0
curl: (7) Failed connect to 10.0.2.16:9936; 연결이 거부됨

 

연결 성공 시

$ curl -v telnet://10.0.2.16:9936
* About to connect() to 10.0.2.16 port 9936 (#0)
*   Trying 10.0.2.16...
* Connected to 10.0.2.16 (10.0.2.16) port 9936 (#0)

 

혹시 둘 다 사용이 힘들다면? 쉘에서 제공하는 /dev/tcp 기능을 사용한다.

 

3. /dev/tcp

/dev/tcp/IP/PORT

 

연결 실패 시

$ echo > /dev/tcp/10.0.2.16/9936
-bash: connect: 연결이 거부됨
-bash: /dev/tcp/10.0.2.16/9936: 연결이 거부됨

$ echo $?
1

 

연결 성공 시

$ echo > /dev/tcp/10.0.2.16/9936

$ echo $?
0

 

$? 는 바로 직전 명령어의 실행 결과를 받아온다 (성공 : 0, 실패 : 1)

 

 

여기까지 가장 많이 쓰이는 TCP 통신 테스트 방법에 대해서 알아 봤다.

그럼 Client가 아닌 Server에서는 어떻게 통신 여부를 확인할 수 있을까?

 

가장 많이 쓰이는 방법은 netstat 명령어이다.

netstat

$ netstat -an | grep PORT

 

연결을 기다리는 중

$ netstat -an | grep 9936
tcp        0      0 10.0.2.16:9936          0.0.0.0:*               LISTEN

 

연결 중

$ netstat -an | grep 9936
tcp        0      0 10.0.2.16:9936          10.0.2.15:54937         ESTABLISHED

 

연결이 끊어짐

$ netstat -an | grep 9936
tcp        0      0 10.0.2.16:9936          10.0.2.15:54937         TIME_WAIT

 

 

출처 : https://uutopia.tistory.com/41

 

 

 

 

 

 

 

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

등록일 2019.09.18 조회수 142337

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로 나옵니다.
성공적으로 끝나지 않았다는 뜻입니다.

아래 문서에 가면 이 bash의 built-in에 대해서 조금 더 자세한 내용이 나옵니다.
https://www.tldp.org/LDP/abs/html/devref1.html

아주 오래된 문서인 듯한데...
이로 봐서 꽤 오래된 bash에서도 지원하지 않을까 싶습니다.

ps. /dev/tcp를 이용하면 wget이나 curl이 없어도 파일을 받아올 수도 있다고 하네요?

 

출처 : https://meetup.nhncloud.com/posts/204

 

 

 

 

반응형