وسيط البث في Nginx لـ UDP في OpenVPN: ما الذي يغيّره
UDP لا مكان له داخل location في HTTP. انقله إلى طبقة stream، واضبط مهلة الجلسة بالنسبة إلى VPN، وتوقّع أن يكون الوسيط هو المصدر.
عميلك مضبوط على UDP، وخادم Nginx لديه كتلة location تشير إلى منفذ VPN، ولا يصل شيء. هذا متوقّع: لا يمكن لـ location في HTTP أن يحمل حزمة UDP، أياً كانت تسمية الواجهة. يحتاج Nginx إلى مستمع stream لهذا، وبمجرد نقل الإعدادات إلى هناك، تحدد مجموعة ثانية من التفاصيل ما إذا كانت الجلسة ستصمد.
طبقة الوسيط تأتي قبل العنوان
وحدة stream في Nginx توكّل TCP وUDP دون تحليل HTTP. أما وحدة HTTP فتتوقع سطر طلب وترويسات واستجابة، ولا تحتوي حزمة OpenVPN الأصلية على أيٍّ منها. اختيار الطبقة هو القرار الأول لذلك، وهو مستقل عن كون المستمع IPv4 أو IPv6.
الإعداد الذي يبدو ناجحاً مع OpenVPN عبر TCP لا يقول شيئاً عن حالة UDP. النقل هنا جزء من البروتوكول، وليس تفصيلاً من تفاصيل النشر.
المستمع والخادم الخلفي
nginx -V 2>&1 | tr ' ' '\n' | grep stream
stream {
server {
listen [::]:1194 udp reuseport;
proxy_pass [2001:db8::20]:1194;
}
}
تأكد من أن البناء يتضمن وحدة stream قبل تحرير أي شيء؛ فقد تقسّم حزمة التوزيع الوحدة في وحدة منفصلة، وغياب الوحدة ينتج خطأ إعداد لا نفقاً. ضع الكتلة في سياق الإعداد الرئيسي، لا داخل http، واستبدل عنوان التوثيق بالخادم الخلفي الحقيقي.
على المسارين وعلى الجدارين الناريين أن يسمحا بالحزم: المسار إلى المستمع والمسار من الوسيط إلى الخادم الخلفي. كما أن مستمع IPv6 لا ينشئ مسار IPv4، فإذا كان بعض العملاء لا يزالون يستخدمون IPv4، فإن ذلك المستمع مدخل منفصل باختباره الخاص. افحص جدار الحماية الخاص بالخادم الخلفي من عنوان الوسيط، لا من حاسوبك المحمول.
مهل الجلسة ليست مهل الطلبات
يحتفظ وسيط stream بحالة الجلسة UDP ويتخلص منها وفق مهلة الإعدادات الخاصة به وإعدادات الاستجابة. والمهلة القصيرة المنسوخة من وسيط DNS تناسب شبكة VPN تتوقع تبادل الحزم لساعات تناسباً رديئاً، ويظهر الفشل كاتصال يموت بهدوء لا كاتصال يرفض البدء.
اقرأ قيمة proxy_timeout الفعلية في النشر وأي إعداد لعدّ الاستجابات، ثم قارنها بسلوك keepalive الذي تستخدمه VPN فعلاً. رقمان مكتوبان في ملفين مختلفين بأيدي أشخاص مختلفين هما الحالة الطبيعية لنظام يعمل. ورقمان لم يُقارنا قط هما الحالة الطبيعية لنظام متقطع. اكتب الرقمين في سجل الخدمة حتى تتم المقارنة مرة واحدة، في وضح النهار.
ما يغيّره الوسيط وما لا يغيّره
لا ينهي وسيط stream قناة تحكم TLS الخاصة بـ OpenVPN ولا يحوّلها إلى HTTPS. يبقى الخادم الخلفي هو خدمة VPN، وتبقى علاقة الشهادة بين العميل وتلك الخدمة. والحفاظ على هوية الخادم الخلفي المقصودة يبقى مهمة العميل والخادم.
الوسيط العادي يغيّر أيضاً عنوان المصدر الذي يراه الخادم الخلفي. ستظهر السجلات الوسيط، وأي قاعدة وصول قائمة على IP على خادم VPN ستقيّم ذلك العنوان بدلاً من عنوان العميل. الحفاظ الشفاف على المصدر تصميم توجيه وصلاحيات منفصل، وليس شيئاً ينتج عن إضافة udp إلى مستمع. خطط لذلك قبل كتابة سياسة تعتمد على عنوان العميل.
تحقق من العميل، لا من المنفذ
الفحص المحلي لكون منفذ UDP مفتوحاً يثبت وجود المستمع. ولا يثبت أن عميلاً يستطيع المصادقة عبره أو مواصلة تبادل الحركة. أكمل اتصالاً حقيقياً من عميل معتمد، ثم تأكد من بقاء الجلسة مدة كافية لتكون ذات معنى.
حين يُبلّغ أحدهم بأن Nginx لا يستطيع UDP لأن أداة ترحيل بسيطة نجحت بدلاً منه، فإن الحقيقتين غير مرتبطتين. أثبتت الأداة أن الخادم الخلفي يستجيب؛ ولم تقل شيئاً عما تدعمه الواجهة. يمكن أن تكونا صحيحتين، وواحدة فقط منهما إعداد صالح لهذا النشر.