Używając bash `/ dev / udp`, skąd mam wiedzieć, czy port jest otwarty?

14

Nie mam dostępu do netcatlub nmapwięc staram się używać bashi /dev/udp/specjalne pliki do portów testowych.

Mógłbym zrobić coś takiego:

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

Ale $?zawsze tak jest 0przy korzystaniu z UDP. Zakładam, że to dlatego, że jest to zwracana wartość echo ""polecenia poprawna?

Zasadniczo próbuję powtórzyć to, co mogę zrobić, nmapi netcat:

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

Jak miałbym to zrobić /dev/udp?

Belmin Fernandez
źródło
1
UDP nie gwarantuje dostarczenia, więc nawet jeśli bash myśli, że udało się wysłać wiadomość, wiadomość mogła zostać zniszczona po drodze. Jak przetestowałeś nieudane wysyłanie (nie nieudane połączenie: UDP nie jest połączeniem)?
Gilles „SO- przestań być zły”

Odpowiedzi:

13

W przypadku tcp po prostu sprawdzam $?. Jeśli połączenie się nie powiedzie, $?nie będzie 0:

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

bashUświadomienie sobie, że połączenie nie powiodło się, potrwa . Możesz użyć limitu czasu, aby uruchomić bash:

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

Testowanie portu udp jest bardziej złożone.

Ściśle mówiąc, nie ma stanu otwartego (oczywiście udp to protokół bezstanowy ) z udp. Są tylko dwa stany z udp, słuchanie lub nie . Jeśli stan nie jest , otrzymasz ICMP Miejsce docelowe nieosiągalne .

Niestety zapora lub router często upuszczają te pakiety ICMP, więc nie masz pewności, jaki jest stan portu udp.

Cuonglm
źródło
Przeformułowałem moje pytanie, aby skupić się na UDP. Przepraszam za edycję ninja. Myślałem, że będzie podobnie, więc nie wprowadziłem rozróżnienia. Dzięki za wyjaśnienie.
Belmin Fernandez
10

Ogólnie nie możesz.

W przeciwieństwie do TCP, UDP jest bezpołączeniowy. Nie można wykryć, że port jest otwarty, po prostu nawiązując z nim połączenie typu „nic nie rób”, jak w przypadku TCP. Zamiast tego musisz wysłać dane do portu i zobaczyć, co się stanie, a szczegóły UDP zaimplementowane w świecie rzeczywistym utrudniają interpretację wyników. Nawet wyrafinowane narzędzia na poziomie pakietu, takie jak nmapnie są pewne, czy jakiś program nasłuchuje na danym porcie UDP. nmapdzieli porty UDP na trzy grupy:

  1. Zdecydowanie otwarty. Wysłanie pakietu do portu wywołało odpowiedź danych z komputera docelowego.
  2. Zdecydowanie zamknięte. Wysłanie pakietu do portu wywołało komunikat „ICMP Destination Unreachable” z komputera docelowego.
  3. Otwarty lub przefiltrowany. Wysłanie pakietu do portu nie wywołało żadnej odpowiedzi. Może jest zapora ogniowa, która upuszcza pakiety; może jest program słuchający i nmappo prostu nie wymyślił, jak uzyskać odpowiedź; być może użytkownik po prostu miał pecha i wszystkie pakiety zostały utracone podczas transportu.
znak
źródło
Świetna informacja o nmap. Dzięki, to wyjaśnia wiele zamieszania.
Belmin Fernandez