برنامهٔ محلی، قاعدهٔ VPN: چرا زنجیرهٔ FORWARD شما هرگز فعال نمیشود
یک فرایند روی دستگاه از OUTPUT استفاده میکند، نه FORWARD. قلاب را در فضای نام درست انتخاب کنید و سپس تصمیم بگیرید که آیا یک نشانه یا یک مسیر ساده کافی است.
قاعدهای برای ترافیک VPN در زنجیرهٔ FORWARD اضافه میکنید، درخواست را از همان دستگاه Linux اجرا میکنید و شمارنده صفر میماند. قاعده احتمالاً درست است. بسته هرگز آن مسیر را نرفته، چون درخواستی که روی خود دستگاه تولید میشود توسط آن ارسال نمیشود. دنبالکردن زندگی بسته از سوکت تا سیم توضیح میدهد که چرا و قاعده در واقع کجا باید باشد.
پیدا کنید بسته کجا زاده شد
ترتیب قلابهای Netfilter سه حالت را جدا میکند و فقط یکی از آنها FORWARD را در بر میگیرد:
| Origin | Path | Hook that sees it |
|---|---|---|
| Local process | OUTPUT then POSTROUTING | OUTPUT, POSTROUTING |
| Addressed to a local service | PREROUTING then INPUT | PREROUTING, INPUT |
| Received for another host | PREROUTING, FORWARD, POSTROUTING | FORWARD |
یک برنامهٔ محلی در مسیر OUTPUT شروع میشود، چون هسته از قبل تشخیص داده است که بسته اینجا منشأ میگیرد و هرگز کاندیدای ارسال نیست. ساختن تونل آن دستهبندی را تغییر نمیدهد؛ تونل دستگاهی است که بسته ممکن است از آن خارج شود، نه مرحلهای که خروجی محلی را به عبور تبدیل کند.
دو بسته، یک داستان
وقتی تونل برپا شد، بستهٔ درونی برنامه و بستهٔ بیرونی رمزنگاریشده دو شیء متفاوتاند. بستهٔ درونی مقصد و بار دادهای را حمل میکند که برنامه انتخاب کرده است. بستهٔ بیرونی متن رمزشده را به نشانی و درگاه همتا میبرد، و همان است که واقعاً از رابط فیزیکی میگذرد.
سیاست شما به یکی از آن دو مربوط است و انتخاب اشتباه دلیل رایجی است که یک قاعده بهنظر هیچ کاری نمیکند. قاعدهای که با نشانی بیرونی همتا مطابقت دارد همهٔ بستههای تونل را یکسان میبیند، هرچه برنامهٔ داخل انجام دهد. قاعدهای که با مقصدی درونی مطابقت دارد ترافیکی را که برایتان مهم است میبیند و تنها وقتی فعال میشود که آن بسته به قلابی برسد که قاعده را روی آن نصب کردهاید.
فضاهای نام مرز را جابهجا میکنند
یک کانتینر این را سختتر میکند بیآنکه اصل را عوض کند. درخواست برنامه خروجی محلی درون فضای نام شبکهٔ کانتینر است. میزبان آن ترافیک را روی یک رابط اترنت مجازی دریافت میکند و میتواند آن را ارسال کند، پس یک قاعدهٔ FORWARD روی میزبان میتواند معنادار باشد، هرچند فرایندی که درخواست را تولید کرد هرگز زنجیرهٔ OUTPUT میزبان را لمس نکرد.
پیش از انتخاب قلاب، مشخص کنید مجموعهقواعد و تونل واقعاً کجا زندگی میکنند. تونل درون کانتینر، تونل روی میزبان با مسیریابی کانتینر از طریق آن، و تونل در فضای نام جدا سه توپولوژی متفاوت با سه جایگاه قاعدهٔ متفاوتاند. قواعد را درون فضای نامی بخوانید که صاحب دستگاه است، نه فقط در فضای پیشفرض.
بپرسید آیا اصلاً به نشانه نیاز دارید
اگر هدف فرستادن یک پیشوند مقصد از تونل است، شاید یک مسیر برای آن پیشوند کافی باشد. نخست مسیرهای مؤثر را بررسی کنید، از جمله هر چیزی که سرور هل داده است: مسیر پیشفرض تغییرمسیریافته بسیار بیشتر از سیاست باریکی که در نظر داشتید ترافیک را از VPN میفرستد و هیچ مقدار نشانهگذاری نتیجه را با قصد همخوان نمیکند.
دستهبندی وقتی لازم است که تصمیم به چیزی وابسته باشد که مسیر نمیتواند بیان کند، مانند منبع، کاربر یا فرایند. برای ترافیک دریافتی، نشانهگذاری در PREROUTING کار میکند. برای ترافیک محلی، نشانهگذاری باید در مرحلهٔ خروجی رخ دهد که بتواند پس از گذاشتن نشانه جستوجوی مسیر تازهای را آغاز کند. در nftables این یک زنجیرهٔ نوع route روی قلاب خروجی است؛ یک زنجیرهٔ فیلتر خروجی معمولی مقدار را میگذارد و مسیر را بیتغییر میگذارد.
در iptables معادل آن در چیدمان mangle OUTPUT زندگی میکند و همان شرط برقرار است: تصمیم مسیریابی باید پس از وجود نشانه دوباره بررسی شود. سپس یک قاعدهٔ سیاست باید نشانه را مصرف کند و به جدولی اشاره کند که مسیر قابلاستفادهای دارد. گذاشتن نشانهٔ conntrack عملیات سوم و جداست؛ مقداری را روی جریان ذخیره میکند و خودبهخود آن مقدار را روی بستهٔ جاری نمیگذارد تا مسیریابی آن را بخواند.
جستوجو و شمارنده را با هم بررسی کنید
nft list ruleset
ip route get 198.51.100.25
ip route get 198.51.100.25 mark 0x1
نشانی و نشانه نمونهاند و دو پرسوجوی مسیر به دو پرسش متفاوت پاسخ میدهند. دومی میپرسد اگر بستهای آن نشانه را داشت هسته چه میکرد؛ نشان نمیدهد که مجموعهقواعد شما یکی تعیین میکند. آن را آزمون فرض بگیرید، نه شاهد اینکه سیاست کار میکند.
سپس درخواستی بیخطر اجرا کنید و همزمان دو چیز را ببینید: شمارنده روی قلابی که انتخاب کردید و خروجیای که بسته واقعاً گرفت. اگر شمارنده حرکت کند و بسته از جای دیگری خارج شود، نشانه یا جدول اشتباه است. اگر هیچکدام حرکت نکند، بسته اصلاً به آن قلاب نمیرسد و پرسش بعدی فضای نام یا مسیر است.
در پایان، آزمون را به آنچه سازوکار میتواند بیان کند محدود کنید. یک مسیر برای یک نشانی به سیاست دائمی برای سرویسی که نشانیهایش میچرخند تبدیل نمیشود. نخست دامنهٔ بستهها را تعیین کنید، سپس بررسی کنید که طراحی مسیریابی و نشانهگذاری میتواند آن دامنه را پس از اتصال دوباره نگه دارد.