원격 시스템의 포트에 연결할 수 있는지 테스트 (텔넷없이)


353

예전 telnet에는 원격 호스트의 포트가 열려 있는지 확인했습니다. 호스트의 telnet hostname port모든 포트에 연결하려고 시도하여 원시 TCP 스트림에 액세스 할 수있게했습니다.

요즘에는 내가 작업하는 시스템에 텔넷이 설치되어 있지 않으며 (보안상의 이유로) 모든 호스트에 대한 모든 아웃 바운드 연결이 기본적으로 차단됩니다. 시간이 지남에 따라 어떤 포트가 어떤 호스트에 열려 있는지 추적하기가 쉽습니다.

제한된 수의 패키지가 설치된 Linux 시스템을 사용하여 사용할 수없는 원격 시스템의 포트가 열려 있는지 테스트하는 다른 방법이 telnet있습니까?



나는이 같은 문제가 발생했습니다. 아래 @Subhranath Chunder의 답변이 도움이되었습니다. 그러나 텔넷 설치가 작은 문제라는 것을 알았습니다 brew install telnet. 따라서 Linux 사용자는 yum및으로 동일한 작업을 수행 할 수있을 것으로 기대 apt-get합니다.
Mig82

답변:


277

Bash는 잠시 동안 TCPUDP 포트에 액세스 할 수있었습니다 . 매뉴얼 페이지에서 :

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

따라서 다음과 같은 것을 사용할 수 있습니다.

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

타다 아!


이것도 MinGW 에서 작동하는 것 같습니다 . 예를 들어, 192.168.2.100 의 원격 VNC 서버는 "cat </dev/tcp/192.168.2.100/5900"을 사용하여 "RFB 003.008"로 응답합니다.
Peter Mortensen

1
@lornix, 알았지 만,이 경우 -z 옵션없이 nc를 사용하면 동일한 결과를 얻어야하지만 여전히 작동하지 않습니다. # nc -v -w5 127.0.0.1 18080 127.0.0.1에 연결 18080 포트 [tcp / *] 성공했습니다! # cat </dev/tcp/127.0.0.1/18080 결과없이 중단됩니다. "/ dev / tcp / host / port"옵션을 언제 사용할 수 있는지 알고 싶습니다
Alexandr

5
@Alexandr ... 실제로, "결과없이 멈춤"은 거의 예상되는 동작입니다. 고양이 가 입력을 기다리고 있습니다. nc 는 보류중인 데이터를 감지하고 시도를 중지 할 수있는 추가 기능을 갖추고 있습니다. 고양이가 아닌 아주 똑똑. 시도해보십시오 cat < /dev/tcp/localhost/22.sshd 헤더를 가져와야합니다. 포트 18080의 프로세스는 무언가를 보내기 전에 무언가 들어 오기를 기다립니다. 포트 22 ( ssh )는 버전과 그 밖의 것들로 당신을 반깁니다. 사용해보십시오!
lornix

1
@lornix, 설명해 주셔서 감사합니다! 이제 제한이 분명합니다. 포트를 확인하는 데 nc를 사용하는 것이 선호되는 방법이라고 생각합니다.
Alexandr

2
이것은 아무것도 설치되지 않은 도커 컨테이너로 작업 할 때 매우 도움이되었습니다. 컨테이너가 DNS를 통해 컨테이너가 아닌 DB에 액세스했는지 신속하게 확인할 수있었습니다. 예 : cat </ dev / tcp / hostname / 5432
Michael Hobbs

404

좋고 장황하다! 매뉴얼 페이지에서.
단일 포트 :

nc -zv 127.0.0.1 80

여러 포트 :

nc -zv 127.0.0.1 22 80 8080

포트 범위 :

nc -zv 127.0.0.1 20-30

6
가장 좋은 답변 인 것 같습니다. 감사합니다. ;-)
lpapp

6
Ubuntu 14.04 (Trusty Tahr)에서 닫힌 포트 (127 초 후에 시간 초과)에 대한 원격 서버 (같은 LAN)에 대해 시도했을 때 중단되었으므로 스크립트에는 적합하지 않습니다. 포트가 열린 서비스에서는 작동했습니다. "-w2"옵션을 사용하는 것이 해결책이 될 수 있습니다.
Peter Mortensen

6
UDP 포트에는 -u 옵션을 사용하십시오.
Efren

