bash의`/ dev / udp`를 사용하면 포트가 열려 있는지 어떻게 알 수 있습니까?


14

나는에 액세스 할 수없는 netcat또는 nmap내가 사용하려고 해요 그래서 bash하고 /dev/udp/테스트 포트에 특수 파일을.

나는 다음과 같은 것을 할 수있다 :

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

그러나 $?항상 0UDP를 사용할 때입니다. 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
UDP는 전달을 보장하지 않으므로 bash가 메시지 전송에 성공했다고 생각하더라도 메시지가 중단되었을 수 있습니다. 실패한 전송을 어떻게 테스트 했습니까 (성공하지 않은 연결 : UDP가 연결되지 않았습니다)?
Gilles 'SO- 악마 그만해'

답변:


13

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 포트의 상태를 확실하게 알 수 없습니다.


UDP에 중점을두기 위해 내 질문을 바 꾸었습니다. 닌자 편집에 대한 사과드립니다. 나는 그것이 비슷할 것이라고 생각했기 때문에 구별하지 않았다. 정리해 주셔서 감사합니다.
Belmin Fernandez

10

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

TCP와 달리 UDP는 비 연결입니다. TCP와 마찬가지로 아무것도 연결하지 않고 포트가 열려 있음을 감지 할 수 없습니다. 오히려, 데이터를 포트로 전송하고 어떤 일이 발생하는지 확인해야하며 실제 환경에서 구현 된 UDP의 세부 사항으로 인해 결과를 해석하기가 어렵습니다. 정교한 nmapUDP 패킷 수준 툴조차도 특정 UDP 포트를 수신하는 프로그램이 있는지 확실하게 알 수 없습니다. nmapUDP 포트를 세 그룹으로 분류합니다.

  1. 확실히 열었습니다. 포트로 패킷을 전송하면 대상 시스템에서 데이터 응답이 도출되었습니다.
  2. 확실히 닫혔습니다. 포트로 패킷을 전송하면 대상 시스템에서 "ICMP Destination Unreachable"메시지가 나타납니다.
  3. 열거 나 필터링했습니다. 포트로 패킷을 전송해도 아무런 응답이 없습니다. 패킷을 삭제하는 방화벽이있을 수 있습니다. 어쩌면 듣고있는 프로그램 nmap이 있고 응답을 얻는 방법을 찾지 못했을 수도 있습니다 . 어쩌면 사용자가 운이 좋지 않아 모든 패킷이 전송 중에 손실되었을 수 있습니다.

에 대한 훌륭한 정보 nmap. 고마워, 이것은 많은 혼란을 분명히합니다.
Belmin Fernandez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.