يوميات مبعسس

في ليلٍ ساكن، وقد خلت المكاتب، ورقدت الحواسيب كأنها جثامين لا حراك بها، وظن أصحابها أن قدِ استراحت من عناء النهار، فإذا بها تُبعَث من رُقادها، تنهض من سكونها، لا أحد في المكان، لا أحد يراها، من أيقظها؟ ولِمَ؟

نداءٌ خفيٌّ سرى في الأسلاك، ألقاه عدو تربَّص بها، ترقَّب ساعة الغفلة حين نام الجميع، فما إن استيقظت تلك الحواسيب حتى امتدَّت إليها يده فأحكمت عليها الخناق، وأغلقت عليها السُّبُل، لا أحد يسمع، لا أحد يرى، صار ما في جوفها رهينًا، صارت أسيرة، إما أن يفتديها أصحابها أو أن تموت! يا ويل أمها ليتها ما استيقظت!

ذلكم هو ريوك Ryuk، برمجيةُ الفديةِ الجبارة التي أيقظت في عام ٢٠١٨ وما بعده أطنانًا من الأجهزة في الشركات والمستشفيات والصحف، ليتخذها أسيرةً تُفدى كيلا تموت، استغلَّ ريوك منحةً إلهيةً وضعها المهندسون لخدمة الخير، فإذا به يقلبها وبالاً وشرًا مستطيرًا.

فتخيَّلْ معي: حاسوبُك مُطفأ، زرُّه لا يضِيء، مراوحُه لا تدور، كأنه جثةٌ هامدة، ثم وبلا سببٍ يُفِيق! شاشةٌ تضيء، أقراصٌ تدور، وريوك يلهثُ خلفَ ملفاتِك كالذئبِ الجائع!

فكيفَ يفعلُها ريوك؟ بأيِّ سحرٍ أيقظَ الحواسيبَ من مرقدِها؟

لنقفْ قليلاً عندَ هذا البابِ المسدود، ولنرجعْ إلى تلك التقنيةِ التي سخَّرَها ريوك لنقمته، إنها تقنيةُ الإيقاظِ الشبكيِّ المحلي Wake-on-LAN، فما هي؟ وكيف تعمل؟ وكيف استطاع ريوك أن يُسخِّرَها لأغراضه الشيطانية؟

تفضل معي إلى الأسطر التالية، فنحن على موعدٍ مع الأسرار!

الإيقاظ الشبكي المحلي Wake-On-Lan

تقنية الإيقاظ الشبكي هي خاصية مُودعة في بطاقة الشبكة NIC غايتُها إيقاظ حاسوبك من حالةِ طاقةٍ مُنخفضة عبر شبكتك المحلية LAN (حين تُطفئه Shutdown/Poweroff أو يكون على السكون Sleep وأنت بعيد عنه)، بإرسالة رسالة شبكية مخصوصة على هيئة معلومة، واسم هذه الرسالة: «الرزمة السحرية Magic Packet»، وحين يلتقطها حاسوبك يفيق من سكرته!
نعم كما قرأت، حتى وهو منطفئ توقظه! لأنه حين تطفئ حاسوبك فهو ينحدر في مراتب ولا ينطفئ انطفاءً كُليًّا، التيار لم يُقطَع قطعًا مُطلقًا، فما تزال في حاسوبك بقية طاقة أبقاها فيه صانعوه -وتفصيل هذا في الفقرات الآتية-، هذه البقية من الطاقة تُغذَّى بها بطاقة الشبكة، فتبقى بطاقة الشبكة مُصغية لكل ما يمرُّ بها من رسائل، إنها في حالة رصد وترقُّب لتتابع مُعيَّن من البايتات، حين تلتقط هذا النمط وتعرفه بأنه الرزمة السحرية = تُرسل نبضة للوحة الأم لتوقظ حاسوبك وكأنك ضغطت على زر التشغيل بيدك.

شرح الرزمة السحرية بعد فقرة…

وجوه الانتفاع بها

أكثر ما يُنتَفعُ بها يكون في البيئات التي تتكاثر فيها الأجهزة ويتعذر معها الحضور الدائم أو التشغيل المستمر، ومن ثم شاع استعمالها في المؤسسات التعليمية وبيئات المؤسسات، ومن أبرز وجوه الانتفاع بها أنها:

تُمكّن من الوصول إلى الأجهزة عن بُعد: فيُوقَظ الحاسوب وهو في مكانه ليُباشَر فحصه أو معالجة خلله، أو تُستخرج منه الملفات من غير أن يُضطر الفنِّي إلى الانتقال إليه، وبهذا يُختصر الزمن وفيه تسهيل للعمل.

ومنها أنها تُستعمل في تركيب التحديثات والترقيعات الأمنية خارج أوقات العمل: تُوقَظ الأجهزة في الساعات التي يقل فيها استعمالها، مثلًا في الليل أو وقت غياب الموظفين، وبعد الفراغ من تركيب التحديثات تُعاد إلى حال السكون، وفي ذلك جمع بين سلامة الأنظمة وعدم تعطيل أعمال الناس.

وتُستعمل كذلك في بعض البيئات لإدارة الأجهزة التي تقدم خدمات، مثل خوادم مشاركة الملفات ونحوها، تبقى في حالة طاقة منخفضة، ثم نوقظها عند الحاجة إليها، فإذا فرغنا منها عادت إلى رقدتها، وبهذا لا تُستهلَك الطاقة إلا عند الطلب، مع بقاء الخدمة متاحةً عند الاستدعاء.

ولا يقتصر الأمر على المؤسسات ويمتد إلى الأفراد وأهل الاهتمام بالتقنية، فكثيرٌ منهم في مختبراتهم المنزلية Home Labs يريدون إبقاء أجهزتهم مطفأة معظم الوقت ثم يُوقظونها عند الحاجة، تحقيقًا للاقتصاد في استهلاك الطاقة مع الحفاظ على إمكان الوصول إليها متى شاؤوا.

الرزمة السحرية Magic Packet

الرسالة الشبكية المخصوصة هي «الرزمة السحرية» عماد تقنية الإيقاظ عبر الشبكة المحلية Wake-On-Lan، وقد ورد تعريفها وتفصيلُ عملِها في وثيقةٍ أصدرتها شركةُ AMD بالاشتراكِ مع Hewlett Packard سنةَ ١٩٩٥م، جعلوا عنوانَها «Magic Packet Technology»، والهيئة التي تُرسَل بها تتألف في صورتها القياسية من ستة بايتات متتابعة قيمتُها جميعًا FF (وهي أقصى ما يسعه البايت الواحد) بالنظام العد الست عشري هكذا:

FF FF FF FF FF FF

يليه عنوان MAC للجها المُراد إيقاظه مكررًا ١٦ مرة (أي يساوي ٩٦ بايت، والمجموع ١٠٢ بايت). ولأجل تأمين التقنية جعلوا كلمة سر توضع في الرزمةِ السحريةِ، طولها ستة بايتات، وكلمة السر هذه لا تدعمها كل الأجهزة، ولا تُفعَّلُ إلا في البيئاتِ التي تشتدُّ فيها الحاجة.
كلمة السر بطول ستة بايتات تُلَحق بنهاية التكرارات، فتكون الرزمة بطول ١٠٨ بايت (١٠٢ بايت الأساسية مع زيادة ٦ بايتات لكلمة السر)، أي أن الترتيب سيكون:

FF FF FF FF FF FF
MAC×16
6 (password)

وهل تعلم سبب تكرار العنوان ١٦ مرة؟
لو جعلوا شرطَ الإيقاظ مجرد رؤية العنوان مرة واحدة لأصبحت البطاقة كمن يفتح الباب كلما سمع صوتًا يناديه، وهذا باب للفوضى، فاحتاجوا إلى علامةٍ لا تأتي بها المصادفة فجاءت العلامةُ على أن يُرى العنوانُ مكررًا ١٦ مرة متتالية لا فاصل بينها ولا قاطع، وإنما اختاروا هذا العدد بالذات لأنه -بحساب الاحتمالات- يجعل وقوعَ هذا النمط صدفةً ضربًا من المستحيل، فاحتمال ورود عنوان جهازك مرةً واحدةً بالصدفة هو واحدٌ على مئتين وواحدٍ وثمانين ألف ألف ألف! فكيف به إذا ورد ١٦ مرة متتالية؟ إنه رقمٌ لا يكاد يذكر في علم الإحصاء، بل هو في حكم العدم!
تُرسَل هذه الرزمة في الغالب عبر الشبكة المحلية بالبث العام Broadcast، كأن تُوجَّه إلى العنوان 255.255.255.255 أو إلى عنوان بث الشبكة، وتُغلَّفُ عادةً ضمن ميفاق UDP على منافذ شائعة مثل ٧ أو ٩، وإن كان الأمر في حقيقته لا يتقيَّد بمنفذٍ بعينه، لأن بطاقة الشبكة لا تنظر إلى المنفذ بقدر ما تبحث عن نمط الرزمة نفسها، وهذه المنافذ اشتهرت بين المبرمجين وقد تختار أي منفذ آخر، لكن لا يحظرك الحامي Firewall…

