المقدمة
المقابس هي وسيلة لتمكين التواصل بين العمليات بين البرامج الجارية على خادم، أو بين البرامج الجارية على خوادم منفصلة. يعتمد التواصل بين الخوادم على مقابس الشبكة، التي تستخدم بروتوكول الإنترنت (IP) لتجميع ومعالجة إرسال واستقبال البيانات.
تشير مقابس الشبكة على الخوادم والعملاء على حد سواء إلى عنوان المقبس. يُعتبر العنوان مجموعة فريدة من نوع نقل مثل بروتوكول التحكم في النقل (TCP) أو بروتوكول بريد الخدمة (UDP)، وعنوان IP، ورقم المنفذ.
في هذا البرنامج التعليمي ستتعلم عن الأنواع المختلفة التالية من المقابس التي تستخدم للتواصل بين العمليات:
- مقابس التدفق، والتي تستخدم TCP كبروتوكول نقلها الأساسي
- مقابس البيانات المحدودة، والتي تستخدم UDP كبروتوكول نقلها الأساسي
- مقابس النطاق العاملي لنظام Unix، والتي تستخدم ملفات محلية لإرسال واستقبال البيانات بدلاً من واجهات الشبكة وحزم IP.
في كل قسم من هذا البرنامج التعليمي ستتعلم أيضًا كيفية تعداد أنواع المقابس المعنية على نظام Linux. ستفحص كل نوع من أنواع المقابس باستخدام مجموعة متنوعة من أدوات سطر الأوامر.
المتطلبات المسبقة
الأمثلة في هذا البرنامج التعليمي تم التحقق منها على خادم Ubuntu 20.04. يمكنك اتباع هذا البرنامج التعليمي باستخدام معظم توزيعات Linux الحديثة على جهاز كمبيوتر محلي أو خادم عن بعد، طالما كانت لديك النسخة المعادلة من كل من الأدوات المطلوبة مثبتة على توزيعتك.
للبدء باستخدام Ubuntu 20.04، ستحتاج إلى خادم واحد تم تكوينه باتباع دليل الإعداد الأولي لخادم Ubuntu 20.04 الخاص بنا.
سوف تحتاج أيضًا إلى عدد قليل من الحزم الأخرى لفحص المقابس على نظامك. تأكد من أن ذاكرة التخزين المؤقتة لحزم النظام محدثة باستخدام أمر apt update
:
ثم قم بتثبيت الحزم المطلوبة باستخدام هذا الأمر:
تحتوي حزمة iproute2
على أداة ss
، وهي الأداة التي سنستخدمها لفحص المقابس. سنستخدم حزمة netcat-openbsd
لتثبيت netcat. يرجى ملاحظة أن netcat يُختصر إلى nc
عندما يُستدعى في سطر الأوامر. وأخيرًا، سنستخدم حزمة socat
لإنشاء مقابس مثالية.
ما هي مقبس التيار؟
تعتمد مقابس التيار على التدفق على الاتصال، مما يعني أن الحزم المرسلة إلى والمستلمة من مقبس شبكي يتم تسليمها بواسطة نظام تشغيل المضيف بحيث يتم معالجتها بواسطة تطبيق. تستخدم مقابس التيار القائمة على الشبكة عادة بروتوكول التحكم في النقل (TCP) لتغليف ونقل البيانات عبر واجهة شبكية.
تم تصميم TCP ليكون بروتوكول شبكي موثوق يعتمد على اتصال ذو حالة. البيانات التي يتم إرسالها بواسطة برنامج باستخدام مقبس تيار مستند إلى TCP سيتم استلامها بنجاح من قبل نظام بعيد (بشرط عدم وجود مشاكل في التوجيه أو جدار الحماية أو أي مشاكل في الاتصال الأخرى). يمكن أن تصل حزم TCP على واجهة شبكية في أي ترتيب. في حالة وصول الحزم بترتيب غير صحيح، سيضمن محول الشبكة ونظام تشغيل المضيف إعادة تجميعها بالترتيب الصحيح لمعالجتها بواسطة التطبيق.
A typical use for a TCP-based stream socket would be for a web server like Apache or Nginx handling HTTP requests on port 80
, or HTTPS on port 443
. For HTTP, a socket address would be similar to 203.0.113.1:80
, and for HTTPS it would be something like 203.0.113.1:443
.
إنشاء مقابس تيار قائمة على TCP
في المثال التالي، ستستخدم أمر socat
(المختصر لـ SOcket CAT
) لتقميد خادم ويب يستمع إلى طلبات HTTP على المنفذ 8080 (المنفذ البديل لـ HTTP). ثم ستفحص المقبس باستخدام أوامر ss
و nc
.
أولاً، قم بتشغيل الأوامر socat
التالية لإنشاء مقبسين قائمين على TCP يستمعان للاتصالات على المنفذ 8080
، باستخدام واجهات IPv4 و IPv6:
- الوسيط
TCP4-LISTEN:8080
وTCP6-LISTEN:8080
هما نوع البروتوكول ورقم المنفذ المستخدمين. يخبرانsocat
بإنشاء مأخذات TCP على المنفذ8080
على جميع واجهات IPv4 و IPv6، والاستماع إلى كل مأخذ للاتصالات الواردة. يمكن لـsocat
الاستماع على أي منفذ متاح على النظام، لذا أي منفذ من0
إلى65535
هو معلم صحيح لخيار المأخذ. - خيار
fork
يُستخدم لضمان أنsocat
يستمر في التشغيل بعد معالجة الاتصال، وإلا فإنه سيخرج تلقائيًا. - يُستخدم المسار
/dev/null
بدلاً من عنوان المأخذ البعيد. في هذه الحالة، يخبرsocat
بطباعة أي إدخال وارد إلى ملف/dev/null
، الذي يتجاهله بصمت. - يُستخدم العلم
ipv6only=1
للمأخذ IPv6 لإخبار نظام التشغيل بأن المأخذ ليس مكونًا لإرسال حزم إلى عناوين IPv4 المُعدّلة إلى IPv6. بدون هذا العلم، سيقومsocat
بربط نفسه بكل من عناوين IPv4 و IPv6. - يُوجه الحرف
&
الغلاف إلى تشغيل الأمر في الخلفية. سيضمن هذا العلم استمرار تشغيلsocat
أثناء استدعائك لأوامر أخرى لفحص المأخذ.
ستتلقى نتائج مثل التالية، التي تشير إلى معرفات عملية socat
الاثنين التي تعمل في الخلفية لجلسة الغلاف الخاصة بك. ستكون معرفات العملية الخاصة بك مختلفة عن تلك المُظللة هنا:
Output[1] 434223
[2] 434224
الآن بعد أن لديك عمليتين socat
تستمعان على منفذ TCP 8080
في الخلفية، يمكنك فحص المقابس باستخدام أدوات ss
و nc
.
فحص مقابس التيار الأساسية المستندة إلى TCP
لفحص المقابس TCP على نظام Linux الحديث باستخدام أمر ss
، قم بتشغيله بالأعلام التالية لتقييد الإخراج:
- الأعلام
-4
و-6
يخبرانss
بفحص مقابس IPv4 أو IPv6 فقط على التوالي. يتم عرض كلا مجموعتي المقابس إذا تم حذف هذا الخيار. - الأعلام
t
يحد من الإخراج إلى مقابس TCP. بشكل افتراضي، ستعرض أداةss
جميع أنواع المقابس المستخدمة على نظام Linux. - الأعلام
l
يحد من الإخراج إلى المقابس الاستماع. من دون هذا العلم، سيتم عرض جميع الاتصالات TCP، والتي ستشمل أشياء مثل SSH، والعملاء الذين قد يكونون متصلين بخادم ويب، أو الاتصالات التي قد يكون لنظامك بها مع خوادم أخرى. - العلم
n
يضمن عرض أرقام المنافذ بدلاً من أسماء الخدمات.
قم أولاً بتشغيل الأمر ss -4 -tln
لفحص مقابس TCP IPv4 التي تستمع إلى الاتصالات على نظامك:
ستتلقى إخراجًا مشابهًا للتالي:
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
. . .
LISTEN 0 1 0.0.0.0:8080 0.0.0.0:*
. . .
قد تكون هناك خطوط أخرى مع منافذ أخرى في الإخراج الخاص بك اعتمادًا على الخدمات التي تعمل على النظام الخاص بك. تشير الجزء المميز بوسم 0.0.0.0:8080
من الإخراج إلى أن مأخذ TCP IPv4 يستمع على جميع الواجهات IPv4 المتاحة على منفذ 8080
. ستعرض الخدمة التي تستمع فقط على عنوان IPv4 محدد هذا العنوان فقط في الحقل المميز، على سبيل المثال 203.0.113.1:8080
.
الآن قم بتشغيل نفس الأمر ss
مرة أخرى ولكن باستخدام العلم -6
:
سوف تتلقى إخراجًا مثل الآتي:
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
. . .
LISTEN 0 5 [::]:8080 [::]:*
. . .
قد تكون هناك خطوط أخرى مع منافذ أخرى في الإخراج الخاص بك اعتمادًا على الخدمات التي تعمل على النظام الخاص بك. يشير الجزء المميز بوسم [::]:8080
من الإخراج إلى أن مأخذ TCP IPv6 يستمع على جميع الواجهات IPv6 المتاحة على منفذ 8080
(كما يشير إليه الأحرف ::
، والتي تمثل عنوان IPv6 المكون من صفرات). ستعرض الخدمة التي تستمع فقط على عنوان IPv6 محدد هذا العنوان فقط في الحقل المميز، على سبيل المثال [2604:a880:400:d1::3d3:6001]:8080
.
الاتصال بمأخذات تدفق TCP
لقد تعلمت حتى الآن كيفية إنشاء وتعداد مأخذات TCP على واجهات IPv4 و IPv6. الآن بمجرد أن لديك مأخذين يستمعان للاتصالات، يمكنك تجربة الاتصال بالمأخذات باستخدام أداة netcat.
استخدام Netcat لاختبار الاتصالات TCP إلى المقابس المحلية والبعيدة هو تقنية تحليل مشاكل مفيدة للغاية يمكن أن تساعد في عزل مشاكل الاتصال وجدار الحماية بين الأنظمة.
للاتصال بالمقبس IPv4 عبر عنوان الحلقة المحلية باستخدام Netcat، قم بتشغيل الأمر التالي:
- يُخبر العلم -4 Netcat باستخدام IPv4.
- يُستخدم العلم -v لطباعة الإخراج المفصل إلى الطرفية الخاصة بك.
- الخيار -z يضمن أن Netcat يتصل فقط بمقبس دون إرسال أي بيانات.
- يتم استخدام عنوان IP للحلقة المحلية 127.0.0.1 لأن النظام الخاص بك سيكون له عنوان IP فريد. إذا كنت تعرف عنوان IP لنظامك يمكنك اختبار استخدام ذلك أيضًا. على سبيل المثال، إذا كان عنوان IP العام أو الخاص لنظامك هو 203.0.113.1 يمكنك استخدام ذلك بدلاً من عنوان الحلقة المحلية.
ستتلقى إخراجًا مثل الآتي:
OutputConnection to 127.0.0.1 (127.0.0.1) 8080 port [tcp/http-alt] succeeded!
السطر المميز هو الإخراج من Netcat. يشير إلى أن Netcat قد اتصل بمقبس TCP الذي يستمع على عنوان IPv4 للحلقة المحلية 127.0.0.1 على المنفذ 8080. يمكنك تجاهل السطر الثاني، إنه من عملية Socat الجارية في الخلفية في الطرفية الخاصة بك.
الآن يمكنك تكرار نفس اختبار الاتصال ولكن باستخدام IPv6. قم بتشغيل أمر Netcat التالي:
يجب أن تتلقى إخراجًا مثل الآتي:
OutputConnection to ::1 8080 port [tcp/http] succeeded!
السطر المميز هو الإخراج من Netcat. يشير إلى أن Netcat قد اتصل بمقبس TCP الذي يستمع على عنوان IPv6 للحلقة المحلية ::1 على المنفذ 8080. مرة أخرى، يمكنك تجاهل السطر الثاني من الإخراج.
لتنظيف المقابس الخاصة بك، ستحتاج إلى تشغيل الأمر fg
(foreground) لكل عملية socat التي أنشأتها. ثم ستستخدم CTRL+C
لإغلاق كل socat. fg
سيجلب العمليات إلى الأمام في وحدة التحكم الخاصة بك بالترتيب العكسي الذي قمت بتشغيلها، لذا عند تشغيله، ستكون العملية الثانية socat هي تلك التي ستتفاعل معها أولاً.
قم بتشغيل fg
لجلب العملية socat IPv6 الثانية إلى الأمام في وحدة التحكم الخاصة بك. ثم قم بتشغيل CTRL+C
لإغلاقها.
ستتلقى إخراجًا مثل الآتي:
Outputsocat TCP6-LISTEN:8080,ipv6only=1,fork /dev/null
اضغط CTRL+C
لإيقاف العملية.
الآن قم بتشغيل fg
مرة أخرى لتنظيف المقبس IPv4 الأول. يجب أن يكون لديك إخراج مثل الآتي:
Outputsocat TCP4-LISTEN:8080,fork /dev/null
اضغط CTRL+C
لإيقاف العملية.
لقد أنشأت الآن، وفحصت، وقمت بالاتصال بمقابس IPv4 و IPv6 على نظامك. ستعمل هذه التقنيات والأدوات على أنظمة التطوير المحلية، أو خوادم الإنتاج عن بُعد، لذا حاول التجربة مع كل أداة لتصبح أكثر ملمًا بكيفية استخدامها لاختبار وتصحيح مقابس TCP.
ما هو مقبس الحزمة البيانية؟
مقابس الحزمة البيانية هي غير متصلة، مما يعني أن الحزم المرسلة والمستلمة من مقبس يتم معالجتها فرادى بواسطة التطبيقات. مقابس الحزمة البيانية على الشبكة عادة ما تستخدم بروتوكول مستخدم الحزم البيانية (UDP) لتغليف ونقل البيانات.
لا تُشفر بروتوكولات UDP معلومات التسلسل في رؤوس الحزم، ولا يوجد تصحيح للأخطاء مُدمج في البروتوكول. يجب على البرامج التي تستخدم مقابس الشبكة بناء منطقها الخاصة لمعالجة الأخطاء وترتيب البيانات لضمان نجاح عملية نقل البيانات.
تُستخدم مقابس UDP بشكل شائع من قبل خوادم نظام أسماء النطاقات (DNS). عند التشغيل الافتراضي، تستخدم خوادم DNS منفذ 53
لإرسال واستقبال الاستعلامات حول أسماء النطاقات. يكون عنوان مقبس UDP لخادم DNS مثاليًا مشابهًا لـ 203.0.113.1:53
.
ملاحظة: على الرغم من أن البروتوكول غير مضمن في الإصدار القابل للقراءة بشكل بشري لعنوان المقبس، إلا أن أنظمة التشغيل تميز عناوين المقابس عن طريق تضمين بروتوكولات TCP وUDP كجزء من العنوان. لذا، يمكن استخدام أدوات مثل ss
، والأداة القديمة netstat
، لتحديد نوع المقبس الذي يتم استخدامه.
بروتوكول توقيت الشبكة (NTP) يستخدم مقبس UDP على منفذ 123
لمزامنة الساعات بين الحواسيب. يكون مثال على مقبس UDP لبروتوكول NTP مشابهًا لـ 203.0.113.1:123
.
إنشاء مقابس الحزم
كما في مثال مأخوذ على مأخذ TCP السابق، في هذا القسم ستقوم مرة أخرى باستخدام socat
لتقميد خادم NTP يستمع للطلبات على منفذ UDP 123
. ثم ستفحص المأخذات التي تنشئها باستخدام أوامر ss
و nc
.
أولاً، قم بتشغيل الأوامر التالية باستخدام socat
لإنشاء مأخذي UDP يستمعان للاتصالات على المنفذ 123، باستخدام واجهات IPv4 و IPv6:
ستتلقى مخرجات مماثلة للتالية، تشير إلى هويات عمليات socat
التي تعمل في الخلفية لجلسة الطرفية الخاصة بك. ستكون هويات عملياتك مختلفة عن تلك المظللة هنا:
Output[1] 465486
[2] 465487
- تم تسبيق كل أمر بـ
sudo
، لأن المنافذ من0
إلى1024
محجوزة على معظم الأنظمة.sudo
يشغل الأمر بصلاحيات مسؤول، مما يسمح لـsocat
بربط أي منفذ في النطاق المحجوز. - المعاملات
UDP4-LISTEN:123
وUDP6-LISTEN:123
هي نوع البروتوكول والمنفذ المستخدم. تخبر socat بإنشاء مأخذات مبنية على UDP على المنفذ123
على كل من واجهات IPv4 و IPv6، والاستماع للبيانات الواردة. مرة أخرى، أي منفذ في النطاق الكامل من 0 إلى 65535 هو معامل صالح لمأخذات UDP. - المعاملات
fork
،ipv6only=1
، و/dev/null
تستخدم بنفس الطريقة كما هو موضح في مثال TCP السابق.
الآن بعد أن لديك عمليات socat
اثنتان تستمعان على منفذ UDP 123
، يمكنك فحص المأخذات باستخدام أدوات ss
و nc
.
فحص مقابس البيانات الخاصة بالحزم
لفحص مقابس UDP على نظام Linux الحديث باستخدام أمر ss
، قم بتشغيله مع الأعلام التالية -4
، -6
و uln
لتقييد الإخراج:
العلم u
يحد من الإخراج إلى مقابس UDP.
الأعلام الأخرى مماثلة لتلك المستخدمة في مثال TCP السابق.
قم أولاً بتشغيل أمر ss -4 -uln
لفحص مقابس UDP IPv4 التي تستمع إلى الاتصالات على نظامك:
ستتلقى إخراجًا مثل الآتي:
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
. . .
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
. . .
قد تظهر أسطر أخرى بمنافذ أخرى في إخراجك اعتمادًا على الخدمات التي تعمل على نظامك. الجزء المميز 0.0.0.0:123
من الإخراج يشير إلى أن مقبس UDP IPv4 متاح على جميع واجهات IPv4 على المنفذ 123
. الخدمة التي تكون متاحة فقط على عنوان IPv4 محدد ستعرض فقط تلك العنوان IP في الحقل المميز، على سبيل المثال 203.0.113.1:123
.
الآن قم بتشغيل نفس الأمر ss
مرة أخرى ولكن مع العلم -6
:
ستتلقى إخراجًا مثل الآتي:
OutputState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
. . .
UNCONN 0 0 [::]:123 [::]:*
. . .
قد تكون هناك خطوط أخرى بمنافذ أخرى في الإخراج الخاص بك اعتمادًا على الخدمات التي تعمل على النظام الخاص بك. الجزء المظلل [::]:123
من الإخراج يشير إلى أن مأخذ TCP IPv6 متاح على جميع الواجهات IPv6 على المنفذ 123
(كما هو موضح بالأحرف ::
). ستعرض الخدمة التي تكون متاحة فقط على عنوان IPv6 محدد ذلك العنوان فقط في الحقل المظلل، على سبيل المثال [2604:a880:400:d1::3d3:6001]:123
.
اختبار مأخذات البيانات الجرامية
الآن بعد أن أصبحت مألوفًا بكيفية إنشاء وتعداد مأخذات UDP على الواجهات IPv4 و IPv6، يمكنك تجربة الاتصال بها. كما هو الحال مع مأخذات TCP، يمكنك تجربة مأخذات UDP باستخدام أداة netcat.
للاتصال بمأخذ UDP المثالي على المنفذ 123
الذي قمت بإنشائه في الجزء السابق من هذا البرنامج التعليمي، قم بتشغيل الأمر netcat التالي:
- العلم
-4
يخبر netcat باستخدام IPv4. - الخيار
-u
يوجه netcat لاستخدام UDP بدلاً من TCP. - العلم
-v
يستخدم لطباعة الإخراج المفصل إلى الطرفية الخاصة بك. - الخيار –
z
يضمن أن يقوم netcat بالاتصال فقط بمأخذ دون إرسال أي بيانات. - يُستخدم عنوان الـ loopback المحلي
127.0.0.1
IP لأن نظامك سيكون له عنوان IP فريد. إذا كنت تعرف عنوان IP الخاص بنظامك يمكنك اختباره أيضًا. على سبيل المثال، إذا كان عنوان IP العام أو الخاص لنظامك هو203.0.113.1
يمكنك استخدام ذلك بدلاً من عنوان الـ loopback.
ستتلقى إخراجًا مثل الآتي:
OutputConnection to 127.0.0.1 123 port [udp/ntp] succeeded!
يشير الإخراج إلى أن netcat لم يتلق رسالة خطأ من مأخذ UDP الذي يستمع على عنوان IPv4 للـ loopback 127.0.0.1
على المنفذ 123
. يتم استخدام هذا النقص في استجابة الخطأ لاستنتاج أن المأخذ عند 127.0.0.1:123
متاح. هذا السلوك يختلف عن مأخذات TCP، التي تحتاج إلى تبادل حزم لتأكيد ما إذا كان المأخذ متاحًا.
ملاحظة: إذا كان المأخذ في هذا المثال غير متاح، ستعيد النظام البعيد رسالة نوع ICMP 3 (Destination Unreachable) مع كود 3، مما يشير إلى عدم توصيل المنفذ على الخادم البعيد.
استنتاج أن المأخذ متاح بناءً على عدم استجابة خطأ يفترض عدم وجود جدران نارية أو مشاكل في الاتصال تعيق حركة ICMP. بدون إرسال واستقبال وتحقق من بيانات التطبيق عبر مأخذ UDP، لا يوجد ضمان بأن منفذ UDP البعيد مفتوح ويقبل الحزم.
الآن يمكنك تكرار نفس اختبار الاتصال ولكن باستخدام IPv6. قم بتشغيل الأمر netcat التالي:
يجب أن تتلقى إخراجًا مثل الآتي:
OutputConnection to ::1 123 port [udp/ntp] succeeded!!
يشير الإخراج إلى أن netcat لم يتلق أي خطأ من مأخذ UDP الذي يستمع على عنوان IPv6 المحلي ::1
على المنفذ 123
. مرة أخرى ، يُستخدم هذا النقص في رد الخطأ لاستنتاج أن المأخذ عنوانه ::1:123
متاحٍ.
لتنظيف المأخذات الخاصة بك ، ستحتاج إلى تشغيل الأمر fg
(الخلفية) لكل عملية socat التي قمت بإنشائها. ثم ستستخدم CTRL+C
لإغلاق كل socat.
قم بتشغيل fg
لجلب عملية socat الثانية IPv6 إلى الخلفية في الطرفية الخاصة بك. ثم قم بتشغيل CTRL+C
لإغلاقها.
ستتلقى إخراجًا مثل الآتي:
Outputsudo socat UDP6-LISTEN:123,ipv6only=1,fork /dev/null
اضغط CTRL+C
لإيقاف العملية.
الآن قم بتشغيل fg
مرة أخرى لتنظيف المأخذ IPv4 الأول. ستحصل على إخراج مثل الآتي:
Outputsudo socat UDP4-LISTEN:123,fork /dev/null
اضغط CTRL+C
لإيقاف العملية.
لقد قمت الآن بإنشاء وفحص واختبار مأخذات UDP IPv4 و IPv6 على نظامك. جرب التجربة مع كل أداة لتصبح أكثر معرفة بكيفية استخدامها لاختبار وتصحيح مأخذات UDP.
ما هو مأخذ Unix Domain؟
البرامج التي تعمل على نفس الخادم يمكنها أيضًا التواصل مع بعضها البعض باستخدام مقابس Unix Domain (UDS). يمكن أن تكون مقابس Unix Domain مبنية على التدفق أو على الحزم. عند استخدام مقابس النطاق، يتم تبادل البيانات بين البرامج مباشرة في نواة نظام التشغيل عبر ملفات على نظام الملفات المضيف. لإرسال أو استقبال البيانات باستخدام مقابس النطاق، تقوم البرامج بقراءة وكتابة الملف المشترك الخاص بها للمقبس، متجاوزة المقابس والبروتوكولات المستندة إلى الشبكة تمامًا.
تُستخدم مقابس Unix Domain على نطاق واسع من قِبَل أنظمة قواعد البيانات التي لا تحتاج إلى الاتصال بواجهة الشبكة. على سبيل المثال، يعتمد MySQL على Ubuntu على استخدام ملف يسمى /var/run/mysqld/mysql.sock
للتواصل مع العملاء المحليين. يقوم العملاء بالقراءة من والكتابة إلى المقبس، ويفعل الخادم MySQL نفسه.
PostgreSQL هو نظام قواعد بيانات آخر يستخدم مقبسًا للتواصل المحلي غير المرتبط بالشبكة. عادةً ما يعتمد على استخدام /run/postgresql/.s.PGSQL.5432
كملف للمقبس الخاص به.
إنشاء مقابس Unix Domain
في الأقسام السابقة، استكشفت كيفية استخدام TCP مع مأخذات البيانات التسلسلية، وكيفية استخدام UDP مع مأخذات البيانات الرقمية. في هذا القسم، ستستخدم socat
لإنشاء مأخذات Unix Domain Sockets قائمة على التيار وقائمة على الحزم بدون استخدام TCP أو UDP لتضمين البيانات المرسلة عبر الشبكات. ثم ستفحص المأخذات التي تم إنشاؤها باستخدام أوامر ss
و nc
. وأخيرًا، ستتعلم كيفية اختبار مأخذات Unix Domain Sockets باستخدام netcat.
للبدء، قم بتشغيل الأوامر التالية لإنشاء ملفي مأخذ بواسطة socat
:
- الأمر الأول يُوجه socat إلى إنشاء مأخذ باستخدام نوع العنوان
unix-listen
، والذي سينشئ مأخذ UDS قائم على التيار. - الأمر الثاني يحدد
unix-recvfrom
كنوع المأخذ، والذي سينشئ مأخذ UDS قائم على الحزم - يحدد كلا الأمرين اسم ملف بعد الفاصلة
:
. اسم الملف هو عنوان المأخذ نفسه. بالنسبة لمثال التيار الأول، يكون/tmp/stream.sock
وبالنسبة لمثال الحزم الثاني، يكون/tmp/datagram.sock
. يرجى ملاحظة أن اسم المأخذ عرضي ولكن من الأفضل أن يكون وصفيًا عندما تقوم بتحليل المشكلات. - تُستخدم الوسيطة
fork
و/dev/null
بنفس الطريقة الموضحة في أقسام مثال المأخذ التسلسلي والمأخذ الرقمي.
الآن بعد أن قمت بإنشاء مأخذي UDS، يمكنك فحصهم باستخدام الأدوات ss
و nc
.
فحص المقابس في مجال Unix
لعرض جميع المقابس في مجال Unix الاستماعية، قم بتشغيل الأمر ss -xln
. تضمن العلم x
أن يتم عرض المقابس المجالية فقط.
ستتلقى إخراجًا مثل الآتي:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
. . .
u_str LISTEN 0 5 /tmp/stream.sock 436470 * 0
u_dgr UNCONN 0 0 /tmp/datagram.sock 433843 * 0
. . .
لاحظ الجزء المميز u_str
في السطر /tmp/stream/sock
المميز. يشير هذا الحقل إلى أن نوع المقبس هو UDS قائم على التيار. السطر الثاني يوضح أن النوع هو u_dgr
مما يعني أن نوع المقبس هو قائم على الرسائل.
نظرًا لأن مقابس مجال Unix هي ملفات، يمكن استخدام أذونات وضوابط الوصول المعتادة للمستخدم والمجموعة في Linux لتقييد من يمكنه الاتصال بالمقبس. يمكنك أيضًا استخدام أدوات نظام الملفات مثل ls
، mv
، chown
و chmod
لفحص وتلاعب ملفات UDS. يمكن أيضًا استخدام أدوات مثل SELinux لتسمية ملفات UDS بسياقات أمان مختلفة.
للتحقق مما إذا كان ملفًا هو مقبس UDS، استخدم الأدوات ls
، file
أو stat
. ومع ذلك، من المهم أن نلاحظ أنه لا يمكن لأيٍ من هذه الأدوات تحديد ما إذا كان مقبس UDS قائم على التيار أم على الرسائل. استخدم أداة ss
للحصول على أكثر المعلومات الشاملة حول مقبس Unix Domain.
لفحص مقبس على نظام الملفات، تُظهر أداة stat
المعلومات الأكثر صلة. قم بتشغيلها على المقابس التي قمت بإنشائها مسبقًا:
ستتلقى الناتج مثلما يلي:
Output File: /tmp/stream.sock
Size: 0 Blocks: 1 IO Block: 131072 socket
Device: 48h/72d Inode: 1742 Links: 1
Access: (0755/srwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 18:10:25.025755168 +0000
Modify: 2021-03-01 18:10:25.025755168 +0000
Change: 2021-03-01 18:22:42.678231700 +0000
Birth: -
File: /tmp/datagram.sock
Size: 0 Blocks: 1 IO Block: 131072 socket
Device: 48h/72d Inode: 1743 Links: 1
Access: (0755/srwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2021-03-01 18:10:25.025755168 +0000
Modify: 2021-03-01 18:10:25.025755168 +0000
Change: 2021-03-01 18:10:25.025755168 +0000
Birth: -
لاحظ أنه بالنسبة لكل ملف، يكون النوع socket
(مظللا في الزاوية اليمنى للإخراج) وأن وضع الوصول له حرف s
يسبق أذونات الملف.
سيشير أداة ls
أيضًا إذا كان الملف هو مأخذ. قم بتشغيل ls -l
لفحص الملفات:
ستتلقى الناتج مثلما يلي. مرة أخرى، لاحظ أنه بالنسبة للمأخذ، يتضمن وضع الملف الحرف s
قبل حقول أذونات الملف:
Outputsrwxr-xr-x 1 root root 0 Mar 1 18:10 /tmp/datagram.sock
srwxr-xr-x 1 root root 0 Mar 1 18:10 /tmp/stream.sock
الآن بعد أن قمت بإنشاء مأخذات Unix Domain، وتعلمت كيفية فحصها باستخدام أدوات ss
ومختلف أدوات نظام الملفات، الخطوة التالية هي اختبار المأخذات باستخدام أداة مثل netcat.
اختبار المأخذات Unix Domain
يمكن استخدام أداة netcat للاتصال بمأخذات Unix Domain، فضلاً عن مأخذات TCP و UDP التي تعلمت عنها بالفعل في وقت سابق من هذا البرنامج التعليمي. للاتصال بالمأخذات المثالية التي قمت بإنشائها، ستحتاج إلى تحديد علامة -U
إضافية عند تشغيل أمر netcat. تُخبر هذه العلامة netcat بالاتصال بمأخذ Unix Domain، بدلاً من مأخذ شبكة يستند إلى TCP أو UDP.
بالإضافة إلى ذلك، إذا كان المأخذ مستندًا إلى الحزم، فستستخدم علامة -u
لتوجيه netcat لاستخدام الحزم كما تعلمنا في قسم مأخذ الحزم في هذا البرنامج التعليمي.
لنبدأ في فحص مأخذات UDS عن طريق الاتصال بالمأخذ ذو التيار القائم باستخدام الأمر التالي:
تقول -U
لـ netcat إنها تتصل بمأخذ Unix Domain. الخيار -z
يضمن أن netcat يتصل فقط بمأخذ دون إرسال أي بيانات. /tmp/stream.sock
هو عنوان المأخذ على نظام الملفات.
لن تتلقى أي إخراج من netcat عند تشغيل الأمر. ومع ذلك، إذا لم يكن هناك مأخذ متاح، سيقوم netcat بإخراج رسالة خطأ مثل الآتي:
Outputnc: unix connect failed: No such file or directory
nc: /tmp/stream.sock: No such file or directory
لذلك، غياب الإخراج من netcat أثناء اختبار مأخذ UDS قائم على التيار يعني أن الاتصال ناجح.
كرر عملية الاختبار، هذه المرة لمأخذ UDS القائم على البيانات:
يتم إضافة العلم -u
إضافيًا ليخبر netcat بأن المأخذ البعيد هو مأخذ بيانات. مرة أخرى، لن تتلقى أي إخراج إذا كان الاختبار ناجحًا.
إذا لم يكن هناك مأخذ في العنوان، ستتلقى خطأ مثل الآتي:
Outputnc: unix connect failed: No such file or directory
nc: /tmp/datagram.sock: No such file or directory
لتنظيف مأخذاتك، ستحتاج إلى تشغيل أمر fg
(الأمامية) لكل عملية socat التي أنشأتها. ثم ستستخدم CTRL+C
لإغلاق كل socat.
قم بتشغيل fg
لجلب مثيل socat قائم على البيانات إلى الأمام في نافذة الطرفية الخاصة بك:
ستتلقى إخراجًا مثل الآتي:
Outputsocat unix-recvfrom:/tmp/datagram.sock,fork /dev/null
قم بتشغيل CTRL+C
لإغلاقه. لن تتلقى أي إخراج.
الآن قم بتشغيل fg
مرة أخرى لتنظيف مأخذ UDS الأول القائم على التيار.
مرة أخرى يجب أن يكون لديك إخراج مثل الآتي:
Outputsocat unix-listen:/tmp/stream.sock,fork /dev/null
تشغيل CTRL+C
لإنهاء العملية. لن تتلقى أي إخراج.
لقد قمت الآن بإنشاء واستكشاف واختبار مأخذات بريد Unix Datagram على نظامك. جرب التجربة مع netcat و socat
لتصبح أكثر ملم بكيفية إرسال واستقبال البيانات عبر UDS، وكذلك كيف يمكنك اختبار وتصحيح أخطاء مأخذات Unix Domain.
الاستنتاج
في هذا البرنامج التعليمي، استكشفت كيفية استخدام أنواع مختلفة من المأخذات على نظام Linux. تعرفت على المأخذات المستندة إلى التيار، التي عادة ما تستخدم TCP للاتصال بالشبكة. كما تعرفت على المأخذات المستندة إلى الحزم، التي تستخدم UDP لإرسال البيانات عبر الشبكات. وأخيرًا، استكشفت كيف يمكن أن تكون مأخذات Unix Domain مبنية سواء على التيار أو على الحزم على خادم محلي.
في كل قسم، استخدمت أداة ss
لجمع المعلومات حول المأخذات على نظام Linux. تعرفت على كيفية استخدام الأعلام المختلفة التي توفرها أداة ss
للمساعدة في تقييد الإخراج لأنواع محددة من المأخذات عند فحص المأخذات على النظام.
أخيرًا، استخدمت أدوات netcat و socat
لإنشاء الاتصال بكلٍ من ثلاثة أنواع مختلفة من المقابس التي تم مناقشتها في هذا البرنامج التعليمي. تُستخدم أداة netcat على نطاق واسع للاتصال بالمقابس، ولكن يمكنها أيضًا إنشاء المقابس. تحتوي وثائقها ( man nc
) على العديد من الأمثلة على كيفية استخدامها في أي من الوضعين. أما أداة socat
فهي أداة متقدمة أكثر يمكن استخدامها للاتصال بأنواع مختلفة من المقابس التي لم يتم تغطيتها في هذا البرنامج التعليمي. تحتوي وثائقها ( man socat
) أيضًا على العديد من الأمثلة على الطرق المختلفة التي يمكن استخدامها فيها.
فهم ما هي المقابس وكيفية عملها مهارة أساسية في إدارة النظام. الأدوات والتقنيات التي قمت بتجربتها في هذا البرنامج التعليمي ستساعدك على أن تصبح أكثر إلمامًا بالمقابس، وكيفية استكشاف الأخطاء في حال عدم تواصل خوادمك وتطبيقاتك بشكل صحيح.
Source:
https://www.digitalocean.com/community/tutorials/understanding-sockets