لا تحتاج المتحكِّمة الدقيقة المزوَّدة بوحدة Wi-Fi بمنفذ UART إلى تنفيذ VPN للوصول إلى خدمة تقع خلف واحد. فالوحدة تشغّل أصلًا حزمة TCP/IP وتعرض المقابس عبر المنفذ التسلسلي، ويمكن لبوابة على الشبكة المحلية نفسها أن تحمل ذلك التراسل عبر النفق. ولا ينجح التصميم إلا إذا استطعت الإجابة عن أربعة أسئلة بالترتيب، فتعامل معه كقائمة تحقق: العنوان، والمقبس، والمسار، والحد. توقّف عند أول بوابة تفشل، لأن ما يليها لا يستطيع تعويضها.

أسند مهمة واحدة لكل طبقة

يحمل رابط UART أوامر AT والحمولة بين المتحكِّمة والوحدة. تنضم الوحدة إلى شبكة Wi-Fi وتملك اتصال IP، بما في ذلك عنوان مصدره. أما البوابة فتملك النفق وبيانات الاعتماد وسياسة التمرير. وفصل هذه المهام هو ما يجعل التصميم قابلًا للتنقيح في كل مرحلة.

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

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

هل تستطيع البوابة تسمية عنوان الوحدة؟

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

AT+CWMODE=1
AT+CWJAP="lab-wifi","passphrase"
AT+CIPSTA?
AT+CIPMUX=0

يحافظ وضع الاتصال المفرد على بساطة تسلسل الأوامر، وهو نقطة البداية الصحيحة لحسّاس واحد يتحدث إلى خدمة واحدة. أما وضع الاتصالات المتعددة فيغيّر صياغة كل أمر لاحق، فحدِّد في أي وضع أنت قبل أن تنسخ مثالًا من إصدار برنامج ثابتي آخر.

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

بعد تحديد العنوان والوضع، تستطيع الوحدة فتح اتصال TCP بالخدمة الخاصة. والعنوان أدناه مثال من نطاق توثيقي؛ استبدله بعنوانك واحتفظ بالشكل نفسه.

AT+CIPSTART="TCP","10.90.0.20",9000
AT+CIPSEND=18
{"t":21.4,"rh":48}

ما يفعله أمر AT ذلك هو فتح مقبس TCP عادي، والمقبس ليس نفقًا: لا شيء فيه ينشئ VPN ولا شيء فيه يشفّر الحمولة. ووضع TLS في البرنامج الثابت ميزة منفصلة لها أمرها الخاص ومعالجتها للشهادات، وقد لا تدعم وحدة UART عشوائية أيًّا منهما. راجع مرجع أوامر AT لـTCP/IP الخاص ببرنامجك الثابت بدلًا من افتراض أن الصياغة أعلاه تنطبق عليه.

يجب أن يطابق طول الحمولة في AT+CIPSEND ما ترسله فعلًا، وإلا انتظرت الوحدة بايتات لا تصل أبدًا وبدا الاتصال معلّقًا. ذلك الفشل يبدو مشكلة شبكة، وهو في الغالب خطأ بمقدار واحد في الطول.

وجّه الاتصال عبر البوابة

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

ip route get 10.90.0.20
sudo tcpdump -ni wg0 'host 10.90.0.20 and port 9000'
sudo conntrack -L | grep 9000

راقب مسار العودة أولًا. فالحزمة الممرَّرة التي تصل إلى الخدمة ولا تعود أبدًا تُنتج مهلة في الوحدة دون أي خطأ على البوابة، وهذا يدفع الناس إلى فحص رابط Wi-Fi لساعات. ومدخل conntrack يخبرك هل رأت البوابة الرد أصلًا.

حدِّد أين ينتهي النفق فعلًا

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

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

سجّل الإجابات الأربع معًا: عنوان الوحدة، وهدف المقبس، ومسار البوابة، ومكان بدء التشفير. فالشخص التالي الذي ينقّح هذا الجهاز سيحتاجها جميعًا، ولا يمكن استنتاج أي منها من البرنامج الثابت وحده.

مقالات ذات صلة