nc — اتصالات TCP و UDP عشوائية والاستماع
ملخص
nc [-46bCDdFhklNnrStUuvZz] [-I length] [-i interval] [-M ttl] [-m minttl] [-O length]
[-P proxy_username] [-p source_port] [-q seconds] [-s sourceaddr] [-T keyword] [-V rtable]
[-W recvlimit] [-w timeout] [-X proxy_protocol] [-x proxy_address[:port]] [destination] [port]
الوصف
تستخدم أداة nc (أو netcat) في أي شيء تقريبًا يتعلق بـ TCP أو UDP أو مآخذ توصيل Unix. يمكنها فتح اتصالات TCP وإرسال حزم UDP والاستماع على منافذ TCP و UDP عشوائية وإجراء مسح المنافذ والتعامل مع كل من IPv4 و IPv6. على عكس telnet(1)، فإن nc تعمل بشكل جيد في البرامج النصية، وتفصل رسائل الخطأ إلى الخطأ القياسي بدلاً من إرسالها إلى الإخراج القياسي، كما تفعل telnet(1) في بعض الحالات.
تشمل الاستخدامات الشائعة:
وكلاء TCP بسيطة
عملاء وخوادم HTTP تعتمد على البرامج النصية
اختبار خادم الشبكة
وكيل SOCKS أو HTTP لـ [ssh]({filename}../../ssh)(1)
وأكثر من ذلك بكثير
الخيارات هي كما يلي:
-4 استخدام عناوين IPv4 فقط.
-6 استخدام عناوين IPv6 فقط.
-b السماح بالبث.
-C إرسال CRLF كنهاية سطر. يتم ترجمة كل حرف سطر تغذية (LF) من بيانات الإدخال إلى CR+LF قبل كتابتها في مأخذ التوصيل. لا يتم ترجمة أحرف السطر التغذية التي يسبقها بالفعل حرف إرجاع (CR). البيانات المستلمة لا تتأثر.
-D تمكين التصحيح على مأخذ التوصيل.
-d لا تحاول القراءة من stdin.
-F تمرير مأخذ التوصيل المتصل الأول باستخدام sendmsg(2) إلى stdout والخروج. هذا مفيد
بالاشتراك مع -X لجعل nc تقوم بإعداد الاتصال باستخدام وكيل ثم تترك
بقية الاتصال لبرنامج آخر (على سبيل المثال، [ssh]({filename}../../ssh)(1) باستخدام ssh_config(5)
خيار ProxyUseFdpass). لا يمكن استخدامه مع -U.
-h اطبع نص تعليمات nc واخرج.
-I length
حدد حجم مخزن TCP.
-i interval
توقف لمدة فاصل ثوانٍ بين أسطر النص المرسلة والمستقبلة. يؤدي أيضًا إلى حدوث تأخير
الوقت بين الاتصالات بمنافذ متعددة.
-k عند اكتمال الاتصال، استمع إلى اتصال آخر. يتطلب -l. عند استخدامه معًا
مع خيار -u، لا يتم توصيل مأخذ التوصيل الخاص بالخادم ويمكنه استقبال حزم UDP
من مضيفين متعددين.
-l استمع إلى اتصال وارد بدلاً من بدء اتصال بمضيف بعيد.
يمكن تحديد الوجهة والمنفذ الذي سيتم الاستماع إليه إما كحجج غير اختيارية،
أو باستخدام الخيارات -s و -p على التوالي. لا يمكن استخدامه مع -x أو -z. بالإضافة إلى ذلك، أي مهلات محددة باستخدام الخيار -w يتم تجاهلها.
-M ttl عيّن قيمة TTL / الحد الأقصى للقفزات للحزم الصادرة.
-m minttl
اطلب من النواة إسقاط الحزم الواردة التي تكون قيمة TTL / الحد الأقصى للقفزات فيها أقل من minttl.
-N [shutdown]({filename}../../shutdown)(2) مقبس الشبكة بعد انتهاء الإدخال. تتطلب بعض الخوادم هذا لإكمال عملها.
-n لا تقم بإجراء تحليل اسم المجال. إذا تعذر تحليل اسم بدون DNS، فسيتم الإبلاغ عن خطأ.
-O length
حدد حجم مخزن إرسال TCP.
-P proxy_username
يحدد اسم المستخدم الذي سيتم تقديمه لخادم وكيل يتطلب المصادقة. إذا لم يتم تحديد اسم مستخدم، فلن يتم إجراء المصادقة. تدعم مصادقة الوكيل فقط وكلاء HTTP CONNECT في الوقت الحالي.
-p source_port
حدد منفذ المصدر الذي يجب أن يستخدمه nc، مع مراعاة القيود المتعلقة بالصلاحيات والتوافر.
-q seconds
بعد انتهاء الإدخال من stdin، انتظر العدد المحدد من الثواني ثم قم بالإنهاء. إذا كانت الثواني سالبة، فانتظر إلى الأبد (افتراضي). تحديد عدد غير سالب من الثواني يعني تضمين الخيار -N.
-r اختر منافذ المصدر و/أو الوجهة بشكل عشوائي بدلاً من اختيارها بشكل تسلسلي ضمن نطاق أو بالترتيب الذي يعينه النظام.
-S قم بتمكين خيار توقيع TCP MD5 الخاص بـ RFC 2385.
-s sourceaddr
عيّن عنوان المصدر لإرسال الحزم منه، وهو أمر مفيد على الأجهزة التي تحتوي على واجهات متعددة. بالنسبة لمقابس البيانات النطاقية لنظام Unix، يحدد ملف مقبس مؤقت محلي لإنشائه واستخدامه بحيث يمكن استقبال البيانات. لا يمكن استخدامه مع الخيار -x.
-T keyword
غيّر قيمة IPv4 TOS / فئة حركة مرور IPv6. يمكن أن تكون الكلمة المفتاحية واحدة من critical أو inetcontrol أو lowcost أو lowdelay أو netcontrol أو throughput أو reliability، أو واحدة من نقاط كود DiffServ: ef، af11 ... af43، cs0 ... cs7؛ أو رقم إما عشري أو سداسي عشري.
-t أرسل استجابات RFC 854 DON'T و WON'T لطلبات RFC 854 DO و WILL. هذا يتيح استخدام nc لإنشاء نصوص برمجية لجلسات telnet.
-U استخدم مقابس نظام Unix. لا يمكن استخدامه مع الخيارين -F أو -x. على نظام Linux، إذا بدأ الاسم برمز @، فسيتم تفسيره على أنه مقبس مساحة اسم مجرد: يتم استبدال الرمز @ الأولي ببايت NULL قبل الربط أو الاتصال. للحصول على التفاصيل، راجع unix(7).
-u استخدم UDP بدلاً من TCP. لا يمكن استخدامه مع الخيار -x. بالنسبة لمقابس نظام Unix، استخدم مقبس بيانات بدلاً من مقبس تدفق. إذا تم استخدام مقبس نظام Unix، فسيتم إنشاء مقبس استقبال مؤقت في /tmp ما لم يتم تحديد الخيار -s.
-V rtable
عيّن جدول التوجيه الذي سيتم استخدامه.
-v أنتج المزيد من المخرجات المفصلة.
-W recvlimit
أنهِ بعد استقبال recvlimit من الحزم من الشبكة.
-w timeout
تنتهي الاتصالات التي لا يمكن إنشاؤها أو تكون في وضع الخمول بعد timeout ثانية. الخيار -w ليس له تأثير على الخيار -l، أي سيستمع nc إلى الأبد للاتصال، مع أو بدون الخيار -w. الافتراضي هو عدم وجود مهلة.
-X proxy_protocol
استخدم proxy_protocol عند التواصل مع خادم الوكيل. البروتوكولات المدعومة هي 4 (SOCKS 4، و4A (SOCKS v.4A)، و5 (SOCKS v.5) و connect (وكيل HTTPS). إذا لم يتم تحديد البروتوكول، فسيتم استخدام إصدار SOCKS 5. لاحظ أن بروتوكول SOCKS v.4 محدود للغاية ولا يمكن استخدامه إلا عندما يمكن حل اسم المضيف الوجهة إلى عنوان IPv4. تمرر البروتوكولات الأخرى الوجهة كسلسلة ليتم تفسيرها بواسطة الوكيل البعيد ولا يوجد لديها هذا القيد.
-x proxy_address[:port]
اتصل بالوجهة باستخدام وكيل في proxy_address والمنفذ. إذا لم يتم تحديد المنفذ، فسيتم استخدام المنفذ المعروف للبروتوكول الوكيل (1080 لـ SOCKS، و3128 لـ HTTPS). يمكن تحديد عنوان IPv6 بشكل لا لبس فيه عن طريق إحاطة proxy_address بأقواس مربعة. لا يمكن استخدام الوكيل مع أي من الخيارات -lsuU.
-Z
وضع DCCP.
-z
امسح فقط البرامج الخادمة التي تستمع، دون إرسال أي بيانات إليها. لا يمكن استخدامه مع الخيار `-l`.
يمكن أن تكون الوجهة عنوان IP رقمي أو اسم مضيف رمزي (إلا إذا تم إعطاء الخيار -n). بشكل عام، يجب تحديد وجهة، إلا إذا تم إعطاء الخيار -l (في هذه الحالة يتم استخدام المضيف المحلي). بالنسبة لمآخذ التوصيل الخاصة بنظام Unix، تكون الوجهة مطلوبة وهي مسار مأخذ التوصيل المراد الاتصال به (أو الاستماع إليه إذا تم إعطاء الخيار -l).
يمكن تحديد المنفذ كعدد منفذ رقمي أو كاسم خدمة. يمكن تحديد نطاقات المنافذ كأرقام منافذ رقمية على شكل nn-mm. بشكل عام، يجب تحديد منفذ الوجهة، إلا إذا تم إعطاء الخيار -U. بالنسبة لبعض الخيارات، يطلب الخيار 0 أن يختار النظام رقم منفذ.
نموذج العميل/الخادم
من السهل بناء نموذج عميل/خادم أساسي باستخدام nc. في وحدة تحكم واحدة، ابدأ تشغيل nc للاستماع على منفذ معين للاتصال. على سبيل المثال:
$ nc -l 1234
الآن يستمع nc على المنفذ 1234 للاتصال. في وحدة تحكم ثانية (أو جهاز ثانٍ)، اتصل بالجهاز والمنفذ الذي يتم الاستماع إليه:
$ nc -N 127.0.0.1 1234
يجب أن يكون هناك الآن اتصال بين المنافذ. أي شيء يتم كتابته في وحدة التحكم الثانية سيتم إلحاقه بالأولية، والعكس صحيح. بعد إنشاء الاتصال، لا يهتم nc حقًا بأي من الجانبين يتم استخدامه كـ "خادم" وأي منهما يتم استخدامه كـ "عميل". يمكن إنهاء الاتصال باستخدام EOF ("^D")، نظرًا لوجود علامة -N.
لا يوجد خيار -c أو -e في netcat هذا، ولكن لا يزال بإمكانك تنفيذ أمر بعد إنشاء الاتصال عن طريق إعادة توجيه واصفات الملفات. كن حذرًا هنا لأنه فتح منفذ والسماح لأي شخص بالاتصال وتنفيذ أمر عشوائي على موقعك أمر خطير. إذا كنت بحاجة حقًا إلى القيام بذلك، فإليك مثال:
على جانب "الخادم":
$ rm -f /tmp/f; mkfifo /tmp/f
$ cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
على جانب "العميل":
$ nc host.example.com 1234
$ (موجه الأوامر من host.example.com)
بفعل ذلك، تقوم بإنشاء ملف FIFO في /tmp/f وتجعل nc يستمع على المنفذ 1234 من العنوان 127.0.0.1 في "الجانب الخادمي"، عندما يقوم "العميل" بإنشاء اتصال بنجاح بهذا المنفذ، يتم تنفيذ الأمر /bin/sh في "الجانب الخادمي" ويتم إعطاء موجه الأوامر إلى "جانب العميل".
عندما يتم إنهاء الاتصال، سينتهي تشغيل nc أيضًا. استخدم الخيار -k إذا كنت تريد أن يستمر في الاستماع، ولكن إذا انتهى تشغيل الأمر، فلن يقوم هذا الخيار بإعادة تشغيله أو إبقاء nc قيد التشغيل. أيضًا، لا تنسَ إزالة ملف الواصف بمجرد عدم الحاجة إليه بعد الآن:
$ rm -f /tmp/f
نقل البيانات
يمكن توسيع المثال في القسم السابق لإنشاء نموذج أساسي لنقل البيانات. أي معلومات يتم إدخالها في أحد طرفي الاتصال ستظهر في الطرف الآخر، ويمكن بسهولة التقاط الإدخال والإخراج لمحاكاة نقل الملفات.
ابدأ باستخدام nc للاستماع على منفذ معين، مع التقاط الإخراج في ملف:
$ nc -l 1234 > filename.out
باستخدام جهاز ثانٍ، اتصل بعملية nc التي تستمع إليه، وقم بتزويدها بالملف الذي سيتم نقله:
$ nc -N host.example.com 1234 < filename.in
بعد نقل الملف، سيتم إغلاق الاتصال تلقائيًا.
التواصل مع الخوادم
في بعض الأحيان، يكون من المفيد التواصل مع الخوادم "يدويًا" بدلاً من ذلك من خلال واجهة المستخدم. يمكن أن يساعد هذا في استكشاف الأخطاء وإصلاحها، عندما قد يكون من الضروري التحقق من البيانات التي يرسلها الخادم استجابةً للأوامر الصادرة من العميل. على سبيل المثال، لاسترداد الصفحة الرئيسية لموقع ويب:
$ printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
لاحظ أن هذا يعرض أيضًا الرؤوس التي يرسلها خادم الويب. يمكن تصفيتها، باستخدام أداة مثل sed(1)، إذا لزم الأمر.
يمكن إنشاء أمثلة أكثر تعقيدًا عندما يعرف المستخدم تنسيق الطلبات المطلوبة من الخادم. كمثال آخر، يمكن إرسال بريد إلكتروني إلى خادم SMTP باستخدام:
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM:<_>
RCPT TO:<_>
DATA
نص البريد الإلكتروني.
.
QUIT
EOF
فحص المنافذ
قد يكون من المفيد معرفة المنافذ المفتوحة والخدمات قيد التشغيل على الجهاز المستهدف. يمكن استخدام العلامة -z لإخبار nc بالإبلاغ عن المنافذ المفتوحة، بدلاً من بدء اتصال. عادةً ما يكون من المفيد تشغيل إخراج مطول إلى stderr باستخدام هذا الخيار بالاشتراك مع الخيار -v.
على سبيل المثال:
$ nc -zv host.example.com 20-30
تم إنشاء الاتصال بـ host.example.com 22 منفذ [tcp/ssh] بنجاح!
تم إنشاء الاتصال بـ host.example.com 25 منفذ [tcp/smtp] بنجاح!
تم تحديد نطاق المنافذ للحد من البحث إلى المنافذ 20 - 30، ويتم مسحه بالترتيب التصاعدي (إلا إذا تم تعيين العلامة -r).
يمكنك أيضًا تحديد قائمة بالمنافذ المراد فحصها، على سبيل المثال:
$ nc -zv host.example.com http 20 22-23
فشل nc: الاتصال بـ host.example.com 80 (tcp): تم رفض الاتصال
فشل nc: الاتصال بـ host.example.com 20 (tcp): تم رفض الاتصال
تم إنشاء الاتصال بـ host.example.com منفذ [tcp/ssh] بنجاح!
فشل nc: الاتصال بـ host.example.com 23 (tcp): تم رفض الاتصال
يتم فحص المنافذ بالترتيب الذي تحدده (إلا إذا تم تعيين العلامة -r).
بدلاً من ذلك، قد يكون من المفيد معرفة برنامج الخادم الذي يعمل، والإصدارات الخاصة به. غالبًا ما تحتوي هذه المعلومات على تحيات البانر. من أجل استردادها، من الضروري أولاً إجراء اتصال، ثم قطع الاتصال عندما يتم استرداد البانر. يمكن تحقيق ذلك عن طريق تحديد مهلة زمنية قصيرة باستخدام العلامة -w، أو ربما عن طريق إصدار الأمر "QUIT" للخادم:
$ echo "QUIT" | nc host.example.com 20-30
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
220host.example.com IMS SMTP Receiver Version 0.84 Ready
أمثلة
افتح اتصال TCP بالمنفذ 42 من host.example.com، باستخدام المنفذ 31337 كمنفذ مصدر، مع مهلة زمنية قدرها 5 ثوانٍ:
$ nc -p 31337 -w 5 host.example.com 42
افتح اتصال UDP بالمنفذ 53 من host.example.com:
$ nc -u host.example.com 53
افتح اتصال TCP بالمنفذ 42 من host.example.com باستخدام 10.1.2.3 كعنوان IP للطرف المحلي من الاتصال:
$ nc -s 10.1.2.3 host.example.com 42
أنشئ واستمع على مقبس Unix-domain stream:
$ nc -lU /var/tmp/dsocket
اتصل بالمنفذ 42 من host.example.com عبر خادم وكيل HTTP في 10.2.3.4، المنفذ 8080. يمكن أيضًا استخدام هذا المثال بواسطة ssh(1)؛ راجع توجيه ProxyCommand في ssh_config(5) لمزيد من المعلومات.
$ nc -x10.2.3.4:8080 -Xconnect host.example.com 42
نفس المثال مرة أخرى، هذه المرة مع تمكين مصادقة الوكيل باستخدام اسم المستخدم "ruser" إذا كان الوكيل يتطلب ذلك:
$ nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
انظر أيضًا
المؤلفون
التنفيذ الأصلي بواسطة *Hobbit* <_>. تمت إعادة كتابته مع دعم IPv6 بواسطة Eric Jackson <_>. تم تعديله لمنفذ Debian بواسطة Aron Xu ⟨_⟩.
تحذيرات
ستبلغ عمليات فحص منافذ UDP باستخدام مجموعة العلامات -uz دائمًا عن النجاح بغض النظر عن حالة الجهاز المستهدف. ومع ذلك، جنبًا إلى جنب مع محلل حركة المرور إما على الجهاز المستهدف أو جهاز وسيط، يمكن أن تكون مجموعة العلامات -uz مفيدة لتشخيص الاتصالات. لاحظ أن كمية حركة مرور UDP التي يتم إنشاؤها قد تكون محدودة إما بسبب موارد الأجهزة و/أو إعدادات التكوين.