Testowanie połączenia portu UDP

37

Próbuję przetestować, czy mogę dostać się do określonego portu na zdalnym serwerze (do którego mam dostęp) za pośrednictwem UDP.

Oba serwery są połączone z Internetem. Korzystam z netcata, aby pewien port nasłuchiwał.

Następnie używam nmap, aby sprawdzić, czy ten port jest otwarty, ale wydaje się, że nie jest.

Iptables jest wyłączone.

Wszelkie sugestie, dlaczego tak może być? W końcu zamierzam skonfigurować tunel VPN, ale ponieważ jestem nowy w tunelach, chcę się upewnić, że mam połączenie z portem UDP 1194, zanim przejdę dalej.

Zamek
źródło
Odpowiedziałem na pytanie „Testowanie łączności portu UDP”. Ale sugeruję skoncentrowanie się na bardziej szczegółowej części „upewnij się, że OpenVPN odbiera moje pakiety UDP” - którą można łatwo osiągnąć, przeglądając dzienniki OpenVPN.
Luke404,

Odpowiedzi:

46

Nie ma czegoś takiego jak „otwarty” port UDP, przynajmniej nie w tym sensie, że większość ludzi jest przyzwyczajona do myślenia (co odpowiada na pytanie „OK, zaakceptowałem twoje połączenie”). UDP nie wymaga sesji, więc „port” (czytaj: protokół UDP w stosie IP systemu operacyjnego) nigdy nie odpowie sam na „sukces”.

Porty UDP mają tylko dwa stany: nasłuchuje lub nie. To zwykle tłumaczy się jako „otwarcie gniazda przez proces” lub „brak otwarcia gniazda”. Ten drugi przypadek powinien być łatwy do wykrycia, ponieważ system powinien odpowiedzieć pakietem ICMP Destination Unreachable o kodzie = 3 (Port nieosiągalny). Niestety wiele zapór ogniowych może upuścić te pakiety, więc jeśli nic nie otrzymasz, nie wiesz na pewno, czy port jest w tym stanie, czy nie. I nie zapominajmy, że ICMP również nie wymaga sesji i nie wykonuje retransmisji: pakiet Port Unreachable może równie dobrze zostać zgubiony gdzieś w sieci.

Port UDP w stanie „nasłuchiwania” może w ogóle nie odpowiadać (proces nasłuchujący po prostu odbiera pakiet i niczego nie przesyła) lub może odesłać coś z powrotem (jeśli proces zadziała po odebraniu i jeśli zadziała odpowiadanie przez UDP na pierwotny adres IP nadawcy:). Więc znowu, nigdy nie wiesz na pewno, jaki jest stan, jeśli niczego nie odzyskasz.

Mówisz, że możesz mieć kontrolę nad hostem odbierającym: dzięki temu możesz zbudować własny protokół, aby sprawdzić osiągalność portu UDP: po prostu umieść proces na hoście odbierającym, który będzie nasłuchiwał na danym porcie UDP i odpowie ci (lub odeśle e-mail lub po prostu wariujesz i unlink()wszystko w systemie plików hosta ... zrobi wszystko, co przyciągnie twoją uwagę).

Luke404
źródło
Myślę, że teraz to rozumiem. Więc netstat na serwerze z nasłuchującym portem udp nigdy nie pokaże zdalnego hosta ... Czy tylko tcpdump powinien pokazywać zdalne żądania?
Zablokuj
Zarówno netstat, jak i tcpdump mają możliwość zrzucania danych na ciebie, ten ostatni w bardziej czytelnej dla człowieka formie. Sprawdź ich strony podręcznika, aby uzyskać szczegółowe informacje.
Luke404,
56

Aby sprawdzić, czy port udp odpowiada, użyj netcat.

Przykład ze strony man :

nc -v -u -z -w 3 example.host 20-30
    Send UDP packets to ports 20-30 of example.host, and report which ones
    did not respond with an ICMP packet after three seconds.

