کلید «استثنای این برنامه» وجود ندارد: به فرآیند منبع خودش را بدهید
مسیریابی نشانیها را تطبیق میدهد، نه نام فرآیندها را. به برنامه استثناشده منبع و جدول خودش را بدهید، یا تصمیم را به روتر منتقل کنید، جایی که این کار صادقانه است.
یک برنامه باید از اتصال معمولی استفاده کند در حالی که همه چیز دیگر روی تونل میماند، و کلاینت کلیدی برای این کار ندارد. هیچ منوی پنهانی هم برای پیدا کردن وجود ندارد. مسیر از میان فیلدهای درون بسته انتخاب میشود، و بسته نشانیها و درگاهها را حمل میکند نه هویت فرآیندی که آن را ساخته است، پس استثنا باید در یکی از همان فیلدها بیان شود. یک بار بسته را دنبال کنید و گزینههای موجود دیگر مرموز نیستند.
چرا کلاینت نمیتواند آن را ارائه دهد
مسیریابی مقصد نشانی مقصد را با پیشوندها مقایسه میکند و بلندترین تطابق را نگه میدارد. در آن لحظه هر بسته یکسان به نظر میرسد، هرچه هم که آن را تولید کرده باشد. مسیریابی سیاست منبع مقایسه را به نشانی مبدأ گسترش میدهد، و این همان قلابی است که هر راهحل عملی از آن استفاده میکند: مبدأ را تغییر دهید و جدول دیگری واجد شرایط میشود.
درگاهها کمکی نمیکنند. استثنا بر اساس درگاه باید پیش از جستوجوی مقصد ارزیابی میشد، و درگاه در آن تصمیم هیچ نقشی ندارد. هر چیزی که به عنوان استثنای مبتنی بر درگاه تبلیغ میشود در واقع با فیلد دیگری استثنا میکند و آن را سهلانگارانه توصیف میکند.
مسیریابی واقعی به تفکیک برنامه جایی وجود دارد که پلتفرم سازوکاری برای آن افزوده است، مانند فراخوانیهای فیلتر در 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 را شکستند. معاوضه دامنه است: دو برنامه روی آن افزار دیگر نمیتوانند متفاوت رفتار شوند.
هر دو سیاست مبدأ یا مقصد با دامنهای هستند که میتوانید در یک جمله بگویید. هیچکدام به تفکیک برنامه نیست، و طراحیای که خود را به تفکیک برنامه معرفی میکند اولین بار که برنامه کارش را به فرآیند دومی میسپارد شکست میخورد.