إذا وصلت الرزمة السحرية إلى بطاقة الشبكة وكانت هذه البطاقة في وضع الاستعداد (أي مكَّنت الخاصية كما سيأتي بيانه) أخذت البطاقة تفحص ما يمرُّ بها من حركة Traffic بحثًا: أفيها ذلك النمط المخصوص؟ أفيها عنوانها مكررًا على الوجه المعروف؟ فإن وجدت ذلك تيقَّنت أنَّها المقصودة بهذا النداء، ثم ترسل نبضة إلى اللوحة الأم، تُعرف في بعض التصاميم بإشارة PME (Power Management Event)، فتأذن هذه الأخيرة بانتقال النظام من حال السكون إلى حال التشغيل.

قيود وعقبات التقنية

أول قيودها هو ضيق مجالها في أصل نشأتها، لأنها وضعت للشبكات المحلية LAN (راجع مقالنا عن الشبكات: تصنيف الشبكات وتركيبتها Topologies)، لأن هذه الرزمة السحرية تُرسَل بالبث العام Broadcast، وإذا أُريد حملها على فضاء الشابكة Internet = اصطدمت بطبيعة هذا الفضاء، فأجهزة التوجيه routers تحجب رسائل البث العام وتمنع انتشارها صونًا للشبكات من الفوضى والإغراق، وبهذا لا تبلغ الرزمة السحرية غايتها إلا بحيلٍ إضافية، كإعداد تحويل المنافذ أو توجيهٍ مخصوص، وهي أمور تُخرِج التقنية عن سهولتها وتجعلها أقلَّ وثوقًا وأعسر تطبيقًا.

وثانيها أنها إذا كانت الشبكة مقسمة إلى أقسامٍ معزولة كما هو الشأن في شبكات VLAN = يشتد العائق، لأن كل قسم منها كجزيرة قائمة بذاتها، لا يعبر إليها البث من غيرها، وإن أُرسِلَتِ الرزمة في قسم، والجهاز المنشود في آخر = انقطع الخبر بينهما ولم يقع الإيقاظ، وهنا يحتاج الأمر إلى إعداداتٍ أدقَّ في المبدِّلات أو أجهزة التوجيه كإعادة بث الرزمة أو تمريرها على وجهٍ مخصوص، وإلا بقيت الأجهزة في سكونها كأن لم تنادَ.

وثالثها الأمان، فهذه «الرزمة السحرية» في صورتها الشائعة لا تعرف توثيقًا ولا تميِّز مُرسِلًا عن مرسِل، ومتى وافق تركيبها النمط المعروف = استجابت لها بطاقة الشبكة، وفي هذا مدخلٌ لمن أراد العبث فيوقظ الأجهزة بغير إذن، كما قد علمتَه.


كذبة الإطفاء Shutdown

لنفهم هذه التقنية فعلينا العودة إلى الأصل الذي ينتظم به سلوك الطاقة في الحاسوب، وخصصت الطاقة بالذكر لأن الحاسوب إما متصل بالطاقة فهو مستيقظ، وإما مقطوعة عنه فهو نائم، وحين تضغظ زر الإطفاء Shutdown من ويندوز فجهازك لا ينطفئ بالكلية كما يدَّعي النظام، الطاقة لا تنطقع بالكلية!
فجريان الطاقة في الحاسوب لا يكون على ضربٍ واحد، فهو سُلَّمٌ ينحدر عليه الجهاز من تمام اليقظة إلى غاية السكون، ثم يرتقي عليه إذا دُعي، درجةً بعد درجة، وِفق نظام محكم وُضِع ليحكم علاقة الحاسوب بالطاقة ويُدبِّر انتقاله بين العمل والخمود، واسمه معيار ACPI، أي: الواجهة المتقدِّمة لضبط الطاقة وتهيئة العتاد Advanced Configuration and Power Interface، ودونك تفصيل لهذه الأضرب من جريان الطاقة وتقدمة للمعيار:

معيار ACPI

ما قبل المعيار

كانت الحواسيب قبل ظهور هذا المعيار بدائية، كانت آلاتٍ ضخمة تملأ الغُرَف والمساحات الشاسعة، ولا تُبالي باستهلاك الطاقة، لأنها موصولة بها على الدوام فلا بطارية تحدُّها ولا حاجة ماسة للاقتصاد، وتحكُّمها بالطاقة كان بدائيًا، لم يكن زر التشغيل إلا مفتاحًا حقيقيًا يقطع التيار دفعةً واحدة عن الحاسوب، فإذا ضغط الرجل عليه = انطفأ الجهاز في الحال، دون تمهُّلٍ أو حفظٍ لعملك أو تدرُّج في ذلك، كأنك نزعت المقبس من الحائط، وكان في ذلك خطرٌ ، فلا فرصة للنظام أن يُنهي أعماله أو يحفظ ما في ذاكرته، فكانت حالات الطاق منحصرةً في طرفين: إمَّا تشغيلٌ كامل ON، وإمَّا انقطاعٌ تام OFF، فلا تمييز بين خمولٍ عارضٍ أو انصرافٍ تام، ولا تُحسن هذه الحواسيب التدرُّج في في الأمر (يغلقُ النظامُ البرمجياتِ الشغَّالة) كما هو مألوف اليوم.

من يُدبِّر الطاقة (أي يديرها) قد كان هو العتاد Hardware، فهو الآمر ونظام التشغيل تابع له، فالنظام لا يعلم حال الطاقة ولا حرارة المعالج ولا مقدار الاستهلاك، كان النظام يعمل كضيفٍ على الجهاز، يُنفِّذ ما يُتاح له دون أن يملك زمام القرار، فجهاز مثل اللوحة الأم (وهي عتاد) كانت -وكل ما يتصل بها من الدوائر-: هي التي تضبط المراوح والجُّهد، متى تُشغَّل المروحة ومتى ينخفض الجُّهد، من غير أن يكون لنظام التشغيل سلطانٌ يُذكر في ذلك.

ما بعده تلك الجواميس

وقد كانت تلك الحواسيبُ الجاثمةَ في مكاتبها كهيئة الجبال الراسيات، لا تفارقُ طاقتها لحظةً واحدة، لكن الإنسان لَمَّا رأى الحديد يُطيعه في كل شيء = تاقت نفسه إلى أن يحملها معه أينما ذهب، يضعه حيث شاء، في الطائرة والقطار والمقهى… فوُلِدَت الحواسيبُ المحمولة Laptop وهذه المخلوقاتُ الجديدة كانت بغير حبل سري يمدُّها بالطاقة، كانت ببطارية ملتصقة بها تستمد منها شيئًا فشيئًا، وظهرت حاجة ماسة لأن يتعلم الحاسوب المحمول الاقتصاد في طاقته، فلا يُسرِفُ كما كانت تفعل تلك الجواميسُ الحديدية حتى لا ينفد شحن البطارية في دقائق قليلة، فكان مما لا بُدَّ منه أن ينقضي أمر التشغيل البدائي الذي كان (إما تشغيل تام أو إطفاء تام)، فلم يَعُد يصلح لهذا الأوان، فالبطارية تنفد إن لم يُقتَصد في استهلاكها، يهدأ الحاسوب إذا استرخى صاحبه ولم يستعمل برامجه، ويَغفو إذا طال به السكون، ثم يستيقظ في طرفةِ عين إذا مسَّته يدُ صاحبه، ومن هنا لم يَمضِ الأمرُ طويلاً حتى أتى معيارٌ يُدبِّر هذا الأمرَ على أفضل وجه واسمه: الواجهة المتقدّمة لضبط الطاقة وتهيئة العتاد ACPI.