Oczywiście, jeśli zapora sieciowa jest uruchomiona DROP, co zwykle ma miejsce w przypadku bram internetowych, nie otrzymasz odpowiedzi ICMP.

motobói
źródło
1
Ta odpowiedź dała mi wynik fałszywie pozytywny, gdzie, w przeciwieństwie do tego, odpowiedź Saszy wykazuje to, czego oczekuję.
texas-bronius
@ texas-bronius Jeśli masz dostęp do innego serwera, prawdopodobnie lepiej jest zrobić Sashę
motobói
27
  1. zarówno na kliencie, jak i na serwerze zainstaluj nc: yum install nc(dla centos)
  2. na serwerze nasłuchuj port UDP: nc -ul 6111
  3. na kliencie nc -u <server> 6111
  4. wpisz cokolwiek na kliencie i wciśnij enter - powinieneś zobaczyć ten tekst na serwerze

Uwaga: Po uruchomieniu nc -ulpolecenia na serwerze, połączenie zostanie nawiązane tylko dla pierwszego połączenia do niego przychodzącego. Jak się dowiedziałem, nie można przełączać się między serwerami pingującymi go bez zatrzymywania i ponownego uruchamiania nc -ul. W rzeczywistości, jeśli ^ C zatrzymasz klienta ( nc -u ...), nie będziesz mógł zrestartować klienta bez uprzedniego zrestartowania nasłuchiwania serwera.

Sasha
źródło
1
Podoba mi się ta sprytna odpowiedź, ponieważ karmi moje własne rozumienie (i nieporozumienia!) Na temat tego, jak UDP jest „wysyłaj i zapominaj”, a wszelkie potwierdzenia można uzyskać tylko z właściwej konfiguracji. Zbyt wiele czynników. Ta odpowiedź daje naprawdę proste, definitywne wywołanie i odpowiedź, które albo działa, albo nie działa, zmień config, przepłucz i powtórz.
texas-bronius
10

Testowanie otwartych portów UDP za pomocą nmap jest pełne niebezpieczeństw - nie ma trójstronnego uzgadniania wskazującego na otwartość. O ile proces nasłuchiwania nie zareaguje na cokolwiek, co wysyła nmap, nmap nie ma możliwości rozróżnienia między otwartym portem, który nie odpowiada, a portem filtrowanym.

Znacznie łatwiej jest po prostu nasłuchiwać na jednym końcu za pomocą netcata i używać netcata na drugim końcu, aby wysyłać pakiety i widzieć, że docierają na drugim końcu. Zrób to na dwa sposoby, po prostu bądź pewien. Możesz także tcpdumpzobaczyć, jak pakiety docierają tam, gdzie muszą jechać.

womble
źródło
Rozumiem ... Więc skąd nmap dokładnie zna otwarty port? Czy wysyła dane do tego portu i jeśli otrzyma odpowiedź, jest uważane za otwarte? Użyję kombinacji tcpdump i netcat. Dziękuję za dobrze wyjaśnioną odpowiedź.
Zablokuj
2

Możesz skanować porty udp za pomocą następującego polecenia

nmap -sU -v <hostname or ip>
Koray Güclü
źródło
1

Możesz to zrobić za pomocą netcat(nc) lub iperf, zakładając, że masz inną maszynę do testowania poza siecią. Moim wyborem byłoby nmapskanowanie UDP z systemu spoza twojego środowiska. Jaka była twoja linia poleceń nmap? Czy w miksie są jakieś sprzętowe zapory ogniowe lub inne urządzenia?

ewwhite
źródło
1

Mam proste podejście. Jeśli serwer UDP nie zwróci oczekiwanych danych, po prostu przestaję zbierać dgramy, zakładając, że spadł:

LINE: while(1)
{
    my $line;
    my $flags;

    local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
    alarm 5;
    eval {
        $socket->recv($line,2024,$flags);
    };

    unless($line =~ /\{.*\}/){
        if($verbose){
            print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
        }

        last LINE;
    }
}
David Waddell
źródło