Bash의 `/dev/udp`를 사용하여 포트가 열려 있는지 어떻게 알 수 있나요?

Bash의 `/dev/udp`를 사용하여 포트가 열려 있는지 어떻게 알 수 있나요?

netcat액세스 권한 이 없으므로 특수 파일을 사용하여 포트를 테스트해 nmap보았습니다 .bash/dev/udp/

다음과 같이 할 수 있습니다.

echo "" > /dev/udp/example.com/8000

그러나 UDP를 사용할 때는 항상 그렇습니다 $?. 나는 이것이 명령의 반환 값 0때문이라고 가정합니다 . 맞습니까?echo ""

나는 기본적으로 nmap내가 할 수 있는 일을 복제하려고 노력하고 있습니다 netcat.

nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'

어떻게 해야 합니까 /dev/udp?

답변1

TCP의 경우 $?연결이 실패하면 $?다음을 확인하십시오 0.

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

bash연결이 실패했음을 깨닫는 데 시간이 걸립니다 . 당신은 그것을 사용할 수 있습니다정지시키다원인 bash:

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

UDP 포트 테스트는 더 복잡합니다.

엄밀히 말하면 없다.열려 있는상태(물론 udp는무국적프로토콜) udp를 사용합니다. 두 주에만 udp가 있습니다.듣다또는아니요. 상태가 다음과 같은 경우아니요, 당신은 얻을 것이다ICMP 대상에 연결할 수 없음.

불행하게도 방화벽이나 라우터는 종종 이러한 ICMP 패킷을 삭제하므로 UDP 포트의 상태를 확인할 수 없습니다.

답변2

일반적으로 말하면 할 수 없습니다.

TCP와 달리 UDP는 연결이 없습니다. 아무 작업도 수행하지 않는 포트에 연결하는 것만으로는 TCP에서처럼 포트가 열려 있는지 여부를 감지할 수 없습니다. 대신 데이터를 포트로 보내고 무슨 일이 일어나는지 확인하면 실제 UDP 구현의 세부 사항으로 인해 결과를 해석하기가 어렵습니다. 정교한 패킷 수준 도구라도 nmap프로그램이 특정 UDP 포트에서 수신 대기 중인지 여부를 확인할 수 없습니다. nmapUDP 포트를 세 그룹으로 나눕니다.

  1. 절대 개방적입니다. 포트로 패킷을 보내면 대상 컴퓨터에서 데이터 응답이 발생합니다.
  2. 닫혀 있어야 합니다. 포트로 패킷을 보내면 대상 컴퓨터에서 "ICMP 대상에 연결할 수 없음" 메시지가 나타납니다.
  3. 열거나 필터링합니다. 포트에 패킷을 보내도 응답이 없습니다. 어쩌면 패킷을 삭제하는 방화벽이 있을 수도 있고, 듣고 있지만 nmap응답을 얻는 방법을 모르는 프로그램이 있을 수도 있고, 사용자가 운이 좋지 않아 전송 중에 모든 패킷이 손실될 수도 있습니다.

관련 정보