دستگاه‌هایی که برای یک LAN مسیریابی می‌کنند و همزمان به یک VPN وصل می‌شوند، با خودشان به همان بحث می‌رسند: تونل می‌خواهد مالک مسیر پیش‌فرض باشد و LAN آن را پس می‌خواهد. وقتی OpenVPN متصل می‌شود، ممکن است یک مسیر پیش‌فرض از میان تونل یا یک جفت نیمه‌مسیر پیش‌فرض نصب کند، که برای لپ‌تاپ درست و برای دروازه‌ای که همسایگانش انتظار پاسخ از نشانی LAN آن دارند نادرست است. پاسخ این نیست که VPN را نادیده بگیری. پاسخ این است که به دو تصمیم دو جدول متفاوت بدهی.

یک مسیر پیش‌فرض، دو مالک

ترافیک ارسال‌شده و ترافیکی که به‌صورت محلی تولید می‌شود لازم نیست یک مسیر را طی کنند. کارخواهان LAN تونل را فقط برای مقصدهایی که انتخاب می‌کنی لازم دارند، در حالی که نشست‌های مدیریت خود میزبان و پاسخ‌هایش به همان کارخواهان به مسیر پیش‌فرض LAN نیاز دارند. آمیختن هر دو در جدول اصلی یک پاسخ را به دو پرسش متفاوت تحمیل می‌کند.

OpenVPN کلیدی دقیقاً برای همین دارد. route-noexec مانع می‌شود که کارخواه اصلاً به جدول اصلی دست بزند، و مقادیری که در غیر این صورت به کار می‌برد به یک اسکریپت route-up صادر می‌شوند به‌عنوان route_vpn_gateway، dev و نشانی‌های واسط. سپس تو تصمیم می‌گیری کدام جدول کدام مسیر را بگیرد، در کدی که بعداً می‌توانی بخوانی.

جدول سیاست در برابر بازنویسی جدول اصلی

ApproachWhat it buysWhat it costs
Separate table plus source ruleLAN traffic and host traffic keep independent defaultsEvery lookup now depends on rule order
Editing the main table onlyFewer moving parts on a single-purpose hostOne mistake takes the gateway offline entirely
Two half-default routesWorks for a full-tunnel clientAmbiguous on a host that must answer on its LAN address

جدول جداگانه تنها گزینه‌ای است که فراتر از یک زیرشبکه مقیاس می‌گیرد. یک بار نامش را بگذار و بعد با نام به آن ارجاع بده تا کسی مجبور نباشد عددی را به خاطر بسپارد:

echo "10 vpn" >> /etc/iproute2/rt_tables
ip rule add from 192.168.50.0/24 table vpn
ip route add default via 10.8.0.1 dev tun0 table vpn

نشانی‌های اینجا جای‌نگهدار هستند. پیش از اجرای هر چیزی، پیشوند LAN، دروازه تونل و نام دستگاه را از استقرار خودت جایگزین کن.

قاعده باید با میزبان هم بخواند

قاعده‌ای که فقط با پیشوند LAN می‌خواند بسته‌های ارسال‌شده را پوشش می‌دهد. ترافیکی را که خود دروازه تولید می‌کند پوشش نمی‌دهد و پاسخ‌هایی را هم که به کارخواهان LAN برمی‌گرداند پوشش نمی‌دهد، پاسخ‌هایی که نشانی LAN دروازه را به‌عنوان منبع خود دارند. آن جست‌وجوها به main می‌افتند و هنوز می‌توانند از تونل بیرون بروند.

قاعده دومی برای نشانی LAN خود دروازه اضافه کن، یا قاعده اول را به مجموعه‌ای گسترش بده که هر دو را دربر بگیرد. ترتیب مهم است: قاعده مشخص‌تر را اول بگذار و نتیجه را با جست‌وجویی بررسی کن که منبع را صریح نام می‌برد.

ip route get 203.0.113.9 from 192.168.50.1

اگر این برای مقصدی که باید محلی بماند دستگاه تونل را گزارش کرد، مجموعه قاعده‌ها درست نیست، صرف‌نظر از اینکه جدول چه دارد.

NAT یا مسیری در طرف دور

سرور VPN زیرشبکه تونل را می‌شناسد و هیچ چیز دیگری. بسته‌هایی که با نشانی منبع LAN می‌رسند مسیر بازگشتی ندارند مگر کسی آن را فراهم کند، و دقیقاً دو راه برای فراهم کردنش وجود دارد. افزودن مسیر برای پیشوند LAN روی سرور منبع اصلی را سرتاسر دیدنی نگه می‌دارد، که طراحی حسابرسی‌شده معمولاً همین را می‌خواهد. ماسک‌گذاری روی دروازه منبع را به نشانی تونل بازنویسی می‌کند و هیچ همکاری‌ای از سرور نمی‌خواهد.

iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o tun0 -j MASQUERADE

وقتی سرور را کنترل نمی‌کنی و نمی‌توانی آنجا مسیر اضافه کنی NAT را انتخاب کن. وقتی گزارش‌ها، کنترل دسترسی یا تقارن مسیر بازگشت مهم‌اند مسیر سمت سرور را انتخاب کن، چون ماسک‌گذاری نشانی اصلی را از هر چیزی که طرف دور ثبت می‌کند پاک می‌کند.

در هر دو حالت ارسال باید فعال باشد، و فیلترکردن سخت‌گیرانه مسیر معکوس ممکن است پاسخ را بیندازد وقتی main تونل را برای آن منبع انتخاب نمی‌کرد. پیش از سرزنش تونل مقدار مؤثر را بررسی کن.

کاری کن که این تقسیم از اتصال دوباره جان سالم ببرد

قاعده‌ها و مسیرهایی که دستی اضافه شده‌اند با بازساخته شدن واسط از بین می‌روند و یک ورودی کهنه جدول می‌تواند از نشستی که آن را توجیه می‌کرد بیشتر بماند. قاعده جدول، مسیر تونل و ورودی ماسک‌گذاری را داخل اسکریپت route-up کارخواه بگذار و جدول را در بالای اسکریپت پاک کن تا دروازه قدیمی نتواند به نشست جدید برسد.

از هر دو سر بررسی کن: یک جست‌وجو روی دروازه با منبع LAN، و یک درخواست واقعی از کارخواه LAN به مقصدی که باید از تونل بگذرد. مسیری که وجود دارد ولی هرگز انتخاب نمی‌شود دقیقاً مانند نبودن مسیر رفتار می‌کند تا وقتی شمارنده‌ها را بخوانی.

مقالات مرتبط