8
ncat -z 버전 6.4에서는 인식되지 않습니다. 나는 z없이 할 수있었습니다
smishra

5
nc -zv 127.0.0.1 22,80,8080,20-30,443-446(nc 버전 : 1.107-4)를 사용 하여 여러 범위를 확인할 수 있습니다 .
bobbel

102

Netcat은 유용한 도구입니다.

nc 127.0.0.1 123 &> /dev/null; echo $?

0포트 123이 열려 있고 1닫혀 있으면 출력 됩니다 .


이것은 내 것보다 훨씬 우아하고 스크립트 가능한 답변입니다. 그것은 나에게 불행한 일이다 그 원천 징수 보안에 민감한 시스템 관리자 telnet도 보류 nc(하지만 - 이상하게 -하지 curlwget).
Steve HHH

예, 그것은 완전히 임의적이고 바보입니다.
thnee

3
FOR진술을 시작 합시다 !
채드 해리슨

1
Ubuntu 14.04 (Trusty Tahr)에서 닫힌 포트 (약 127 초 후에 시간 초과 됨)의 원격 서버 (같은 LAN)에 대해 시도했을 때 중단되었으므로 스크립트에는 적합하지 않습니다. 포트가 열려 있고 0을 반환하는 서비스에서는 작동했습니다. "-w2"옵션을 사용하는 것이 해결책이 될 수 있습니다.
Peter Mortensen

1
-G 2TCP 시간 초과에 더 적합 하다고 생각합니다
AB

58

와 같은 다른 도구를 사용하지 않고 가장 간단한 방법 socat은 위의 @lornix의 답변에 설명되어 있습니다. 이것은 /dev/tcp/...다른 서버가 커맨드 라인을 통해 주어진 포트에 액세스 할 수 있는지 테스트하려는 경우 Bash 내 에서 psuedo-device를 사용하는 방법에 대한 실제 예를 추가하는 것 입니다.

내 네트워크에이라는 호스트가 있다고 가정 해 보겠습니다 skinner.

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

당신이 포장하려는 이유는 echo > /dev/...이 같은 괄호는 (echo > /dev/...)당신이 아래로있는 연결 테스트를하지, 다음 할 경우, 당신은 이러한 유형의 메시지가 보여주는거야 때문이다.

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

/dev/null데이터를 장치에 쓰려고 시도하기 때문에 단순히 리디렉션 할 수 없습니다 /dev/tcp. 따라서 하위 명령 내에서 모든 출력을 캡처하여 하위 명령 (...cmds...)의 출력을 리디렉션합니다.


이것은 우수하다. 그것이 정상에 투표되기를 바랍니다. 페이지를 닫기 전에 실수로 스크롤했기 때문에 페이지 아래까지만 읽었습니다.
Still.Tony

@ Okuma.Tony-예, 항상 많은 답변이있는 Q의 문제입니다. 8-). 피드백에 감사드립니다.
slm

46

그 발견 curl유사한 방식으로 일을 얻을 수 있습니다 telnet, 그리고 curl심지어는 청취자가 기대되는 프로토콜을 알려줍니다.

에 대한 첫 번째 인수로 호스트 이름 및 포트에서 HTTP URI를 구성하십시오 curl. curl연결할 수 있으면 프로토콜 불일치를보고 종료합니다 (리스너가 웹 서비스가 아닌 경우). 경우 curl에 연결할 수 없습니다, 그것은 시간이 초과됩니다.

예를 들어, 호스트 10.0.0.99의 포트 5672는 방화벽에 의해 닫히거나 차단됩니다.

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

그러나 다른 시스템에서 호스트 10.0.0.99의 포트 5672에 도달 할 수 있으며 AMQP 리스너를 실행중인 것으로 보입니다.

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

다른 메시지를 구별하는 것이 중요합니다. 첫 번째 실패는 curl포트에 연결할 수 없기 때문 입니다. 두 번째 실패는 성공 테스트이지만 curlAMQP 리스너 대신 HTTP 리스너가 필요합니다.


5
curl을 사용할 수 없으면 wget이있을 수 있습니다. wget -qS -O- http://ip.add.re.ss:port효과적으로 같은 일을해야합니다.
CVn

4
예를 들어 호스트 이름으로도 작동합니다. curl myhost:22.
에이 바

