MySQL localhost عبر VPN: لا يزال يعني العملية المحلية
قاعدة البيانات التي يسميها التطبيق localhost موجودة على الخادم لا على حاسوبك المحمول. استخدم المستمع الخاص أو نفق SSH، ثم أجبر العميل على TCP.
يتصل التطبيق على خادم المكتب بـ MySQL عند localhost، فتنسخ اسم المضيف ذلك إلى عميل سطح مكتب، فتفشل الاتصال أو تفتح قاعدة بيانات أخرى. لم يغيّر VPN شيئًا في معنى الكلمة: لا يزال localhost يشير إلى الجهاز الذي يشغّل العميل. فقد نقل VPN الحزم لا الواجهات. حدّد الطرف الذي ينبغي أن يصل إليه الحاسوب المحمول قبل أن تلمس أي مسار.
الخطوة 1: حدّد الطرف الذي ينبغي أن يصل إليه الحاسوب المحمول
تصميمان مشروعان ويجيبان عن سؤالين مختلفين. الوصول المباشر يعني أن قاعدة البيانات تستمع على عنوان خاص يستطيع النفق الوصول إليه، ويتصل الحاسوب المحمول بذلك العنوان. الوصول المُمرَّر يعني أن قاعدة البيانات تبقى على loopback وتحمل جلسة SSH المنفذ إلى جهازك. اختر واحدًا عن قصد، لأن خلطهما ينتج اتصالًا يعمل للسبب الخطأ.
للوصول المباشر، احصل على الاسم أو العنوان الخاص بمضيف قاعدة البيانات ومنفذه من الجهة التي تديره. عنوان بوابة VPN ليس عنوان قاعدة البيانات ما لم يكن الجهاز نفسه. ثم تأكد من أن المستمع مرتبط فعليًا بتلك الواجهة، لأن المسار إلى واجهة لا ينشئ مستمعًا عليها.
الخطوة 2: مرّر المنفذ فقط إذا بقي المستمع محليًا
إذا كان ينبغي أن تبقى قاعدة البيانات على loopback فقط، فمرّرها عبر SSH واربط الطرف المحلي بـ loopback أيضًا. عنوان الربط على اليسار يخص حاسوبك المحمول؛ والهدف على اليمين يُفسَّر من جهة خادم SSH، كما يوضح مرجع OpenSSH. وعكس هذين الدورين هو السبب المعتاد في أن التمرير يبدو عاملًا لكنه لا يتصل بشيء.
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:13306:127.0.0.1:3306 [email protected]
ss -ltn 'sport = :13306'
إذا وصل SSH إلى مضيف قفز لا إلى مضيف قاعدة البيانات، فإن loopback على اليمين يشير إلى مضيف القفز، ويجب أن يتغير الهدف إلى عنوان يستطيع ذلك المضيف الوصول إليه. يلتقط ExitOnForwardFailure فشل إنشاء التمرير، لكنه لا يثبت نجاح الاتصالات اللاحقة بالهدف. أبقِ فحص مفتاح المضيف مفعّلًا، ولا تعرض منفذ التمرير على شبكتك المحلية كلها بربطه بجميع الواجهات.
توقف إذا كان يجب أن تبقى قاعدة البيانات على loopback فقط ولا تستطيع استخدام SSH. الوصول المباشر حينها تصميم خاطئ، لا إعداد يُفرض.
الخطوة 3: أجبر العميل على TCP
على Unix، يختار عميل MySQL الذي يُعطى localhost مقبس Unix افتراضيًا، لذا فإن تغيير المنفذ وحده قد يتركه يبحث عن مقبس لا علاقة له بتمريرك. استخدم بروتوكول TCP الصريح وعنوان loopback لجعل العميل يفتح اتصالًا بمنفذ التمرير.
mysql --protocol=TCP --host=127.0.0.1 --port=13306 --user=DB_USER --password
خيار كلمة المرور بلا قيمة يطلب الإدخال بدلًا من وضع السر في سطر الأوامر، وهذه عادة تستحق الإبقاء. لأدوات أخرى مفتاحها الخاص للتمييز نفسه، وبعض برامج التشغيل تعامل localhost معاملة خاصة أيضًا. تحقق مما يفعله عميلك بدلًا من افتراض أن العلامة انتقلت. يحتاج حساب قاعدة البيانات أيضًا إلى منح يطابق المصدر الذي يراه الخادم، وهو مضيف التمرير لا حاسوبك المحمول.
توقف إذا تعذر إجبار الأداة على TCP. استخدم حينها عميلًا آخر، أو استخدم الوصول المباشر إلى المستمع الخاص.
الخطوة 4: أثبت الطرف الذي وصلت إليه فعلًا
اسأل الخادم عمّا يظنه الاتصال. تخبرك متغيرات اسم المضيف والمنفذ والمقبس هل وصلت عبر TCP وأي مستمع أجاب، وتعرض قائمة الاتصالات عنوان المصدر الذي سجله الخادم. تلك الأدلة أنفع من تغيير مسار آخر.
mysql --protocol=TCP -h 127.0.0.1 -P 13306 -u DB_USER -p -e "SELECT @@hostname, @@port, @@socket"
سجّل الطرف الذي حاولت: مقبس Unix محلي أو منفذ التمرير أو المستمع الخاص. لهذه الإخفاقات الثلاثة إصلاحات مختلفة، وتغيير مسار VPN بينما لا يزال العميل يتحدث إلى localhost الخطأ جهد مهدور. أبقِ مصادقة SSH ومصادقة قاعدة البيانات منفصلتين في الملاحظات أيضًا، لأن الفشل في إحداهما يبدو كفشل في الأخرى من عميل سطح مكتب. ثم أزل التمرير عندما تنتهي منه.
تنتهي القائمة عندما تستطيع تسمية الطرف وبروتوكول العميل وعنوان المصدر الذي رآه الخادم والمنح الذي سمح به. أربع حقائق، وتصبح مشكلة الاتصال التالية دقائق لا بعد ظهر كامل.