أتى هذا المعيار ونقل أمر الطاقة من قبضة العتاد الصامت إلى يد نظام التشغيل، ذلك العتاد الذي كان قبل هذا التحول كالسائق الأخرس لا يفهم إلا أمرين: (انطلق أو توقف)، أما القائد الجديد (نظام التشغيل) صار هو المتصرِّف في أحوال الطاقة: (يُنيم الجهاز إذا فَتَر العمل، ويوقظه إذا دُعي، ويُخفِّض الاستهلاك عند الخمول، ويُوقف بعض الأجزاء دون بعض، ويُمهِّد للإيقاف بحفظ العمل وإغلاق البرامج، ثم يأذن للعتاد أن يُنقص التيار إلى أدنى حد).

ومما أتى به هذا المعيار أن جعل الإطفاء على منازل ومراتب بعد أن كانت ضربًا واحدًا (ON/OFF)، ففصَّل أحوال الحاسوب بين اليقظة والسكون، بما سمَّاه (حالاتُ الطاقة)، يُنزِل فيها النظامُ الجهازَ منزلةً بعد منزلة، على تدرُّج وتدبير بحسب ما يقتضيه الحال من عمل وخمول، وهي التي أريدها في مقال اليوم وإن قد أطلتُ عليك وأسهبت في الحديث، فهي التي تخبرك بـ: لِمَ زر الإطفاء Shutdown لا يطفئ الجهاز؟

 

حالات الطاقة

هذه الحالات نظَّمت سلوك الطاقة في الحاسوب وجعلته على حالين، الأول: (حال عملٍ)، والثاني: (حال انقطاع)، وبينهما مراتب من النوم تتفاوت قربًا وبُعدًا من اليقظة، وقسَّم هذا المعيار حالات الطاقة إلى مراتب سماها الحالات العامة Global States، ورموزها من G0 إلى G3، وهي:

أ. حالة العمل G0
ب. حالة السُّكون G1 (تندرج تحتها أربع حالات فرعية)
جـ. حالة الرُّقاد G2
د. حالة الهُمُود (الفصل التام) (Mechanical Off) G3

وهذه الحالات العامة تندرج تحت بعضها حالاتٌ أخرى تفصيلية اسمها حالات السُّكون Sleep States، ورموزها من S0 إلى S5، وهي:
أ. السِّنَة (النوم الخفيف) S1
ب. المعالج مُطفأ (CPU Turned Off) S2
جـ. السُّكون (Suspend to RAM / Standby) S3
د. السبات (Hibernate / Suspend to Disk) S4

ملاحظة: حالة S1 وS2 المذكورتان في المواصفات هما من عهد النشأة الأولى لهذا المعيار، ولا تكاد تجد لهما أثرًا في جهاز حديث صنع بعد سنة 2010، لذلك لن نتعرض لهما.

وحالات السُّكون هذه تندرج تحت الحالة العامة الثانية G1، ولم أذكر حالة خامسة (S5) لاتفاقها مع الحالة العامة الثالثة G2 فهما سواء، وبضعهم يزيد حالة سادسة هي S0، وهي نفسها الحالة العامة الأولى G0، لذا أسقطت ذكرهما (S5/S0) لأن ذكر الحالات العامة يغني عنهما، ودونك هذه الحالات على وجه التفصيل:

(G0/S0): حالة العمل (اليقظة)

هذه هي الحال التي تراها حين تحدق في شاشة جهازك، وفي هذه الحالة تدبيرٌ دقيق في إدارة الطاقة، فالمعالج لا يعمل بكامل قوته على الدوام، المعالج يعلو تارة وينخفض تارة بحسب ما يطلبه منه المستعمل، فحين تكتب نصًا أو تقرأ مقالا ينخفض تردد المعالج ويوفر الطاقة، وحين تشغل لعبة أو برنامجًا ثقيلاً يعود إلى قوته القصوى، والطاقة للأجهزة يتغير مقدارها تبعًا لحاجة المستعمل، إن لم يكن يستعمل الأقراص الضوئية فلن تستهلك طاقة وهكذا…

ملاحظة:

ظهرت حالة جديدة أحدث من G0/S0 تُدعى Modern Standby أو اختصارًا S0ix، تكون في الحواسيب الحديثة، وهي شبيهة بهاتفك: تُطفئ شاشته فيظل يستقبل الرسائل، ثم تلمسه فيفيق. في هذه الحالة يبقى الجهاز تقنيًا في G0/S0، لكن المعالج يدخل في أعمق درجات توفير الطاقة: الجهاز في ظاهره نائم لكنه قادر على استقبال الإشعارات وتحديث التطبيقات وتنزيل البريد الرقمي في الخفاء، وعند فتح الغطاء يستيقظ فورًا.

(G1): حالة السُّكون

هي حال تستهلك فيها الآلة قدرًا يسيرًا من الطاقة يتفاوت بتفاوت مرتبة السُّكون Sleeping States، ولا يؤدي الحاسوب فيها عملا، ويُرى كأنه مطفأ (فلا ضوء في الشاشة ولا نبض)، وتُستأنف حالة عملك قبل السكون لأن عملك والحالة التي كان عليها النظام كله محفوظ.

هذه الحال تجمع مراتب السُّكون الأربع (من S1 إلى S4)، فحين تضغط زر السكون Sleep في النظام فأنت تدخل في واحدة منها، أو حين تثني شاشة حاسوبك، أو تتركه ساعة الغداء = تظن للوهلة الأولى أن الجهاز قد أطفئ: الشاشة سوداء والمراوح تهدأ، والأضواء الصغيرة إما أن تنطفئ أو تومض ومضةً خفيفة، لكن إذا لمسته أو ضغط على زر رأيته يقوم من سكونه، لأنه في مرتبة بين اليقظة والإطفاء. ودونك تفصيل حالات السُّكون، لأن هذا موضعها لاندراجها ضمن هذه الحالة G1:

(S3): السُّكون (Suspend to RAM / Standby)

في هذه الحالة يُطفأ كل شيء ما عدا الذاكرة RAM، وتُفقَد سجلات المعالج والتخبئة Cache، لكن الذاكرة تحتفظ بكل شيء (لذا بعضهم يسميه التعليق للذاكرة Suspend to RAM)، وعند الإيقاظ يعود المعالج إلى عمله في ثوانٍ، وهذه هي حالة السُّكون الحقيقية التي تعرفها، فحين تضغط على زر السكون Sleep في Windows، أو تغطي شاشة الحاسوب، أو تغادر مكتبك ساعة الغداء، فهذه هي S3، فيها الجهاز يبدو مطفأً: المروحة تهدأ والأضواء تخفت والشاشة تسود، لكن الذاكرة (RAM) تظل وحدها مستيقظة بأقل طاقة.

(S4): السبات (Hibernate / Suspend to Disk)

في هذه الحالة تُكتب كل محتويات الذاكرة إلى القرص، ثم يُطفأ كل شيء، حتى الذاكرة نفسها، وعند التشغيل يُقرأ الملف وتُسترجع الحالة، فلا تفقد عملك لو انقطعت الطاقة فجأة أو نفدت البطارية، وهذا هو الفرق الجوهري بينها وبين أختها السابقة S3، فإذا فتحت الجهاز بعد أسبوع ستجد كل نوافذك وبرامجك كما تركتها.

زمن الإيقاظ أبطأ بكثير من S3، لأنها -أي S4- تقرأ الملف الذي حفظته على القرص الصلب، فإن كان القرص من نوع SDD كان أشد سرعة من HDD، واستهلاك الطاقة هنا قليل كذلك، والأجهزة التي تدعم هذه الحالة كثيرة، وهي تسمى في Mac باسم Safe Sleep، وفي لينكس باسم Suspend to Disk.

(G2/S5): حالة الرُّقاد

هذه هي حالة الإطفاء المعهودة التي يعرفها الناس (تضغط زر الإطفاء Start > Shutdown، أو تكتب في لينكس poweroff وتنتظر حتى تهدأ المراوح وتنطفئ الأضواء)، في هذه الحالة البرامج والنظام كله ينطفئ، لا يبقى في الذاكرة ولا المعالج أي أثر محفوظ عند تشغيل النظام ينطفئ، وللعودة من هذه الحالة إلى الحالة الأولى، حالة العمل واليقظة (G0/S0) يحتاج الحاسوب للإقلاع booting إلى النظام، واستهلاك الطاقة في هذه الحالة يكون في أدنى مراتبه غير أنه لا ينعدم، إذ تبقى بعض الدوائر الخفية حيَّةً حياةً ضعيفة!
نعم، كما قرأت، الاستهلاك في أدنى المراتب ولكنه لا ينعدم! أكنت تظن الطاقة انقطعت عنه انقطاعًا تامًّا ها؟
كلَّا! إن هذه الحالة كالجمر تحت الرماد، الحاسوب يُطفأ لكن بقي فيه خيطٌ من الحياة، بقيت فيه بُقية يسيرة من الطاقة تسري فيه، لهذا تستطيع بعض القطع [العتادية] مثل بطاقة الشبكة NIC أن تبقى في حال ترقُّب، تُصغي لما يَرِد عليها من إشارات!

