حركة مرور أحادية الاتجاه بعد تعطيل SNAT لشبكة Tailscale الفرعية
أوقف SNAT على موجه شبكة فرعية في Tailscale، فتتوقف الردود عن الوصول. يبقى عنوان المصدر الحقيقي، لذا تحتاج الشبكة المحلية إلى مسار عودة إلى 100.64.0.0/10.
أوقف NAT المصدر على موجه شبكة فرعية في Tailscale، فيبقى النفق يعمل بينما تتوقف الاتصالات عبره. تصل الطلبات إلى الوجهة حاملةً عنوان الطبقة العلوية الخاص بالعميل البعيد، وهو بالضبط هدف التغيير، والردود الآن تحتاج مساراً لم تكن الشبكة المحلية مضطرة إلى معرفته. من دون ذلك المسار تهبط الحزم، وتغادر الردود عبر البوابة العادية، وتظهر المشكلة كعطل في الجدار الناري لا يفسره أي قاعدة من قواعده. النفق سليم؛ والجزء العائد مفقود.
ما كان SNAT يخفيه
مع تمكين SNAT، يعيد الموجه كتابة عنوان المصدر إلى عنوان الشبكة المحلية الخاص به قبل التمرير إلى الشبكة الفرعية، فترد الوجهة على مضيف تعرف أصلاً كيف تصل إليه ولا يحتاج أي شيء آخر إلى ضبط. أما تعطيله فيحافظ على المصدر الأصلي، فترى الوجهة عنواناً داخل نطاق الطبقة العلوية بدلاً من جار على سلكها. ذلك العنوان حقيقي وقابل للتوجيه عبر شبكة Tailnet، لكنه غير قابل للوصول من الشبكة المحلية عبر البوابة الافتراضية. المفتاح الموثق هو --snat-subnet-routes=false، ويُطبَّق على موجه الشبكة الفرعية Linux نفسه.
إنه إعداد دائم لا مفتاح لكل حزمة، لذا يجب أن يكون مسار العودة موجوداً لكل شبكة وجهة يخدمها ذلك الموجه. هذا ما يجعل التغيير قرار نشر بدلاً من مربع اختيار. وكل ما يخدمه ذلك الموجه يرث المتطلب في اللحظة نفسها.
أين يمكن أن يكون مسار العودة
ثلاثة مواضع شائعة، وهي تختلف في المدى لا في الصحة. المسار الثابت على مضيف الوجهة هو الأكثر مباشرة والأقل قابلية للتوسع، لأن كل جهاز يحتاج نسخته. أما جدول التوجيه في VPC أو في موجه الموقع فيغطي شبكة كاملة دفعة واحدة، وخيار DHCP يحمل مسارات ثابتة بلا فئات يصل إلى العملاء تلقائياً لكنه يفشل بصمت على الأجهزة التي تتجاهله.
ip route add 100.64.0.0/10 via 192.168.1.10
ip route get 100.64.0.5
أياً كان الموضع الذي تختاره، فإن القفزة التالية هي عنوان الشبكة المحلية للموجه وليس عنوانه في Tailnet أبداً. لا يستطيع مضيف في الشبكة المحلية الوصول إلى الطبقة العلوية قبل أن يحمل هذا المسار، لذا فالقفزة التالية داخل الطبقة العلوية دائرية ولا ترسل الحزمة إلى أي مكان. هذا الخطأ الواحد يفسر معظم الإعدادات التي تبدو صحيحة وتظل تفشل، ويصمد أمام كل فحص يقرأ جدول الموجه نفسه فقط. دوّن الموضع الذي استخدمته، وإلا فسيختبر الشخص التالي الموضع الخطأ.
قراءة العطل كحركة أحادية الاتجاه
العراض أسهل في التعرف من السبب: الخدمة ترد على الموجه نفسه وتظل صامتة من عميل بعيد. التقاط على الوجهة يظهر الطلبات واصلة والردود مغادرة، وهو ما يبدو نجاحاً حتى تلاحظ إلى أين تتجه تلك الردود. إنها تتجه إلى البوابة الافتراضية، ما يعني أن الجزء الداخل نجح والجزء العائد لم ينجح.
التقط على الموجه بدلاً من ذلك، لأنه يرى اتجاهي تبادل واحد ويظهر هل وصل الرد أصلاً. إذا ظهر الرد على الوجهة ولم يظهر أبداً على الموجه، فالمسار مفقود أو خاطئ على جانب الوجهة. وإذا ظهر على الموجه وتوقف هناك، فالمشكلة أبعد من ذلك وتنتمي إلى تحقيق آخر.
sudo tcpdump -ni any host 100.64.0.5
ip route get 100.64.0.5
هل يستحق العنوان الحقيقي مساراً
يبقى الإبقاء على SNAT الجواب الأبسط كلما تعذر إعادة ضبط شبكة الوجهة، والكلفة أن كل عميل يبدو كالموجه في سجلات الوجهة وسياستها. وتعطيله مبرر عندما يحتاج تطبيق إلى عنوان المصدر الحقيقي أو عندما يجب أن تميز سياسة الشبكة بين عملاء يتشاركون موجهًا. السببان مشروعان وليس أي منهما مجانياً. ويجب أن تكون الفائدة تستحق صيانة مسار على كل شبكة وجهة، إضافة إلى مراجعة الجدار الناري الموضحة أدناه.
بالنسبة لشبكة محلية صغيرة واحدة غالباً ما تُجدي المقايضة، بينما لا تُجدي عادةً أمام انتشار أجهزة لا تستطيع أخذ مسار ثابت. سجّل القرار والسبب بجانب إعداد الموجه، ليعرف المسؤول التالي أي سلوك متعمد. والوضع الافتراضي الذي لم يكتبه أحد لا يمكن تمييزه عن سهو.
الجدار الناري والسجلات والدور المزدوج
كل قاعدة كانت تطابق عنوان الشبكة المحلية للموجه تطابق الآن مصدراً مختلفاً، ويشمل ذلك قواعد السماح وأي حقل سجل دوّن الموجه كعميل. اقرأ تلك القواعد قبل الاختبار الأول لا بعد الفشل الأول، لأن قاعدة تسمح بعنوان الموجه وحده تحجب المصدر الجديد كلياً. ضيّق البديل إلى العملاء والمنافذ التي تحتاجه، ثم تأكد من أنه لا يسمح بصمت لكل شبكة Tailnet.
sudo nft list ruleset | grep -n '100\.64'
sudo iptables-save | grep -n '100\.64'
عقدة واحدة تعمل كعقدة خروج وموجه شبكة فرعية في آن واحد هي تركيبة موثقة قد تُسقط حركة المرور الصاعدة بعد تعطيل SNAT للشبكة الفرعية. فصل هذين الدورين على عقدتين مختلفتين يزيل هذا التحفظ ويمنح كل مسار وسياسة جدار ناري مالكاً واحداً. وإذا وجب بقاء الدورين معاً، فتوقّع هذا السلوك واختبره قبل لوم العميل. احفظ المسار وإعداد المفتاح وإسناد الدور في ملاحظة واحدة، لأنها تُقرأ معاً عندما تفشل الاتصال التالي.