Di masa lalu, kami biasa telnet
melihat apakah port pada host jarak jauh terbuka: telnet hostname port
akan mencoba untuk terhubung ke port mana saja pada host apa pun dan memberi Anda akses ke aliran TCP mentah.
Saat ini, sistem yang saya gunakan tidak menginstal telnet (untuk alasan keamanan), dan semua koneksi keluar ke semua host diblokir secara default. Seiring waktu, mudah untuk kehilangan jejak port mana yang terbuka untuk host mana.
Apakah ada cara lain untuk menguji apakah port pada sistem jarak jauh terbuka - menggunakan sistem Linux dengan sejumlah paket yang diinstal, dan telnet
tidak tersedia?
linux
networking
port
Steve HHH
sumber
sumber
brew install telnet
. Jadi saya berharap pengguna Linux dapat melakukan hal yang sama denganyum
danapt-get
.Jawaban:
Bash telah dapat mengakses port TCP dan UDP untuk sementara waktu. Dari halaman manual:
Jadi Anda bisa menggunakan sesuatu seperti ini:
Taa Daa!
sumber
cat < /dev/tcp/localhost/22
, Anda harus mendapatkan sshd header Anda. Jelas, proses Anda pada port 18080 menunggu sesuatu masuk, sebelum mengirim apa pun. Port 22 ( ssh ) menyambut Anda dengan versi itu dan yang lainnya. Cobalah!Bagus dan bertele-tele! Dari halaman manual.
Port tunggal:
Beberapa port:
Rentang port:
sumber
nc -zv 127.0.0.1 22,80,8080,20-30,443-446
(Versi nc: 1.107-4).Netcat adalah alat yang berguna:
nc 127.0.0.1 123 &> /dev/null; echo $?
Akan ditampilkan
0
jika port 123 terbuka, dan1
jika ditutup.sumber
telnet
juga ditahannc
(meskipun - anehnya - tidakcurl
atauwget
).FOR
pernyataan dimulai!-G 2
akan lebih tepat untuk batas waktu TCPMetode paling sederhana, tanpa menggunakan alat lain, seperti
socat
, adalah seperti yang dijelaskan dalam jawaban @ lornix di atas. Ini hanya untuk menambahkan contoh aktual tentang bagaimana seseorang menggunakan perangkat psuedo di/dev/tcp/...
dalam Bash jika Anda ingin, katakanlah, uji apakah server lain memiliki port tertentu yang dapat diakses melalui baris perintah.Contohnya
Katakanlah saya memiliki host di jaringan saya yang bernama
skinner
.Alasan Anda ingin membungkus
echo > /dev/...
dalam tanda kurung seperti ini,(echo > /dev/...)
adalah karena jika Anda tidak melakukannya, maka dengan tes koneksi yang menurun, Anda akan mendapatkan jenis pesan ini muncul.Ini tidak bisa hanya diarahkan
/dev/null
karena berasal dari upaya untuk menulis data ke perangkat/dev/tcp
. Jadi kami menangkap semua output dalam sub-perintah, yaitu(...cmds...)
dan mengarahkan ulang output dari sub-perintah.sumber
Saya menemukan bahwa
curl
mungkin menyelesaikan pekerjaan dengan cara yang samatelnet
, dancurl
bahkan akan memberi tahu Anda protokol yang diharapkan pendengar.Bangun HTTP URI dari hostname dan port sebagai argumen pertama
curl
. Jikacurl
dapat terhubung, itu akan melaporkan ketidakcocokan protokol dan keluar (jika pendengar bukan layanan web). Jikacurl
tidak dapat terhubung, itu akan habis.Misalnya, port 5672 pada host 10.0.0.99 ditutup atau diblokir oleh firewall:
Namun, dari sistem yang berbeda, port 5672 pada host 10.0.0.99 dapat dicapai, dan tampaknya menjalankan pendengar AMQP.
Sangat penting untuk membedakan antara pesan yang berbeda: kegagalan pertama adalah karena
curl
tidak dapat terhubung ke port. Kegagalan kedua adalah tes sukses, meskipuncurl
diharapkan pendengar HTTP bukan pendengar AMQP.sumber
wget -qS -O- http://ip.add.re.ss:port
harus secara efektif melakukan hal yang sama.curl myhost:22
.Semoga ini bisa menyelesaikan masalah Anda :)
sumber
Berikut ini adalah satu-liner:
menggunakan sintaks Bash yang dijelaskan dalam jawaban @lornix .
Untuk info lebih lanjut, periksa: Panduan Script Bash Lanjutan: Bab 29.
/dev
dan/proc
.sumber
Saya berjuang sepanjang hari karena tidak ada jawaban yang sepertinya cocok untuk saya. Masalahnya adalah bahwa versi terbaru dari
nc
tidak lagi memiliki-z
bendera, sedangkan akses langsung melalui TCP (sesuai dengan @lornix dan @slm) gagal ketika tuan rumah tidak dapat dijangkau. Saya akhirnya menemukan halaman ini , di mana saya akhirnya menemukan bukan hanya satu tapi dua contoh yang berfungsi:nc -w1 127.0.0.1 22 </dev/null
(
-w
Bendera mengurus batas waktu, dan</dev/null
menggantikan-z
bendera)timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(
timeout
perintah mengatur timeout, dan sisanya dari @slm)Kemudian, cukup gunakan
&&
dan / atau||
(atau bahkan$?
) untuk mengekstrak hasilnya. Semoga seseorang akan menemukan informasi ini berguna.sumber
Menggabungkan jawaban dari @kenorb dan @Aukukikuru Anda dapat menguji port terbuka / tertutup / firewall.
Pendekatan lain dengan curl untuk mencapai port apa pun
sumber
Berikut adalah fungsi yang akan memilih salah satu metode tergantung pada apa yang diinstal pada sistem Anda:
sumber
Seharusnya tidak tersedia di kotak Anda, tetapi coba dengan
nmap
.sumber
nmap
adalah alat yang baik, tetapi tidak tersedia di sistem ini. Daripada mengunduhnmap
, mengompilasinya, menginstalnya ke direktori home saya, lalu menyalinnya ke semua sistem lain, saya berharap menemukan cara menggunakan alat yang ada yang tersedia di sebagian besar instalasi Linux.untuk referensi, perluas jawaban @peperunas:
cara menggunakan nmap untuk menguji, adalah:
(contoh di atas menggunakan localhost untuk tujuan demonstrasi)
sumber
Jika Anda telah menguji lebih dari pada sistem Anda dapat menggunakan alat uji kami dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) untuk tugas-tugas tersebut. Anda dapat menentukan harapan Anda
dan uji harapan ini terhadap localhost atau terhadap host jarak jauh (terhubung dengan ssh). Untuk pengujian jarak jauh Anda harus menentukan target:
Anda dapat menjalankan tes dengan
java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
Di bawah tenda kami menggunakan netcat seperti yang diusulkan di atas ...
sumber