Menguji konektivitas port UDP

37

Saya mencoba untuk menguji apakah saya bisa sampai ke port tertentu pada server jarak jauh (keduanya saya memiliki akses ke) melalui UDP.

Kedua server menghadapi internet. Saya menggunakan netcat untuk mendengarkan porta tertentu.

Saya kemudian menggunakan nmap untuk memeriksa port itu untuk melihat apakah port itu terbuka, tetapi sepertinya tidak.

Iptables dimatikan.

Ada saran mengapa ini bisa terjadi? Saya akhirnya akan mengatur terowongan VPN, tetapi karena saya sangat baru di terowongan, saya ingin memastikan saya memiliki konektivitas pada port UDP 1194 sebelum melanjutkan.

Mengunci
sumber
Saya telah menjawab pertanyaan "Pengujian konektivitas port UDP". Tetapi saya menyarankan untuk berkonsentrasi pada bagian yang lebih spesifik "pastikan OpenVPN menerima paket UDP saya" - yang dapat dengan mudah dicapai dengan melihat log OpenVPN.
Luke404

Jawaban:

46

Tidak ada yang namanya port UDP "terbuka", paling tidak dalam arti kebanyakan orang terbiasa berpikir (yang menjawab sesuatu seperti "OK, saya sudah menerima koneksi Anda"). UDP adalah sesi-kurang, jadi "port" (baca: protokol UDP dalam sistem IP stack stack) tidak akan pernah merespons "sukses" sendiri.

Port UDP hanya memiliki dua status: mendengarkan atau tidak. Itu biasanya diterjemahkan menjadi "memiliki soket terbuka di atasnya oleh suatu proses" atau "tidak memiliki soket terbuka". Kasus terakhir harus mudah dideteksi karena sistem harus merespons dengan paket ICMP Destination Unreachable dengan kode = 3 (Port unreachable). Sayangnya banyak firewall bisa menjatuhkan paket-paket itu jadi jika Anda tidak mendapatkan apa-apa kembali, Anda tidak tahu pasti apakah portnya dalam keadaan ini atau tidak. Dan jangan lupa bahwa ICMP juga kurang sesi dan tidak melakukan transmisi ulang: paket Port Unreachable bisa saja hilang di suatu tempat di internet.

Port UDP dalam keadaan "mendengarkan" mungkin tidak merespons sama sekali (proses mendengarkannya hanya menerima paket dan tidak mengirimkan apa-apa) atau ia dapat mengirim sesuatu kembali (jika prosesnya bekerja pada penerimaan dan jika bertindak oleh merespons melalui UDP ke IP pengirim asli: port). Jadi sekali lagi, Anda tidak pernah tahu pasti bagaimana keadaannya jika Anda tidak mendapatkan apa-apa kembali.

Anda mengatakan Anda dapat memiliki kontrol dari host penerima: yang membuat Anda dapat membangun protokol Anda sendiri untuk memeriksa jangkauan port UDP: cukup masukkan proses pada host penerima yang akan mendengarkan pada port UDP yang diberikan dan merespons kembali (atau mengirim Anda email, atau hanya panik dan unlink()semua yang ada di sistem file host ... apa pun yang akan memicu perhatian Anda akan dilakukan).

Luke404
sumber
Pikir saya mengerti sekarang. Jadi netstat di server dengan port udp yang mendengarkan tidak akan pernah menampilkan host jarak jauh ... Hanya tcpdump yang harus memperlihatkan permintaan jarak jauh?
Kunci
Baik netstat dan tcpdump memiliki kemampuan untuk membuang data pada Anda, yang terakhir dalam bentuk yang lebih dapat dibaca oleh manusia. Lihat halaman manual mereka untuk detail.
Luke404
56

Untuk menguji apakah port udp merespons, gunakan netcat.

Contoh dari halaman manual :

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.

Tentu saja, jika firewall sedang DROPmenyala, yang biasanya terjadi ketika berhadapan dengan gateway berwajah internet, Anda tidak akan menerima respons ICMP.

motobói
sumber
1
Tanggapan ini memberi saya jawaban positif palsu, di mana, sebaliknya, jawaban Sasha menunjukkan apa yang saya harapkan.
texas-bronius
@ texas-bronius Jika Anda memiliki akses ke server lain, mungkin lebih baik melakukannya dengan cara Sasha
motobói
27
  1. keduanya di client ans server install nc: yum install nc(for centos)
  2. di server dengarkan port UDP: nc -ul 6111
  3. pada klien nc -u <server> 6111
  4. ketik apa pun di klien dan tekan enter - Anda akan melihat teks ini di server

Catatan: Ketika Anda menjalankan nc -ulperintah di server, itu hanya akan terhubung untuk koneksi pertama yang datang ke sana. Anda tidak bisa, seperti yang saya tahu, beralih di antara server yang melakukan ping tanpa berhenti dan memulai ulang nc -ul. Bahkan, jika Anda ^ C menghentikan klien ( nc -u ...), Anda juga tidak dapat memulai ulang klien tanpa terlebih dahulu memulai ulang pendengar server.

Sasha
sumber
1
Saya suka jawaban pintar ini, karena memberi saya pengertian (dan kesalahpahaman!) Tentang bagaimana UDP "kirim dan lupakan" dan semua konfirmasi hanya dapat diperoleh dari konfigurasi yang tepat. Terlalu banyak faktor. Respons ini memberikan panggilan dan respons yang sangat sederhana dan pasti, yang berfungsi atau tidak berfungsi, mengubah konfigurasi, membilas, dan mengulangi.
texas-bronius
10

Menguji port UDP terbuka dengan nmap penuh dengan bahaya - tidak ada jabat tangan tiga arah untuk menunjukkan keterbukaan. Kecuali jika proses mendengarkan merespons apa pun yang dikirimkan nmap, tidak ada cara bagi nmap untuk membedakan antara port terbuka yang tidak merespons dan port yang difilter.

Jauh lebih mudah hanya dengan mendengarkan di satu sisi dengan netcat dan menggunakan netcat di ujung lainnya untuk mengirim paket, dan melihat mereka tiba di ujung lainnya. Lakukan keduanya dengan cara yang pasti. Anda juga tcpdumpdapat melihat paket sampai ke tempat mereka harus pergi.

womble
sumber
Begitu ya .. Jadi bagaimana nmap tahu port terbuka sebenarnya? Apakah itu mengirim data ke port itu dan jika menerima respons, itu dianggap terbuka? Saya akan menggunakan kombinasi tcpdump dan netcat. Terima kasih atas jawaban Anda yang dijelaskan dengan baik.
Kunci
2

Anda dapat memindai port udp dengan menggunakan perintah berikut

nmap -sU -v <hostname or ip>
Koray Güclü
sumber
1

Anda dapat melakukan ini dengan netcat(nc) atau iperf, dengan asumsi Anda memiliki mesin lain untuk menguji dengan di luar jaringan. Pilihan saya adalah nmappemindaian UDP dari sistem di luar lingkungan Anda. Apa baris perintah nmap Anda? Apakah ada firewall perangkat keras atau perangkat lain dalam campuran?

putih
sumber
1

Saya memiliki pendekatan yang berpikiran sederhana. Jika server UDP tidak mengembalikan data yang diharapkan, saya hanya berhenti mengumpulkan dgram, dengan asumsi itu turun:

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
sumber