Bagaimana netcat tahu jika port UDP terbuka?

49

Jadi saya bisa menggunakan perintah netcat ini untuk memeriksa apakah port UDP terbuka:

$  nc -vz -u 10.1.0.100 53
Connection to 10.1.0.100 53 port [udp/domain] succeeded!

Tidak seperti TCP, UDP adalah koneksi (api dan lupakan) Jadi pada level tinggi, adakah yang tahu bagaimana netcat mengetahui port UDP terbuka? Apakah itu meminta balasan atau sesuatu seperti itu?

Patrick McMahon
sumber

Jawaban:

17

Menilai dari output spesifik yang Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!Anda gunakan openbsd-netcat.

Melihat kode untuk tes itu adalah untuk mengikat ke soket UDP, yaitu ada koneksi terbuka:

              if (vflag || zflag) {
                            /* For UDP, make sure we are connected. */
                            if (uflag) {
                                    if (udptest(s) == -1) {
                                            ret = 1;
                                            continue;
                                    }
                            }

                            /* Don't look up port if -n. */
                            if (nflag)
                                    sv = NULL;
                            else {
                                    sv = getservbyport(
                                        ntohs(atoi(portlist[i])),
                                        uflag ? "udp" : "tcp");
                            }

                            fprintf(stderr,
                                "Connection to %s %s port [%s/%s] "
                                "succeeded!\n", host, portlist[i],
                                uflag ? "udp" : "tcp",
                                sv ? sv->s_name : "*");

masalah udptest sekitar 3 menulis ke soket terbuka. Ada catatan bahwa ini tidak berfungsi untuk IPv6 dan gagal setelah sekitar 100 port diperiksa.

Jadi, sementara saran lain mungkin valid, saya tidak berpikir itu terjadi dalam kasus khusus ini.

berbatu
sumber
begitu udptestjuga fungsi yang saya cari dan itu menjawab pertanyaan saya. Dari tautan yang Anda berikan "* udptest () * Lakukan beberapa penulisan untuk melihat apakah port UDP ada di sana"
Patrick McMahon
Ya, saya baru memeriksa dan melihat tulisannya juga. Jawaban yang direvisi.
berbatu
@ PatrickMcMahon - jika ini menjawab pertanyaan Anda, maka terima dengan mengklik tanda centang besar.
cas
17

Sebenarnya tidak. Anda dapat memeriksa dengan melakukan:

$ nc -vz -u 8.8.8.8 53 
Connection to 8.8.8.8 53 port [udp/domain] succeeded!
$ nc -vz -u 8.8.8.8 54
Connection to 8.8.8.8 54 port [udp/*] succeeded!
$ nc -vz -u 8.8.8.8 59
Connection to 8.8.8.8 59 port [udp/*] succeeded!
$ 

Jadi dengan UDP, itu bukan sesuatu yang benar-benar dapat Anda periksa kecuali itu akan memberi Anda informasi kembali.

Sandri_Nenes
sumber
9

Ada pesan ICMP untuk mengisyaratkan bahwa port, bahkan port UDP, ditutup. Jadi, jika tuan rumah mengirim pesan ini maka port dapat dianggap ditutup.

https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable

phk
sumber
4
Perhatikan bahwa karena UDP tidak terhubung, Anda tidak dapat membedakan port terbuka dari port firewall dengan andal dari paket yang hilang.
Tandai
Sangat benar. Dan secara teori itu juga mungkin bahwa Anda mendapatkan paket dan port tidak benar-benar tertutup.
phk
9

Yah saya punya pendapat berbeda:

a:~# nc -luk 10.12.0.12 667 // listen on UDP port 667
b:~# nc -uv 10.12.0.12 667  // check if port is open 
nc: 10.12.0.12 (10.12.0.12) 667 [667] open
I love stackexchange // send a message
a:~# nc -luk 10.12.0.12 667
I love stackexchange // receive the message.

Jadi berdasarkan itu, Anda dapat memeriksa apakah koneksi antara a dan b pada port udp itu mungkin. Kemudian Anda dapat melanjutkan memeriksa menggunakan tcpdump.

crashoverbike
sumber
1
Ah ya saya suka ini. Ini cara yang baik untuk menguji apakah Anda memiliki akses ke kedua node. Saya kira ketika saya mengajukan pertanyaan saya mengarahkan ke "bagaimana menguji kotak hitam" atau menyelidiki sebuah node eksternal. Hasil dari melakukan hal itu, netcat tidak dapat menjamin.
Patrick McMahon
Bisakah Anda memperluas alamat IP 10.12.0.12? Mengapa digunakan di kedua komputer?
Sopalajo de Arrierez