حذارِ! ليس من الآمن تفكيك الآلة في هذه الحال، بسبب التيار الذي يسري فيها، فليس انقطاعًا تامًّا!

(G3): حالة الهُمُود (Mechanical Off)

هذه الحالة هي الغاية في الإطفاء، ومنتهى ما ينتهي إليه السكون!
في هذه الحالة يُفصَل التيار فصلاً تامًّا عن الدوائر، إما بسحب البطارية أو فصل سلك الطاقة (من اسمه الإنجليزي يدلُّ أن بلوغ هذه الحالة يكون بوسيلة حسيَّة ظاهرة)، وهنا لا أثر للحياة ولا أمل في إيقاظ، والجهاز آمن للتفكيك لزوال خطر التيار، فاستهلاك الطاقة معدوم هنا.

وهذا هو الإطفاء الحقيقي لا يحدث إلا حين تسحب البطارية من حاسوبك وتقطع عنه مصدر الطاقة إذا كان مكتبي Desktop لا أن تضغط زر الإطفاء، وحين يدخل الحاسوب في هذه الحالة لا يبقي من الجهاز ما يُصغي أو يستجيب!

جاء في (لسان العرب): الــهُمُودُ الموتُ، كما هَمَدَتْ ثمودُ. وفي حديث مصعب بن عمير: حتى كاد يَهْمُدُ من الجوعِ أَي يَهْلِكُ. وهَمَدَتِ النارُ تَهْمُدُ هُمُوداً: طُفِئَتْ طُفُوءاً وذهبت البتة فلم يَبِنْ لها أَثَر. … الأَصمعي: خَمَدَتِ النارُ إِذا سكَن لَهَبُها، وهَمَدَتْ هُمُوداً إِذا طُفِئَت البتة.

علاقة ما سبق بتقنية WoL

وبعد هذا البيان الطويل للمعيار وذكر الحالات، لعلّه استبان لك الآن حقيقة نوم الحاسوب من يقظته (وكذبة Shutdown)، والغاية من ذكر هذه الحالات أن نقول لك إن تقنية الاستيقاظ Wake-on-LAN لا تعمل إلا في حالاتٍ دون حالات قد مهَّد لها معيار ACPI السبيل بجعل الحاسوب يحتفظ ببقيةٍ من طاقةٍ تسمح له بالعودة من السكون حين يسمع النداء، أي الرزمة السحرية التي هي أساس تقنية Wake-on-LAN، وكما أنها لا تعمل في حال الهُمُود G3 لانعدام التيار الذي تحتاجه بطاقة الشبكة (فنحن لا نحيي من العَدَم)، هي كذلك لا تعمل في حال اليقظة G0 لأن الحاسوب لا يحتاج إلى إيقاظ.

والميدان الذي تجري فيه التقنية يكون في أحوال السُّكون G1، لأنها فيها تعمل في الغالب، ولا سيما في مرتبة السُّكون (التعليق إلى الذاكرة) S3 حيث تبقى بطاقة الشبكة متأهبة تسمع النداء، وقد تعمل في السُّبات S4 في بعض الأجهزة إذا أعددتَ ذلك في إعدادات اللوحة الأم من BIOS/UEFI، وهذا أمر يكثر الاحتياج إليه في الخوادم والأجهزة الملازمة للشبكة.
وأما حال الرُّقاد (G2/S5) ففيها تختلف الأجهزة، فبعضها يدعم الإيقاظ، وبعضها لا يدعمه، وبعض أنظمة التشغيل تمنعه، وتمكينه سنناقشه في الفقرات الآتية.
دونك المُلخَّص:

الحالة هل يعمل WoL؟ بيانٌ موجز للقارئ
اليقظة / العمل (S0) لا حاجة له الجهاز يقظٌ فلا معنى للإيقاظ
السُّكون (S3) نعم، وهو الأشهر هذه هي الحالة المثلى: يبقى قدرٌ من الطاقة يُبقي بطاقة الشبكة في حال ترقّب، لكن احرص على تمكين الإيقاظ من إعدادات النظام وبطاقة الشبكة.
السُّبات (S4) نعم قد يلزم تمكين الخاصية من إعدادات اللوحة الأم (BIOS/UEFI)، لأنها معطلة.
الرُّقاد (G2/S5) يعمل أحيانًا الجهاز مُطفأ ظاهرًا، لكن تبقى دوائر يسيرة حيَّة، لا يُعتمد عليه في كل جهاز، يُفتَّش عنه في إعدادات العتاد لتمكينه في هذه الحالة.
الهُمُود (G3) لا يعمل أبدًا هنا ينقطع التيار من أصله، فلا تبقى حياةٌ ولا ترقّب، ومن ثمّ لا سبيل إلى الإيقاظ عبر الشبكة.

تمكين التقنية في حاسوبك


لتمكين هذه الخاصية شرطين اثنين، وربما تعلق بهما ثالث، وأول شرط أن تدعم اللوحة الأم في جهازك هذه التقنية، بأن تكون ممن يترك بُقية من الطاقة تمر في شرايين بطاقة الشبكة بعد أن ينام الجهاز أو يُطفأ، لذا يتوجب عليك تمكينها من إعدادات BIOS/UEFI.

الشرط الثاني أن تكون بطاقة الشبكة نفسها تدعم هذه التقنية، أن تكون ممن تعرف كيف تمد أذنها في تلك الحال وتسمع النداء. إن وجدتهما، فبشراك، وإن تخلف واحد فالطريق مسدود من أوله.
وكذلك أنت محتاجٌ إلى أن تصل حاسوبك بالشبكة اتصالًا سلكيًّا عبر منفذ Ethernet إلى الموجِّه Router، لأن الرزمة السحرية التي يُعتمد عليها في الإيقاظ إنما تُبثُّ بثًّا مباشرًا، وتعوِّل على بطاقة الشبكة السلكية حين تكون في حال ترقُّبٍ دائم، أما الاتصال غير السلكي Wireless فدونه عقبات، وأغلب بطاقات الشبكة لا تدعمه، وإن أردت التوسع ابحث عن WoWLAN.

ملاحظة: هذه الطريقَةُ إنما توقظ الحاسوبَ من داخل شبكتك البيت لا من خارجها، ولو أردت أن تُوقظَه من مقهى أو مطار أو بلد آخر فذلك باب غير هذا الباب، وحلُّه أن تُقيمَ في بيتك خادومًا صغيرًا (كجهاز Raspberry Pi) يُوصل بالشبكة، فيتلقى النداءَ من البعيد، ثم يُرسله هو إلى حاسوبك النائم من الداخل.

تمكين التقنية من إعدادات BIOS

تدخل إلى BIOS بإعادة تشغيل جهازك وحين يظهر لك شعار الجهاز اضغط على مفتاح معين يظهر لك على الشاشة، وغالبًا ما يكون Delete أو F2، أو أحد مفاتيح F من F1 إلى F12، وهذا أمر متغير بتغير الصانع لجهاز، فابحث عن طريقة ذلك لحاسوبك في الشبكة.

البحث عن الإعداد:
إذا دخلت إلى قائمة BIOS، فابحث عن خيار يُسمى Wake-on-LAN، وقد تجده مكشوفًا واضحًا تحت عنوان إعدادات النوم والإيقاظ (Power Management أو Sleep & Wake)، وقد تجده متخفيًا تحت اسم قريب من “Wake from onboard LAN” أو “PME (Power Management Events)” أو “Power On By PCI/PCIe” أو “Resume by PCI-E Device” أو “Wake by PCI-E”، وذلك لأن بطاقة الشبكة في الأجهزة الحديثة تعمل على ناقل PCI-E، ابحث في كل الإعدادات.

كما ترى في الصورة من لوحة MSI الأم، تجد الإعداد بعنوان “Resume by PCI-E Device” وتحت منه تفسيراً: “Resume from onboard LAN” أي الإقلاع من بطاقة الشبكة المدمجة، فهذا هو بعينه ما نريده. فاجعله Enabled، أي ممكَّن.
وهذا الإعداد كان كل ما احتاج إليه صاحب هذه اللوحة، وربما احتجت أنت إلى إعدادات أخرى تخص النوم أو السبات بحسب نوع جهازك. ولا تضيق ذرعاً إذا اختلفت عليك الأسماء، لأن لكل مصنع له اصطلاحه، وعليك أن تبحث في حدود إعدادات الطاقة عن كل ما يحمل اسم LAN أو Network أو PCI-E أو Wake، وإن وقفت حائرًا ننصحك بالحبث باسم لوحتك الأم أو طراز جهازك في الشبكة.

