سؤال اختبار إذا كان يمكن الوصول إلى منفذ على نظام بعيد (بدون telnet)


في الايام الخوالي ، استخدمنا telnet لمعرفة ما إذا كان المنفذ على مضيف بعيد مفتوحًا: telnet hostname port سيحاول الاتصال بأي منفذ على أي مضيف ويتيح لك الوصول إلى دفق TCP الخام.

في هذه الأيام ، لا يتم تثبيت telnet على الأنظمة التي أعمل عليها (لأسباب تتعلق بالأمان) ، ويتم حظر جميع الاتصالات الصادرة لجميع المضيفات بشكل افتراضي. بمرور الوقت ، من السهل أن تفقد أي منافذ مفتوحة للمضيفين.

هل هناك طريقة أخرى لاختبار ما إذا كان منفذ على نظام بعيد مفتوحًا - باستخدام نظام Linux مع عدد محدود من الحزم المثبتة ، و telnet غير متاح؟


272
2017-07-19 16:54


الأصل


ذات صلة: تحقق من حالة منفذ واحد على المضيف البعيد في SO - kenorb


الأجوبة:


استطاعت باش الوصول إليها TCP و UDP المنافذ لفترة من الوقت. من صفحة الرجل:

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

لذلك يمكنك استخدام شيء كهذا:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

تا داع!


228
2017-07-22 10:37



هذا يبدو أيضا للعمل في مينغو. على سبيل المثال ، جهاز تحكم عن بعد VNC يستجيب الخادم على 192.168.2.100 بـ "RFB 003.008" باستخدام "cat </dev/tcp/192.168.2.100/5900". - Peter Mortensen
ولكن على المنافذ التي لم تكن مفتوحة ، انقضت المهلة الزمنية بعد 22 ثانية (تمت تجربتها في أوبونتو 14.04 (Trusty طاهر) لخادم بعيد). ومن المثير للاهتمام ، فإن فترة المهلة أقصر بكثير من فترة nc (انظر جواب thnee). - Peter Mortensen
lornix ، حسنا ، ولكن في هذه الحالة لا بد لي من الحصول على نفس النتيجة مع استخدام NC بدون خيار -z ، لكنه لا يزال لا يعمل: # nc -v -w5 127.0.0.1 18080 الاتصال بمنفذ 127.0.0.1 18080 [tcp / *] نجحت! # cat </dev/tcp/127.0.0.1/18080 فقط توقف دون أي نتيجة. فقط أريد أن أفهم متى يمكنني استخدام خيار "/ dev / tcp / host / port" - Alexandr
@ الكسندر ... في الواقع ، "معلقة دون أي نتيجة" هو السلوك المتوقع إلى حد كبير. قط ينتظر المدخلات. نورث كارولاينا لديه ذكاء إضافي لتمكينه من الشعور بعدم وجود بيانات معلقة ويتوقف عن المحاولة. قط ليس الى حد كبير ذكية. محاولة cat < /dev/tcp/localhost/22، يجب عليك الحصول على رأس sshd الخاص بك. من الواضح أن عمليتك على المنفذ 18080 تنتظر وصول شيء ما قبل إرسال أي شيء. المنفذ 22 (سه) تحييكم مع إصدارها و whatnot. حاول! - lornix
@ lornix ، شكرًا جزيلاً على الشرح! الآن التقييد واضح. أعتقد أن استخدام nc يجب أن يكون طريقة مفضلة للتحقق من المنافذ. - Alexandr


لطيفة و مطمئنة! من صفحات الرجل.
منفذ واحد:

nc -zv 127.0.0.1 80

منافذ متعددة:

nc -zv 127.0.0.1 22 80 8080

نطاق من المنافذ:

nc -zv 127.0.0.1 20-30

319
2017-12-03 21:34



يبدو أنه أفضل إجابة ، شكراً. ؛-) - lpapp
هذا شنق عندما حاول على أوبونتو 14.04 (Trusty Tahr) لخادم بعيد (نفس الشبكة المحلية) للمنافذ المغلقة (تنتهي المهلة بعد 127 ثانية) - وبالتالي فهي ليست مناسبة جدا في النصوص. انها تعمل على الرغم من الخدمة التي كان لها منفذ مفتوح. يمكن أن يكون استخدام الخيار "-w2" هو الحل. - Peter Mortensen
استخدم خيار -u لمنافذ UDP. - Efren
في الإصدار 6.4 من ncat -z لم يتم التعرف عليه. كنت قادرا على الاستغناء عن z - smishra
يمكنك التحقق من نطاقات متعددة بما يلي: nc -zv 127.0.0.1 22,80,8080,20-30,443-446 (nc Version: 1.107-4). - bobbel


يعد netcat أداة مفيدة:

nc 127.0.0.1 123 &> /dev/null; echo $?

سوف الناتج 0 إذا كان منفذ 123 مفتوحًا و 1 إذا كان مغلقًا.


96
2017-07-19 18:07



هذه إجابة أكثر أناقة وكتبية من جوابي. من المؤسف بالنسبة لي أن sysadmins الوعي الأمني ​​الذي حجب telnet كما تم حجبها nc (على الرغم من - الغريب - لا curlأو wget). - Steve HHH
نعم هذا هو التعسفي وسخيفة تماما. - thnee
السماح لل FOR البيانات تبدأ! - Chad Harrison
هذا شنق عندما حاول على أوبونتو 14.04 (Trusty Tahr) لخادم بعيد (نفس الشبكة المحلية) للمنافذ المغلقة (تنتهي المهلة بعد حوالي 127 ثانية) - وبالتالي فهي ليست مناسبة جدا في النصوص. عمل على الرغم من أن الخدمة التي كان لها منفذ مفتوح ، والعودة 0. يمكن أن يكون استخدام الخيار "-w2" الحل. - Peter Mortensen
أعتقد -G 2 سيكون أكثر ملاءمة لـ TCP مهلة - A B


