Test della connettività della porta UDP


37

Sto cercando di verificare se riesco ad accedere a una determinata porta su un server remoto (a cui entrambi ho accesso) tramite UDP.

Entrambi i server sono di fronte a Internet. Sto usando netcat per avere una certa porta in ascolto.

Quindi uso nmap per verificare la porta per vedere se è aperta, ma non sembra essere.

Iptables è disattivato.

Qualche suggerimento sul perché questo potrebbe essere? Alla fine ho intenzione di installare un tunnel VPN, ma poiché sono molto nuovo con i tunnel, voglio assicurarmi di avere la connettività sulla porta UDP 1194 prima di avanzare.


Ho risposto alla domanda "Test della connettività della porta UDP". Ma suggerisco di concentrarmi sulla parte più specifica "assicurati che OpenVPN riceva i miei pacchetti UDP" - che potrebbe essere facilmente raggiunta guardando i log di OpenVPN.
Luke404

Risposte:


46

Non esiste una porta UDP "aperta", almeno non nel senso che la maggior parte delle persone è abituata a pensare (che risponde a qualcosa come "OK, ho accettato la tua connessione"). UDP è senza sessione, quindi "una porta" (leggi: il protocollo UDP nello stack IP del sistema operativo) non risponderà mai da solo "successo".

Le porte UDP hanno solo due stati: ascolto o meno. Ciò di solito si traduce in "avere un socket aperto su di esso mediante un processo" o "non avere alcun socket aperto". Quest'ultimo caso dovrebbe essere facile da rilevare poiché il sistema dovrebbe rispondere con un pacchetto irraggiungibile destinazione ICMP con codice = 3 (porta non raggiungibile). Sfortunatamente molti firewall potrebbero far cadere quei pacchetti, quindi se non ottieni nulla in cambio non sai con certezza se la porta è in questo stato o meno. E non dimentichiamo che anche ICMP è senza sessioni e non fa ritrasmissioni: il pacchetto Port Unreachable potrebbe benissimo essere perso da qualche parte sulla rete.

Una porta UDP nello stato di "ascolto" potrebbe non rispondere affatto (il processo in ascolto su di essa riceve solo il pacchetto e non trasmette nulla) o potrebbe inviare qualcosa indietro (se il processo agisce alla ricezione e se agisce da rispondere tramite UDP all'IP mittente originale: porta). Quindi di nuovo, non si sa mai con certezza qual è lo stato se non si ottiene nulla in cambio.

Dici che puoi avere il controllo dell'host ricevente: questo ti rende in grado di costruire il tuo protocollo per verificare la raggiungibilità della porta UDP: basta mettere un processo sull'host ricevente che ascolterà sulla porta UDP data e risponderà (o ti invierà indietro una e-mail, o semplicemente impazzire e unlink()tutto ciò che sul file system host ... tutto ciò che attiverà la tua attenzione farà).


Penso di capirlo adesso. Quindi un netstat sul server con la porta udp in ascolto non mostrerà mai l'host remoto ... Solo un tcpdump dovrebbe mostrare le richieste remote?
Blocca il

Sia netstat che tcpdump hanno la capacità di scaricare dati su di te, questi ultimi in una forma più leggibile dall'uomo. Controlla le loro pagine man per i dettagli.
Luke404

56

Per verificare se la porta udp risponde, utilizzare netcat.

Un esempio dalla pagina 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.

Ovviamente, se viene DROPinstallato un firewall , che è normalmente il caso quando si tratta di gateway con connessione Internet, non si riceverà una risposta ICMP.


1
Questa risposta mi ha dato un falso positivo, dove, al contrario, la risposta di Sasha mostra ciò che mi aspetto.
texas-bronius,

@ texas-bronius Se hai accesso all'altro server, probabilmente è meglio fare la strada di Sasha
motobói

27
  1. sia su client che su server install nc: yum install nc(per centos)
  2. sul server ascolta la porta UDP: nc -ul 6111
  3. sul cliente nc -u <server> 6111
  4. digita qualsiasi cosa sul client e premi invio: dovresti vedere questo testo sul server

Nota: quando si esegue il nc -ulcomando sul server, si connetterà solo per la prima connessione che arriva ad esso. Come ho scoperto, non è possibile passare da un server all'altro con il ping senza arrestarlo e riavviarlo nc -ul. In effetti, se ^ C arresti il ​​client ( nc -u ...), non puoi nemmeno riavviare il client senza prima riavviare il listener del server.


1
Mi piace questa risposta intelligente, perché alimenta le mie comprensioni (e incomprensioni!) Su come UDP è "invia e dimentica" e tutte le conferme possono essere ottenute solo dalla corretta configurazione. Troppi fattori. Questa risposta fornisce una chiamata e una risposta davvero semplici e definitive che funzionano o non funzionano, cambiano configurazione, risciacquo e ripetizione.
texas-bronius,

10

Testare le porte UDP aperte con nmap è irto di pericoli - non c'è stretta di mano a tre vie per indicare l'apertura. A meno che il processo di ascolto non risponda a ciò che nmap invia, non c'è modo per nmap di distinguere tra una porta aperta che non risponde e una porta filtrata.

Molto più semplice è semplicemente ascoltare da un lato con netcat e usare netcat dall'altro lato per inviare i pacchetti e vedere che arrivano dall'altro lato. Fallo in entrambi i modi, assicurati. Puoi anche tcpdumpvedere i pacchetti arrivare dove devono andare.


Capisco ... Allora, come fa Nmap a conoscere esattamente una porta aperta? Invia i dati a quella porta e se riceve una risposta, viene considerato aperto? Userò una combinazione di tcpdump e netcat. Grazie per la tua risposta ben spiegata.
Blocca il


2

Puoi scansionare le porte udp usando il seguente comando

nmap -sU -v <hostname or ip>

1

Puoi farlo con netcat(nc) o iperf, supponendo che tu abbia un altro computer con cui testare al di fuori della rete. La mia scelta sarebbe una nmapscansione UDP da un sistema esterno al tuo ambiente. Qual era la tua riga di comando nmap? Ci sono firewall hardware o altri dispositivi nel mix?


1

Ho un approccio semplice. Se il server UDP non restituisce i dati previsti, interrompo semplicemente la raccolta di diagrammi, supponendo che sia diminuito:

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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.