تمكين التقنية في ويندوز

بعد أن فرغت من إعدادات BIOS، وأذنت اللوحة الأم لبطاقة الشبكة بأن تمد أذنها في النوم واليقظة، يجيء دور نظام التشغيل، لأنه قد يمنعها من العمل، وعليك تفعيلها منه، وهذه الخطوات:

اضغط على قائمة ابدأ، واكتب فيها: إدارة الأجهزة Device Manager، وافتحها.
ثم ابحث في القائمة عن قسم محولات الشبكة Network Adapters، وانقر على السهم الصغير إلى جانبه ليتوسع، فترى قائمة ببطاقات الشبكة في جهازك.
ثم حدد بطاقة الشبكة Ethernet، قد تُسمى عندك بأسماء تختلف باختلاف الصانع: عندي ظهرت باسم Intel(R) Ethernet Connection (4) 1219-LM، وعندك ستكون شبيهة لها، ثم انقر عليها بزر الفأرة الأيمن، ثم اختر خصائص Properties:

في نافذة الخصائص انقر على تبويب متقدم Advanced. ستظهر أمامك قائمة طويلة من الخيارات، ابحث فيها عن خيار اسمه “Wake on Magic Packet” أو “التشغيل عند حزمة سحرية”، وقد يكون باسم “Wake on LAN”. إذا وجدته، فاجعل قيمته Enabled، من القائمة المنسدلة على اليمين:

ملاحظة: قد لا تجد هذا الخيار في بعض البطاقات، ولا يحزنك ذلك، فكثير من الأجهزة تعمل خاصية WoL فيه دون أن يُظهر هذا الخيار أصلاً، كما كان الحال في بعض أجهزة الاختبار التي اعتمدنا عليها، فلا تقلق إن لم تجده، وأكمل الخطوات الباقية.

انقر الآن على تبويب إدارة الطاقة Power Management ستجد فيه خيارين لا بد منهما:

  1. السماح لهذا الجهاز بإيقاظ تشغيل الحاسوب (Allow this device to wake the computer)، اجعله Enable
  2. السماح لحزمة سحرية فقط بإيقاظ تشغيل الحاسوب (Only allow a magic packet to wake the computer)، اجعله Enable

والحكمة من التفريق بين “حزمة سحرية” وغيرها أن تمنع الجهاز من أن يستيقظ على كل نبضة شبكة عابرة (Pattern Match)، فلا يفيق من نومه إلا إذا وردته الرزمة التي تعرفها بتركيبتها الفريدة، وهذا أنقى للجهاز وأبعد له عن الهذيان.

خيار إضافي

قد تختلف الأجهزة في طباعها، فتجد بعضها لا يستجيب للنداء في حال الرُّقاد G2/S5 وإن كان يستجيب في السُّكون G1/S3، وهذه العلة مردها إلى إعدادات الطاقة العميقة.

وأول موضع تفتش فيه هو BIOS نفسه، لعلك تجد فيه خيارات لم نذكرها عنها كإعدادات S4/S5 وErP/EuP، وهذا الأخير لم أشرحه لك، وهي توجيهات أوروبية تطلب أن لا يستهلك الحاسوب في حال الرُّقاد G2/S5 أكثر من نصف وات، ولتحقيق هذا تضطر اللوحة الأم أن تقطع التيار عن بطاقة الشبكة، فإن وجدت في BIOS خيارًا بهذا الاسم، فانظر: إن كان مفعلاً Enabled، فبطاقة شبكتك ميتة لا حياة فيها ولا سمع، وإن أردت إيقاظ حاسوبك من الرُّقاد G2/S5 فاجعله معطلاً Disable، واعلم أن تعطيله يعني أن جهازك سيستهلك في حال إطفائه أكثر مما ترضاه المواصفات الأوروبية، ولكن من باب منفعتك أنت وليس من باب رضاهم هم.

 ثم عليك تعطيل (بدء التشغيل السريع Fast Startup) من لوحة تحكم Windows، تحت: العتاد والصوت > خيارات الطاقة. ثم انقر على اختر ما تفعله أزرار الطاقة، ثم تغيير الإعدادات غير المتاحة، وأزل العلامة عن تشغيل بدء التشغيل السريع. فكم من مستخدم شكا أن هذه الميزة كانت عدو الإيقاظ من G2/S5، والسبب أن الجهاز في هذه الحال ليس في حالة S5، الجهاز في حالة هجينة تشبه S4، وS4 تختلف عن S5 في سلوك الإيقاظ، وبطاقة الشبكة في هذه الحالة قد لا تكون مستعدة بالصورة التي نريدها.

إرسال الرزمة السحرية

وقد فرغنا من تمكين التقنية حان وقت تجربتها لتوقظ حاسوبك بإرسال الرزمة السحرية إليه، ولإيقاظه من جهاز آخر يعمل بنظام Windows فأوصيك ببرنامج WakeMeOnLan من NirSoft، فإنه يمسح الشبكة ويعرض لك قائمة بكل الأجهزة، فلا تحتاج إلى حفظ عنوان IP كل مرة، كل ما تفعله أن تختار الجهاز الذي تريد إيقاظه، واضغط زر الإيقاظ!


وقد تجرب برنامج Depicus كذلك إن كنت تفهم الشبكات، لأنها صعبة وتأبى إلا أن تدخل لها عنوان IP و MAC و Subnet Mask ورقم المنفذ بنفسك، وهو أمر ليس باليسير على مبتدئ.

وأما أجهزة الهواتف فاستعمل برنامج  Mocha WOL لنظام iOS، واستعمل برنامج  Wake On Lan لنظام Android، ابحث عنهما في متجر التطبيقات، والتطبيقات لذلك كثيرة.
إن أحسنت الإعداد = قام الجهاز من رقدته حين تضغط زر الإيقاظ، وإن لم يقم، فارجع إلى إعدادات BIOS و Windows والتطبيق نفسه، وتحقق من كل شيء، وإن لم يعمل معك فراسلنا على صفحتنا في الفيس أو التلجرام:

https://t.me/bassyeorg

تمكينها على لينكس

الأمر أيسر في لينكس من ويندوز، وهو يتم في أوامر قليلة. أول شيء نحدد اسم بطاقة شبكتك بالأمر:

ip link show
# أو بدلاً منها
ip a
# وكذلك:
ip addr show

ابحث عن واجهة الإيثرنت (السلكية)، ومن أسمائها المألوفة: enp0s3، enp3s0، eth0، أو ما يشبهها، وأما الواجهات غير السلكية فتبدأ عادةً بـ wlp أو wlan، واخترنا الواجهة السلكية Etherner لأن تقنية الإيقاظ تعمل بها.

دوِّن اسم الواجهة وعنوان MAC الخاص بها، وستجد عنوان MAC ظاهرًا بجانب link/ether، مثلاً (ac:36:1b:ee:6a:0b).

فحص بطاقة الشبكة

نتحقق الآن أن بطاقة الشبكة تدعم الرزمة السحرية بأداة ethtool، لذا ركِّب أداة ethtool إن لم تكن مركبة في حاسوبك:

sudo apt install ethtool -y

ثم افحص حالة الاستيقاظ الشبكي المحلي Wake-On-Lan لواجهة شبكتك (استبدل enp7s0 باسم واجهة شبكتك التي استخرجناها في الخطوة السابقة):

sudo ethtool enp7s0 | grep -i wake

سيظهر لك سطران مهمان:

Supports Wake-on: pumbg

هذه قائمة بما يدعمه عتادك، والحرف g يعني أنه يدعم الرزمة السحرية وهو ما نريده

Wake-on: d

هذا هو الإعداد الحالي، والحرف d يعني معطل، وإذا ظهر لك g فيعني أن الرزمة السحرية ممكنة Enabled.

تمكينها

الآن بعد أن استوثقنا من أن بطاية الشبكة تدعمها سنمكِّنها بالأمر الآتي (استبدل enp7s0 باسم واجهتك الحقيقية):

sudo ethtool -s enp7s0 wol g

ثم نتحقق من التغيير إن حدث:

sudo ethtool enp7s0 | grep Wake-on