أبسط طريقة ، دون استخدام أداة أخرى ، مثل socat، كما هو موضح في الإجابة على @ lornix أعلاه. هذا فقط لإضافة مثال فعلي لكيفية استخدام جهاز psuedo /dev/tcp/... داخل Bash إذا أردت ، على سبيل المثال ، اختبار ما إذا كان هناك خادم آخر لديه منفذ معين يمكن الوصول إليه عبر سطر الأوامر.

أمثلة

قل لدي مضيف على شبكتي المسماة skinner.

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

السبب الذي تريد أن تلتف echo > /dev/... بين قوسين مثل هذا ، (echo > /dev/...) لأنه إذا لم تفعل ذلك ، فستظهر لك هذه الأنواع من الرسائل عند إجراء اختبارات على الاتصالات.

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

لا يمكن ببساطة إعادة توجيه هذه إلى /dev/null لأنهم قادمون من محاولة كتابة البيانات إلى الجهاز /dev/tcp. لذا نأخذ كل هذا الناتج ضمن أمر فرعي ، بمعنى ، (...cmds...) وإعادة توجيه إخراج الأمر الفرعي.


51
2017-09-02 17:59



هذا ممتاز. أتمنى أن يتم التصويت عليها حتى القمة. أقرأ هذا فقط أسفل الصفحة لأنني التمرير بطريق الخطأ قبل إغلاقه. - Still.Tony
@ Okuma.Tony - نعم هذا هو دائما مشكلة مع Q التي لديها العديد من الإجابات 8-). شكرا على ردود الفعل على الرغم من ذلك ، عن تقديره. - slm


لقد وجدت ذلك curl قد تنجز المهمة بنفس الطريقة telnetو curl سيخبرك حتى أي بروتوكول يتوقع المستمع.

بناء HTTP URI من اسم المضيف والمنفذ باعتبارها الوسيطة الأولى ل curl. إذا curl يمكن الاتصال ، فإنه سيتم الإبلاغ عن عدم تطابق البروتوكول والخروج (إذا لم يكن المستمع خدمة ويب). إذا curl لا يمكن الاتصال ، وسوف مهلة.

على سبيل المثال ، المنفذ 5672 على المضيف 10.0.0.99 إما مغلق أو محجوب بواسطة جدار حماية:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

ومع ذلك ، من نظام مختلف ، يمكن الوصول إلى المنفذ 5672 على المضيف 10.0.0.99 ، ويبدو أنه يقوم بتشغيل وحدة إصغاء AMQP.

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

من المهم التمييز بين الرسائل المختلفة: الفشل الأول كان بسبب ذلك curl لا يمكن الاتصال بالميناء. الفشل الثاني هو اختبار النجاح ، على الرغم من curl المتوقع مستمع HTTP بدلا من مستمع AMQP.


36
2017-07-19 17:05



إذا لم يكن curl متاحًا ، فقد يكون wget. wget -qS -O- http://ip.add.re.ss:port يجب أن تفعل نفس الشيء بشكل فعال. - α CVn
هذا يعمل حتى مع اسم مضيف ، على سبيل المثال. curl myhost:22. - 에이바
قد يكون هذا غير صحيح. أنا havng خدمة هر تشغيل ، ولكن الحصول على خطأ 404. # curl -k 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34 - تقرير الخطأ </ title> <style> <! - H1 --- HR {color: # 525D76؛} -> </ style> </ head> <body> <h1> حالة HTTP 404 - / </ h1> <HR size = "1" noshade = "noshade"> <p> <b> اكتب </ b> تقرير الحالة </ p> <p> <b> رسالة </ b> <u> / </ u> </ p> <p> <b> الوصف </ b> <u> المورد المطلوب غير متوفر. </ u> </ p> < HR size = "1" noshade = "noshade"> <h3> Apache Tomcat / 7.0.34 </ h3> </ body> </ html> - Mohammad Shahid Siddiqui
انظر بريد مع نهج مماثل. - kenorb


[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

نأمل أن يحل مشكلتك :)


8
2018-06-02 06:27



نعم ، هذا أفضل - توقيت على الفور تقريبا للموانئ المغلقة. - Peter Mortensen
هل هذا دائمًا ما يستخدم بروتوكول TCP أو هل هناك طريقة للحصول عليه للتحقق من UDP؟ - kmoe


وهنا واحد الخطوط الملاحية المنتظمة:

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

باستخدام بناء جملة باش الموضح في ردًا علىlornix.

لمزيد من المعلومات ، تحقق من: دليل Bash-Scripting المتقدم: الفصل 29. /dev و /proc.


7
2018-03-16 11:21





كنت أكافح من أجل يوم كامل لأن أيا من هذه الإجابات بدا أنه يعمل من أجلي. المشكلة هي أن أحدث نسخة من nc لم يعد لديه -z في حين أن الوصول المباشر عبر TCP (كما هو الحال معlornix وslm) يفشل عندما لا يمكن الوصول إلى المضيف. وجدت في النهاية هذه الصفحة، حيث وجدت في النهاية لا أحد ولكن اثنان أمثلة العمل:

  1. nc -w1 127.0.0.1 22 </dev/null

    (ال -w العلم يعتني المهلة ، و </dev/null يستبدل -z العلم)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    (ال timeout يعتني الأمر بالمهلة ، والباقي منslm)

ثم ، ببساطة استخدام && و / أو || (او حتى $?) لاستخراج النتيجة. نأمل أن يجد شخص ما هذه المعلومات مفيدة.


6
2018-05-31 08:45