잘못되었을 수 있습니다. 바람둥이 서비스가 실행 중이지만 404 오류가 발생합니다. # curl -k 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34-오류 보고서 </ title> <style> <!-H1 --- HR {color : # 525D76;} -> </ style> </ head> <body> <h1> HTTP 상태 404-/ </ h1> <HR size = "1"noshade = "noshade"> <p> <b> 유형 </ b> 상태 보고서 </ p> <p> <b> 메시지 </ b> <u> / </ u> </ p> <p> <b> 설명 </ b> <u> 요청한 리소스를 사용할 수 없습니다. </ u> </ p> <HR size = "1"noshade = "noshade"> <h3> Apache Tomcat / 7.0.34 </ h3> </ body> </ html>

비슷한 접근 방식으로 내 게시물 을 참조하십시오 .
kenorb

12
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

그것이 당신의 문제를 해결하기를 바랍니다 :)


1
예,이 방법이 더 좋습니다. 닫힌 포트의 경우 거의 즉시 시간이 초과됩니다.
Peter Mortensen

1
이것은 항상 TCP를 사용합니까 아니면 UDP를 확인하는 방법이 있습니까?
kmoe


6

이 답변 중 어느 것도 나를 위해 효과가없는 것처럼 보였으므로 하루 종일 고투하고있었습니다. 문제는 최신 버전의 플래그 nc가 더 이상 없지만 -z호스트에 연결할 수 없으면 TCP를 통한 직접 액세스 (@lornix 및 @slm에 따라)가 실패한다는 것입니다. 결국 이 페이지를 찾았습니다 . 여기서 실제로 하나의 예제가 아닌 두 개의 실제 예제를 찾았습니다 .

  1. nc -w1 127.0.0.1 22 </dev/null

    ( -w플래그는 타임 아웃을 처리하고 </dev/null대체는 -z플래그를 대체합니다 )

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    ( timeout명령은 시간 초과를 처리하고 나머지는 @slm에서 가져옵니다)

그런 다음, 단순히 사용 &&및 / 또는 ||(또는 $?) 결과를 추출 할 수 있습니다. 누군가가이 정보를 유용하게 사용할 수 있기를 바랍니다.


4

@kenorb와 @Azukikuru의 답변을 결합하면 포트 열기 / 닫기 / 방화벽을 테스트 할 수 있습니다.

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

모든 포트에 도달하기위한 컬을 사용한 또 다른 접근 방식

curl telnet://127.0.0.1:22

3

시스템에 설치된 것에 따라 방법 중 하나를 선택하는 기능은 다음과 같습니다.

# Check_port <address> <port> 
check_port() {
if [ "$(which nc)" != "" ]; then 
    tool=nc
elif [ "$(which curl)" != "" ]; then
     tool=curl
elif [ "$(which telnet)" != "" ]; then
     tool=telnet
elif [ -e /dev/tcp ]; then
      if [ "$(which gtimeout)" != "" ]; then  
       tool=gtimeout
      elif [ "$(which timeout)" != "" ]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout)  gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout)  timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp)  </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port

2

상자에서 사용할 수 없지만로 시도하십시오 nmap.


4
nmap좋은 도구이지만 이러한 시스템에서는 사용할 수 없습니다. download nmap, 컴파일하고 홈 디렉토리에 설치 한 다음 다른 모든 시스템에 복사하는 대신 대부분의 Linux 설치에서 사용할 수있는 기존 도구를 사용하는 방법을 찾고 싶었습니다.
Steve HHH

1

참고로 @peperunas의 답변을 확장하십시오.

nmap 을 사용 하여 테스트 하는 방법 은 다음과 같습니다.

nmap -p 22 127.0.0.1

(위의 예는 데모 목적으로 localhost를 사용합니다)


0

시스템보다 더 많은 것을 테스트했다면 그러한 작업에 테스트 도구 dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate )을 사용할 수 있습니다 . 당신은 당신의 기대를 정의 할 수 있습니다

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}

localhost 또는 원격 호스트 (ssh로 연결)에 대해 이러한 예상을 테스트하십시오. 원격 테스트의 경우 대상을 정의해야합니다.

{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

당신은 테스트를 실행할 수 있습니다 java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

후드 아래에서 우리는 위에서 설명한대로 netcat을 사용하고 있습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.