ينبغي أن ترى الآن (Wake-on: g)، فإن ظهر فبطاقة الشبكة وإعداد BIOS مهيآن على أكمل وجه!
لكن… هذا الإعداد سيزول إذا أعدت التشغيل، فعلينا جعلها دائمة، فاكمل الخطوات:

جعلها دائمة

لضمان أن الاستيقاظ الشبكي المحلي WOL يعمل من تلقاء نفسه بعد كل إقلاع = نحتاج إلى إنشاء خدمة systemd، تعمل كل مرة دون تدخل منك. نبدأ الإعداد بإنشاء ملف الخدمة (استمعل أي محرر نصوص تشاء):

sudo nano /etc/systemd/system/wol.service

ثم أضف هذا المحتوى (استبدل enp7s0 باسم واجهتك الحقيقية):

[Unit]
Description=Configure Wake-on-LAN
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -s enp7s0 wol g
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

ثم احفظ الملف بالضغط على Ctrl+X ثم Y ثم زر إدخال Enter
وقد لا يكون مسار أداة ethtool هو (/usr/sbin/ethtool)، فتحقق من بالأمر:

which ethtool

ثم أعد تحميل ومكِّن الخدمة:

sudo systemctl daemon-reload
sudo systemctl enable wol.service
sudo systemctl start wol.service

ثم تحقق منها ليطمئن قلبك:

sudo systemctl status wol.service

