لا مفتاح لاستثناء هذا التطبيق: أعطِ العملية مصدرها الخاص
التوجيه يطابق العناوين لا أسماء العمليات. أعطِ البرنامج المستثنى مصدره وجدوله الخاص، أو انقل القرار إلى الموجّه حيث يكون ذلك صادقًا.
من المفترض أن يستخدم أحد البرامج الاتصال العادي بينما يبقى كل شيء آخر على النفق، و العميل لا يملك مفتاحًا لذلك. ولا توجد قائمة مخفية يمكن العثور عليها. يُختار المسار من حقول داخل الحزمة، والحزمة تحمل عناوين ومنافذ لا هوية العملية التي أنشأتها، لذا يجب التعبير عن أي استثناء في أحد تلك الحقول. تتبَّع حزمة واحدة مرة واحدة، فتتوقف الخيارات المتاحة عن أن تكون غامضة.
لماذا لا يستطيع العميل تقديمه
يقارن توجيه الوجهة عنوان الوجهة بالبادئات ويحتفظ بأطول مطابقة. تبدو كل حزمة متطابقة في تلك اللحظة، أيًّا كان ما أنتجها. يوسّع توجيه سياسة المصدر المقارنة إلى عنوان المصدر، وهو الخطاف الذي تستخدمه كل حلول العمل العملية: غيّر المصدر، فيصبح جدول آخر مؤهلًا.
المنافذ لا تساعد. الاستثناء حسب المنفذ يجب أن يُقيَّم قبل البحث عن الوجهة، والمنفذ لا دور له في ذلك القرار. أي شيء يُروَّج له كاستثناء قائم على المنفذ فهو في الحقيقة يستثني بحقل آخر ويصفه بتساهل.
التوجيه الحقيقي لكل تطبيق موجود حيث أضافت المنصة آليات له، مثل نداءات التصفية على Windows أو ربط خدمة VPN على Android. نسخة OpenVPN المكتبية لا تحتوي على أي من ذلك، ولا يخترعها أي علم إعدادات.
Linux: علّم العملية، ثم وجّه العلامة
يربط النهج الأنظف القرار بالعملية التي تملك المقبس. مطابقة owner تعمل مع حركة المرور المولّدة محليًا في سلسلة OUTPUT، لذا يمكن لعلامة تُطبَّق هناك أن تختار جدولًا منفصلًا:
iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200
تستشير الحزم الآتية من المستخدم 1001 الجدول 200 بعد ذلك وتخرج عبر البوابة العادية، بينما لا يزال الجدول الرئيسي يرسل كل شيء آخر إلى النفق. مطابقة owner تنطبق فقط على الحزم المولّدة محليًا، وهي بالضبط حركة المرور التي تهمك هنا، ولا يمكنها تصنيف الحزم المُمرَّرة إلى مضيف آخر. تحقّق بالأدوات لا بالنية: يُظهر ss -tnp العنوان المحلي والعملية المالكة للاتصالات القائمة، ويُظهر ip route get 1.1.1.1 mark 0x1 الجدول الذي تختاره العلامة.
مساحة أسماء الشبكة هي الجواب الأكثر صلابة لبرنامج قائم بذاته، لأن كل مقبس يُنشأ داخلها مرتبط بها بحكم البناء، فترث العمليات المساعدة والاتصالات الفرعية السلوك دون أن تُصنَّف أصلًا. الثمن هو السباكة: زوج veth، وعنوان على كل طرف، ومسار افتراضي داخل مساحة الأسماء يعود إلى المضيف.
ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1
Windows: الوجهة لا تزال هي التي تقرر
يختار Windows الواجهة الصادرة من الوجهة، لذا على البرنامج الذي يريد مسارًا مختلفًا أن يغيّر شيئًا تستشيره الحزمة البرمجية قبل اتخاذ ذلك الاختيار. يغطي ForceBindIP النصف الأول: فهو يشغّل برنامجًا ومقابسه مرتبطة مسبقًا بعنوان محلي تحدده. هذا وحده لا يغيّر الواجهة التي تغادر منها الحزمة، لأن الوجهة لا تزال تختار المسار. اربط مصدرًا على حاسوب محمول يشير مساره الافتراضي إلى النفق، فتدخل الحزمة النفق على أي حال.
للأعراض شكل مقروء بمجرد أن تعرفه. تظهر مع عنوان LAN تصل إليه الواجهة المختارة مباشرة، وتفشل مع أي شيء على الإنترنت يشير مساره إلى النفق. كما تبدو ناجحة حتى يسلّم البرنامج عمله إلى عملية مساعدة، لأن العملية المساعدة التي تفتح مقبسها الخاص لم يُخبَر أحد بالربط.
انقل القرار حين تكون العملية الواحدة هي الوحدة الخاطئة
إذا كان المطلب الحقيقي جهازًا لا برنامجًا، فضع عليه SSID خاصًا أو VLAN ودع الموجّه يقرر: ذلك المصدر يأخذ المسار الطبيعي بينما تستخدم المصادر الأخرى النفق. آلة بوابة مخصصة هي التصميم الصادق الآخر، تحتفظ بـ VPN ولا تستقبل إلا الوجهات التي يرسلها إليها الموجّه. على VLAN تغطي السياسة كل تدفق يفتحه الجهاز، بما في ذلك العمليات المساعدة التي كسرت نهج Windows. المقايضة في النطاق: لم يعد بالإمكان معاملة برنامجين على ذلك الجهاز بشكل مختلف.
كلاهما سياسة مصدر أو وجهة بنطاق يمكنك ذكره في جملة واحدة. لا أحدهما لكل تطبيق، والتصميم الذي يقدّم نفسه كأنه لكل تطبيق يفشل في أول مرة يفوّض فيها البرنامج عمله إلى عملية ثانية.