Menggunakan bash's `/ dev / udp`, bagaimana saya tahu jika port terbuka?

14

Saya tidak memiliki akses ke netcatatau nmapjadi saya mencoba untuk menggunakan bashdan /dev/udp/file khusus untuk menguji port.

Saya bisa melakukan sesuatu seperti:

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

Namun $?selalu 0saat menggunakan UDP. Saya berasumsi itu karena itu adalah nilai pengembalian dari echo ""perintah yang benar?

Saya pada dasarnya mencoba meniru apa yang dapat saya lakukan nmapdan netcat:

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

Bagaimana saya melakukan ini /dev/udp?

Belmin Fernandez
sumber
1
UDP tidak menjamin pengiriman, jadi meskipun bash berpikir itu berhasil mengirim pesan, pesan mungkin telah dihancurkan di jalan. Bagaimana Anda menguji pengiriman yang gagal (bukan koneksi yang tidak berhasil: UDP bukan koneksi)?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

13

Untuk tcp, cukup periksa $?. Jika koneksi gagal, $?tidak akan 0:

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

Perlu waktu untuk bashmenyadari bahwa koneksi gagal. Anda dapat menggunakan batas waktu untuk memicu bash:

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

Menguji port udp lebih kompleks.

Sebenarnya, tidak ada keadaan terbuka (tentu saja, udp adalah protokol stateless ) dengan udp. Hanya ada dua negara dengan udp, mendengarkan atau tidak . Jika tidak , Anda akan mendapatkan ICMP Destination Unreachable .

Sayangnya, firewall atau router sering menjatuhkan paket-paket ICMP tersebut, sehingga Anda tidak akan yakin apa port udpnya.

cuonglm
sumber
Pertanyaan saya diulang kembali untuk fokus pada UDP. Permintaan maaf saya untuk hasil edit ninja. Saya pikir itu akan serupa sehingga tidak membuat perbedaan. Terima kasih sudah membereskannya.
Belmin Fernandez
10

Secara umum, Anda tidak bisa.

Tidak seperti TCP, UDP tidak terhubung. Anda tidak dapat mendeteksi bahwa port terbuka hanya dengan membuat koneksi do-nothing ke sana seperti yang Anda bisa dengan TCP. Sebaliknya, Anda perlu mengirim data ke pelabuhan dan melihat apa yang terjadi, dan detail UDP seperti yang diterapkan di dunia nyata mempersulit penafsiran hasil. Bahkan alat tingkat paket canggih seperti nmaptidak bisa memastikan apakah ada program mendengarkan port UDP yang diberikan. nmapmengklasifikasikan port UDP menjadi tiga grup:

  1. Terbuka pasti. Mengirim paket ke port menimbulkan respons data dari mesin tujuan.
  2. Pasti tertutup. Mengirim paket ke port akan memunculkan pesan "ICMP Destination Unreachable" dari mesin tujuan.
  3. Terbuka atau difilter. Mengirim paket ke port tidak menimbulkan respons apa pun. Mungkin ada firewall yang menjatuhkan paket; mungkin ada program yang mendengarkan dan nmapbelum menemukan cara untuk mendapatkan respons; mungkin pengguna hanya beruntung dan semua paket hilang dalam perjalanan.
Menandai
sumber
Informasi hebat tentang nmap. Terima kasih, ini menjelaskan banyak kebingungan.
Belmin Fernandez