(ينبغي أن ترى المخرجات تشير إلى أن الخدمة نشطة active وأن أمر ethtool نُفِّذ.

إرسال الرزمة من لينكس

الآن بعد إتمام الإعدادات حان وقت اختبارها من جهاز لينكس على الشبكة نفسها باستعمال إداة اسمها (etherwake)، وهي أداة تجدها في أي توزيعة لينكس لترسل الرزمة. ركِّب أداة etherwake على الجهاز المُرسِل الذي ستُرسل منه الرزمة:

sudo apt update
sudo apt install etherwake

ثم استعمل هذا الأمر لإيقاظ جهازك:

sudo etherwake -i enp4s65f0 -b TARGET_MAC

استبدل (enp4s65f0) بواجهة الشبكة على جهازك الذي تُرسِل منه الآن (تحقق منها بالأمر ip link show)، واستبدل (TARGET_MAC) بعنوان MAC الخاص بجهازك المراد إيقاظه (مثلاً ac:12:2c:dd:5z:2r). 
إذا وضعت كلمة سر فادخلها بإضافة -p ثم كلمة السر:

sudo etherwake -i enp4s65f0 -b -p SECUREON_PASSWORD TARGET_MAC

استبدل (SECUREON_PASSWORD) بكلمة السر التي وضعتها…

إنشاء برنامج لإرساله

هذه الفقرة لك أيها المُبرمِج، لن نستعمل برنامجًا جاهزًا لإرسالها وسنرسلها بأنفسنا، وقد تأخذ ما ذكرته لك هاهنا وتبني برنامجك الرسومي GUI ليكون بديلاً عربيًّا وتكفينا عناء استعمال برمجيات الغير، فتصنع بيدك ما تريد لا أن تأخذ منهم ما تريد.

لإرسال الرزمة السحرية طريقتين ولكل واحدة مقامُها، الأولى تحتاج صلاحيات الجذر root، لأنك ستبني فيها إطار Ethernet الخام وتودع فيه الرزمة السحرية بنفسك، تكتبه بايتًا بايتًا، ثم تلقي به إلى بطاقة الشبكة رأسًا، والثانية نرسله مغلفا في مِفاق UDP إلى عنوان البث العام للشبكة، ولا تحتاج هاهنا أي صلاحيات الجذر، لأن نظام التشغيل سيتكفل ببناء الإطار بنفسه.

ما أيقظ ريوك تلك الحواسيب إلا بإحدى هاتين الطريقتين، فهل تعلم أيُّها اختار؟
لقد بنى حيلته بالطريقة الثانية، كما قالت بذلك التقارير وليس تخمينًا مني، فقد وثق باحثو CrowdStrike في تقريرهم أن ريوك يُرسل رزمته السحرية عبر مقبس UDP مع تفعيل خيار البث العام SO_BROADCAST إلى المنفذ ٧. واستعماله للثانية في تغلغله أحسن، لأن الحاسوب الذي اخترقه قد يكون حاسوبًا عاديًا لا سلطان لصحابه فيه،  فأي جهاز مُصاب مهما كان متواضعًا يتحول إلى قائد يوقظ جيش النيام من مراقدهم، تلك هي التي انتهزها ريوك!

ملاحظة: الطريقة الأولى التي شرحتها تنفع لنظام لينكس، فإن كان نظامك ويندوز أو ماك فجرب الطريقة الثانية.

كتابة الإطار الخام

هذه هي الطريقةُ الأولى، وهي أصل التقنية، كان المهندسون في AMD وHP حين نشروا وثيقة الرزمة السحرية يتصورون أن من سيُرسِلُها هو مديرُ الشبكةِ على جهاز له السلطانُ الكاملُ على نظامِه، أو أنها ستُرسَلُ من العتاد نفسِه، لذلك بنوها لتكون في صورة: (إطار إيثرنت خام Raw Ethernet Frame)، ومعنى هذا أن الرزمة السحرية لا تُرسَل عبر مِفاق مثل IP (مِفاق الشابكة Interntet Protocol) أو مِفاق UDP كما اشتهر بعدها، ولإرسالها عبر إطار Ethernet خام لا بد قبلها أن تعرف ما هذا الإطار؟ وممَ يتكوَّن؟

ورد الإطار في الوثيقة بهذه الصيغة:

DESTINATION SOURCE MISC FF FF FF FF FF FF [العنوان مكرراً] MISC CRC

وهذه الصيغةُ -الخالية من كلمة السر- تُصَوِّرُ لنا الإطار على أنه تيار من البايتاتِ المتتابعة، سنملأ كل حقل بأنفسنا، ودونك هذه الحقول مفصَّلةً لتفهم معناها:

عنوانُ الوجهة Destination MAC، طوله ٦ بايتات

هو عنوان بطاقة الشبكة التي يُقصَدُ إيقاظُها، وقد يكون عنوان البث العام، لأن بطاقة شبكة الجهاز الراقد وهي في حالة الإصغاء Magic Packet Mode حين يمرُّ بها إطار ما فإنها تفحص عنوان الوجهة في رأس الإطار، فإن كان عنوانها هي (Unicast) أو عنوانَ بث عام Broadcast = شرعت في فحص بقية الإطار وإلا تركته وشأنه، فهذا الحقل أوَّل ما يُقرِّرُ إن كانتِ البطاقةُ ستلتفت إلى الإطار أم ستُهمِلُه.

أي عنوان نضعه نحن؟
في الغالب نضع عنوان البث العام وهو (FF:FF:FF:FF:FF:FF) ولا نضع عنوان الجهاز كما قرَّت بذلك المصادر، وسبب ذلك أن الجهاز النائم عنوانُه معروفٌ لديك، لكن مبدِّل الشبكة Switch قد يكون نَسِيَ مكانَه لأنه لم يَرَ له حركةً منذ أن نام، فإن وضعت عنوان الجهاز وحده (Unicast)، ربما حَبَسَ المبدِّلُ الإطار في منفذٍ خاطئٍ أو أضاعَه، أما إذا جعلت العنوان هو البث العام فأنتَ تقول للمبدِّلِ: “ألقِ هذه الرزمةَ على جميعِ المنافذِ”، وهكذا تَصِلُ لا محالةَ إلى الجهازِ النائمِ فيستيقظُ حيثُ كان.

عنوانُ المرسل Source MAC، طوله ٦ بايتات

هو عنوانُ الجهازِ الذي يُرسِلُ الرزمةَ السحريةَ (عنوان جهازك)، وهذا الحقلُ لا تحتاج إليه البطاقة النائمة في عملِها، لكنه من آداب الإرسال في الشبكة (تعرفه حين نواصل الغوص في دروس الشبكات).

حقلُ النوع Ethertype، طوله بايتان

هذا الحقل يقع بعد عنواني الوجهة والمصدر، وقبل الحمولة Payload التي يحملها الإطار (وفيها الرزمة السحرية)، ومهمته أن يُخبِر الجهاز المُستقبِل بأي مِيفاق تُغَلَّفُ به الحمولةُ؟ أهو IP فتكون قميته (0x0800)؟ أم هو ARP لتكون قيمته (0x0806)؟ أم بغيرهما؟

ولكن الرزمة السحرية لا تحتاجُ إلى هذا الحقل! فهي في حقيقتِها لا تَنتمي إلى IP ولا إلى ARP، إنما هي “بيانات خام” تبحثُ فيها بطاقة الشبكة عن النمط الخاص للرزمة السحرية، غير أن الإطارَ لا يصحُّ هيكله دون هذا الحقل لأن المواصفات توجب وجوده، وكثيرٌ من المبرمجين يضعون فيه القيمة (0x0842)، وهي قيمة غير مسجلة، شاعت في الرزم السحرية.

الحمولة Payload، وطولها ١٠٢/١٠٨ بايت

هذا صلب الموضوع! هنا ترقد الرزمة السحرية! فالحمولة ما يحملها الإطار، ونحن سنضع الرزمة السحرية هنا: ستةُ بايتاتٍ قيمتُها FF، يليها عنوانُ الجهاز المُراد إيقاظه مكررًا ١٦ مرة [ثم ٦ بايتات لكلمة السر إن وُجِدَت].
بطاقة الشبكة النائمة لا تنظر إلى غير هذا القسم حين تبحث عن النمطِ المخصوص، وباقي الحقول الآنفة واللاحقة كلُّها غلافٌ يفرضه الإطار، وغايته إيصال هذه الحمولة إلى الوجهة التي نصبو إليها!

تتابعُ فحصِ التكرارات CRC، طوله ٤ بايتات

هذه الأربعةُ بايتاتٍ هي خاتمةُ الإطارِ ومصداق صِحَّتِه، وتضيفها بطاقة الشبكة المُرسِلةِ من تلقاء نفسها في آخر الإطار والبرمج لا يحتاج إلى وضعه بنفسه، فإذا وصلَ الإطارُ إلى الجهةِ المُستَقبِلَة، أعادت بطاقتُها حسَابَها لتتحقق منه، فإن طابق ما حسبته ما وَرَدَ في الإطارِ = عَلِمَتْ أن الإطارَ لم يَتَعَرَّض للتلفِ أثناءَ السيرِ في الأسلاكِ، وإلا رفضته وألقته غير عابئة به، والبرمج لا يحتاج إلى حسابه بنفسه،

كلمة MISC في سطر الوثيقة: تعني “ما سِوى ذلك” من حقول الإطار التي لا تعنينا في هذا المقام، إما لأنها تثبتُ بقيمٍ افتراضية، وإما لأن العتادَ يكتبُها من تلقاءِ نفسِه وليس في شرحها فائدة لإرسال الرزمةِ السحريةِ.

برمجته بلغة بايثون

رأيت فيما سبق أن الرزمة السحرية ليست إلا ستةَ بايتاتٍ قيمتُها FF، ثم عنوانُ الجهاز المُراد إيقاظه مكررًا ١٦ مرة، ثم توضع داخل هيكل اسمه إطار الإيثرنت Ethernet Frame، وها قد فرغنا وشرحنا النظري وحان وقت تطبيقه عمليًّا، وإليك تفصيله بلغة بايثون في لينكس!

وظيفة صنع الرزمة السحرية

أولًا نكتب وظيفةً Function تصنع لنا الرزمة السحرية، هذه الوظيفة تستقبل مُدخلًا واحدًا هو عنوان MAC الجهاز، ويكون على هيئة أزواج تفصل بينهما شرطة أو نقطتين رأسيتين، مثل هذه:

AA-BB-CC-DD-EE-FF
AA:BB:CC:DD:EE:FF

نأخذها ونهذبها بحذفها لتصير بهذه الصيغة:

AABBCCDDEEFF

بعد ذلك نأخذها ونحولها إلى بايتات باستعمال bytes.fromhex، وذلك لأننا قلنا سننشئ إطار إيثرنت خام، لذا ستكون الوظيفة كاملة (ادرسها وراجعها ستنفعك):

import socket
import fcntl
import struct
# import logging

# Setup logging
# logging.basicConfig(level=logging.DEBUG)

def create_magic_packet(mac_address):
    """Create a magic packet for the given MAC address."""

    # Remove any separation characters from the MAC address
    mac_address = mac_address.replace(":", "").replace("-", "")

    # Verify length of MAC address
    # if len(mac_address) != 12:
        # raise ValueError("Invalid MAC address format")

    # Create the magic packet by repeating the MAC address 16 times
    mac_bytes = bytes.fromhex(mac_address)
    magic_packet = b'xff' * 6 + mac_bytes * 16

    return magic_packet

هذه الوظيفة تصنع الرزمة السحرية بلا إضافة كلمة سر لها، أترك لك فعل ذلك.

وظيفة استخراج عنوان MAC المُرسِل

الآن نكتب وظيفة أخرى تستخرج عنوان MAC للجهاز المُرسِل (أي هذا الجهاز) على لينكس، عمل هذه الوظيفة أن تسأل نظام التشغيل وتقول له: ما عنوان MAC لواجهة الشبكة هذه؟
الوظيفة كاملة:

def get_mac_linux(iface: str) -> bytes:
    """Extract MAC address of a network interface on Linux (reliable method)"""
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        req = struct.pack('256s', iface.encode()[:15])
        mac = fcntl.ioctl(s.fileno(), 0x8927, req)[18:24]  # SIOCGIFHWADDR = 0x8927
        return mac

أولًا أنشأنا مِقبَسًا Socket، والمِقبَس في عالم البرمجة هو بابٌ يفتحُه البرنامجُ ليُكلِّمَ به نواة النظام، وأمَّا AF_INET و SOCK_DGRAM فهما عنوانان يُخبرانِ النواةَ بأنَّ هذا الباب سيُستمعل للحديث بلغة UDP (أي إرسال رسائل دون انتظار رد)، لكننا هنا لا نريد أن نرسل شيئًا، كل ما نريد هو أن نفتح الباب لنسأل.
ثم حضَّرنا ورقة السؤال في هذا السطر:

struct.pack('256s', iface.encode()[:15])

هنا نكتب اسم الواجهة (مثلاً eth0) على ورقة طولها ٢٥٦ خانة، ونملأ ما تبقى من الخانات أصفارًا، لأن النواة تطلب أن تكون بهذه الصيغة، وهذه الورقة هي سؤالُنا الذي سنُلقيه إلى النواة: “حدثيني عن هذه الواجهة”.
ثم ألقينا السؤال إلى النواة بهذا السطر:

mac = fcntl.ioctl(s.fileno(), 0x8927, req)[18:24]

الرقمُ (0x8927) هو رقم الأمر الذي يأمر النواة: “اقرأ لي عنوان العتاد MAC لهذه الواجهة”. وهو أمر تعرفه النواة فتجيب عليه بالعنوان، ثم أن جواب النواة (وهو عنوان MAC) محصور في خاناتٍ محددةٍ من الورقةِ، والخاناتُ تلك من ١٨ إلى ٢٤، وهي التي تحتوي على الستة بايتات التي تُشكِّل العنوان، فنقطع هذا العنوان ونأخذ المقطع هذا لا غير، وضحت الوظيفة؟
اعذرني لو كان الشرح مقتضبًا سريعًا، فإني لو شرحت كل هذا لطالت المقالة كثيرًا فوق طولها، لأن هذه المواضيع تتفرع وتتشعب، وكل غايتي منه التقريب والتسهيل لك، فخذه ومرره للذكاء الصناعي يزيدك بيانًا وتفصيلًا إن أردت التعلم..

وظيفة الإرسال

بعد أن فرغنا من صنع الرزمة السحرية ثم استخراج عنوان MAC المرسل حان وقت إرسالها، وسنكتب لذلك وظيفة إرسال، سأعطيك هي كاملة ثم أعلق عليها قليلا:

def send_magic_packet(mac_address, iface="eth0"):
    try:

        magic_packet = create_magic_packet(mac_address)

        # Create a raw socket
        sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
        # logging.debug(f"Binding to interface: {iface}")
        sock.bind((iface, 0))

        # Log the packet for debugging
        # logging.debug(f"Sending Magic Packet: {magic_packet.hex()} on interface {iface}")

        # Construct the Ethernet frame (magic packet)
        dest_mac = b'xffxffxffxffxffxff'  # Broadcast MAC address
        src_mac = get_mac_linux(iface)  # Source MAC address of the interface (reliable method)
        ether_type = struct.pack('!H', 0x0842)  # Wake-on-LAN
        frame = dest_mac + src_mac + ether_type + magic_packet

        # Send the Ethernet frame
        sock.send(frame)
        sock.close()
        # logging.debug(f"Magic packet sent to {mac_address} on interface {iface}")
    except Exception as e:
        logging.error(f"Failed to send WoL packet: {e}")

تفتح الوظيفة مِقبسًا (بابًا) إلى بطاقة الشبكة، والنوع AF_PACKET يعني: “أريد أن أخاطب بطاقة الشبكة رأسًا، لا أن أرسل عبر الشابكة Internet”. والنوع SOCK_RAW من اسمه يعني: “سأكتبُ الإطار [الخام] بنفسي، لا تتدخل يا نظام التشغيل”.
وهذا السطر:

sock.bind((iface, 0))

يعني: “يا نظام التشغيل خذ هذا المقبسَ الذي فتحتُه واجعله مرتبطًا حصرًا بطاقة الشبكة التي أسميها iface (مثلاً eth0)، ولا تستعمل معه أي بطاقة أخرى، ثم أرسل به دون انتظار رد”.
ثم نكوِّن إطار الإيثرنت الخام كما شرحت تفاصيله، وبعدها نرسله sock.send(frame) وبعدها نغلق هذا الباب الذي فتحناه sock.close()، هذا كل شيء باختصار، وستحتاج لتشغيله صلاحيات الجذر في لينكس.
البرنامج كله:

import socket
import struct
import fcntl

# import logging

# Setup logging
# logging.basicConfig(level=logging.DEBUG)

def get_mac_linux(iface: str) -> bytes:
    """Extract MAC address of a network interface on Linux (reliable method)"""
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
        req = struct.pack('256s', iface.encode()[:15])
        mac = fcntl.ioctl(s.fileno(), 0x8927, req)[18:24]  # SIOCGIFHWADDR = 0x8927
        return mac

def create_magic_packet(mac_address):
    """Create a magic packet for the given MAC address."""

    # Remove any separation characters from the MAC address
    mac_address = mac_address.replace(":", "").replace("-", "")

    # Verify length of MAC address
    # if len(mac_address) != 12:
        # raise ValueError("Invalid MAC address format")

    # Create the magic packet by repeating the MAC address 16 times
    mac_bytes = bytes.fromhex(mac_address)
    magic_packet = b'xff' * 6 + mac_bytes * 16

    return magic_packet

def send_magic_packet(mac_address, iface="eth0"):
    try:

        magic_packet = create_magic_packet(mac_address)

        # Create a raw socket
        sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
        # logging.debug(f"Binding to interface: {iface}")
        sock.bind((iface, 0))

        # Log the packet for debugging
        # logging.debug(f"Sending Magic Packet: {magic_packet.hex()} on interface {iface}")

        # Construct the Ethernet frame (magic packet)
        dest_mac = b'xffxffxffxffxffxff'  # Broadcast MAC address
        src_mac = get_mac_linux(iface)  # Source MAC address of the interface (reliable method)
        ether_type = struct.pack('!H', 0x0842)  # Wake-on-LAN
        frame = dest_mac + src_mac + ether_type + magic_packet

        # Send the Ethernet frame
        sock.send(frame)
        sock.close()
        # logging.debug(f"Magic packet sent to {mac_address} on interface {iface}")
    except Exception as e:
        logging.error(f"Failed to send WoL packet: {e}")

# Example usage
# send_magic_packet("AA:BB:CC:DD:EE:FF")

إرسالها عبر مِيفاق UDP

لعل الطريقة الآنفة متعبة حين تبني الإطار بنفسك ثم تعطيه الصلاحيات، وتريد الآن أن ترسل الرزمة السحرية دون أن تتولَّى بناء الإطار بكامله ودون أن تحتاج إلى صلاحيات الجذر، وذلك بأن تُغَلِّفَ الرزمة داخل رسالة UDP، وتلقي بها إلى عنوان البث العام للشبكة، وهذه الطريقة هي التي تستعملها أكثر تطبيقات الإيقاظ الشبكي المنتشرة بين الناس، وكذلك التي استعملها ريوك.

نبدأ أولًا بصناعة الرزمة السحرية، وهي الوظيفة نفسها لم تتغير، بنفس المنطق، لأن جوهر التقنية واحد.
ثم -وهنا الفرق- سنبني رسالة UDP صغيرة بدلًا من بناء الإطار بأنفسنا، ونرسلها عبر TCP/IP Stack العادي (وهذا أمر سندرسه في دروس الشبكات إن شاء الله)، وتتم الخطوات بفتح مقبس UDP عادي لا خام:

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

هذا المقبس لا يحتاج إلى صلاحيات الجذر لأن نظام التشغيل هو الذي سيتولَّى بناء إطار الإيثرنت الخام نيابة عنا.

بعد ذلك نحدد عنوان البث العام:

   broadcast_address = "255.255.255.255"
   port = 9  # أو 7، بحسب ما يَقبلُه الحامي Firewall

ثم نخبر المِقبس أننا نريد أن نرسل إلى عنوان البث العام:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

ثم نرسلها:

   sock.sendto(magic_packet, (broadcast_address, port))

وهنا نرسل الرزمة السحرية على أنها حمولة UDP، ومن سيبني الإطار اللازم سيكون نظام التشغيل، سيضع عنوان الوجهة (وهو عنوان البث العام FF:FF:FF:FF:FF:FF)، ويضع لنا عنوان المصدر (وهو عنوان جهازنا، لأنه المُرسِل)، ويضع كل شيء نيابة عنا، وهو يعمل على جميع أنظمة التشغيل، وليس مثل الطريقة الأولى محصورة بلينكس!

هاك هو كاملا:

import socket

def create_magic_packet(mac_address: str) -> bytes:
    """
    Create a magic packet (synchronization stream + target MAC repeated 16 times).
    
    Args:
        mac_address (str): MAC address in formats like AA:BB:CC:DD:EE:FF or AA-BB-CC-DD-EE-FF
        
    Returns:
        bytes: The magic packet (102 bytes, or 108 with optional password)
    """
    # Remove any separation characters
    cleaned = mac_address.replace(":", "").replace("-", "")
    
    # Convert hex string to bytes (6 bytes)
    mac_bytes = bytes.fromhex(cleaned)
    
    # Build the magic packet: 6x 0xFF + (MAC × 16)
    magic_packet = b'xff' * 6 + mac_bytes * 16
    
    return magic_packet

def send_magic_packet_udp(mac_address: str, broadcast_address: str = "255.255.255.255", port: int = 9) -> bool:
    """
    Send a Wake-on-LAN magic packet using UDP broadcast.
    Works on Windows, Linux, and macOS without root/admin privileges.
    
    Args:
        mac_address (str): Target MAC address
        broadcast_address (str): Broadcast IP address (default: 255.255.255.255)
        port (int): UDP port (7 = old, 9 = modern default)
        
    Returns:
        bool: True if sent successfully, False otherwise
    """
    try:
        # Create the magic packet
        magic_packet = create_magic_packet(mac_address)
        
        # Create a regular UDP socket (not raw)
        with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
            # Enable broadcast mode
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
            
            # Send the packet to the broadcast address
            sock.sendto(magic_packet, (broadcast_address, port))
        
        return True
        
    except Exception as e:
        print(f"Failed to send WoL packet: {e}")
        return False

# Example usage
if __name__ == "__main__":
    # Replace with your target MAC address
    target_mac = "AA:BB:CC:DD:EE:FF"
    
    # Send the magic packet
    success = send_magic_packet_udp(target_mac)
    
    if success:
        print(f"Magic packet sent successfully to {target_mac}")
    else:
        print(f"Failed to send magic packet to {target_mac}")

ختامًا – لا تنسونا من دعائكم

ها قد وصلنا إلى نهاية المقال، وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق، وأرجو أنني قد وفّقت في الشرح.

وفي نهاية الأمر، لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال،
وأني لبشر أصيب وأخطئ، فإن وفقت في طرح الموضوع فمن اللّٰه عز وجل، وإن أخفقت فمن نفسي والشيطان.

🙏 أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في قناتنا على التلجرام أو في حسابنا على الفيسبوك.

 

🧠🎮 سيرفرنا الموقر
ما بين فك الشفرات، الكريدت، ودهاليز الألعاب الرقمية… نحن نبعسس لخدمتك!

وجهتك الشاملة لفتح الشفرات، شحن الكريدت، إزالة الحسابات، وخدمات الألعاب الرقمية – لأنك تستحق الأفضل!
منصة موحدة – بخدمة فورية واحترافية.

جرّب السيرفر الآن
هل لديك إستفسار ؟

اكتب رسالتك

4 + 4 =