ppp0 یا ppp1؟ نامگذاری یک نشست VPN روی PPP برای اسکریپتها
pppd به هر نشست یک نام واسط و یک نشانگر پروفایل میدهد. هر دو را از قلاب بخوانید، نه از ppp0. نام ثابت را تنها زمانی رزرو کنید که رد کردن عمدی است.
اسکریپت قلاب اجرا میشود، ppp0 را میخواند و مسیرها را به هر واسطی که در آن لحظه این نام را دارد اعمال میکند. گاهی همان تونلی است که در نظر داشتید؛ گاهی نشستی است که یک دقیقه پیش متصل شده است. اتصال مجدد بعدی شماره را جابهجا میکند و همان اسکریپت بیصدا پیوند اشتباه را پیکربندی میکند. راهحل آن است که واسط را از فراخوانی که همین حالا اجرا شد بگیرید و پروفایل موردنظر را همراه آن حمل کنید.
یک نشست را از گزینهها تا قلاب دنبال کنید
از همانجا شروع کنید که نشست ساخته میشود. xl2tpd برنامه pppd را با فایل گزینههایی که pppoptfile آن تونل نام میبرد اجرا میکند، بنابراین افزونه، شماره واحد و هر نشانگر پروفایل همانجا تعیین میشود نه در یک فایل عمومی. یک مدیر اتصال ممکن است گزینههای خودش را بسازد، یعنی ویرایش /etc/ppp/options دلیل بر تغییر تونلی نیست که برای شما مهم است. وقتی پیوند بالا میآید، pppd اسکریپتهای اعلان را از توزیعکننده توزیع اجرا میکند. این اسکریپتها نام واسط را بهعنوان آرگومان اول و نشانگر پروفایل را بهعنوان آرگومان ششم دریافت میکنند.
محیط همان واقعیتها را با نامهایی مانند IFNAME و PPP_IPPARAM حمل میکند، اما در دسترس بودن آنها به توزیعکننده نصبشده بستگی دارد. پیش از تکیه بر یک متغیر، توزیعکننده را بخوانید: برخی توزیعها ترتیب آرگومانهای بالادستی را حفظ میکنند و برخی دیگر محیط را پیش از فراخوانی اسکریپت شما فیلتر میکنند. اسکریپتی که فقط از $1 و آرگومان ششم استفاده میکند در هر دو حالت کار میکند.
واسط را از فراخوانی بخوانید
قلاب سنتی واسط را اول دریافت میکند. آن مقدار مکانی همان شناسه واسط است که نشست فراخواننده اسکریپت را توصیف میکند. آن را در بالا در یک متغیر ذخیره کنید، سپس همان متغیر را برای مسیرها، قواعد دیوار آتش و برچیدن استفاده کنید.
ipparam office-vpn
نشانگر پروفایل را همانجا که گزینهها تعریف میشوند وصل کنید، نه در اسکریپت. با این خط در فایل گزینههای تونل، هر نشستی که از آن فایل ساخته شود office-vpn را بهعنوان آرگومان ششم حمل میکند. اسکریپت میتواند بر اساس نشانگر شاخهبندی کند و در همان حال روی واسط واقعی عمل کند. این دو را در کد جدا نگه دارید، چون نشانگر پایدار است و واسط برای هر نشست تخصیص مییابد.
نام را تنها زمانی درخواست کنید که رد کردن درست است
نام ثابت سادهتر از خواندن آرگومانها به نظر میرسد، اما رفتار خطا را تغییر میدهد. گزینه unit برای یک اتصال خروجی شماره درخواست میکند و pppd وقتی آن واحد از قبل مشغول است به تخصیص پویا برمیگردد. هیچ چیز در آن نتیجه ppp0 را برای پروفایل شما رزرو نمیکند.
ifname ppp-office
گزینه ifname طور دیگری عمل میکند: اگر نام درخواستی از قبل در حال استفاده باشد یا نتوان تخصیص داد، pppd بهجای انتخاب نام دیگر خارج میشود. این یک انتخاب سیاست است، نه تغییر نام ظاهری. وقتی باید نمونه دوم همزمان از همان پروفایل رد شود از آن استفاده کنید و تأیید کنید که pppd نصبشده و مدیر اتصال شما گزینه را عبور میدهند.
در هر حال، نامی که اسکریپت میبیند همان چیزی است که باید روی آن عمل کرد. نام پیکربندیشده نیاز به خواندن فراخوانی را برطرف نمیکند، چون نشست راهاندازیشده مجدد همچنان میتواند نامی متفاوت از قبلی ارائه دهد.
برچیدن را با نشستی که پیکربندی کردید همخوان کنید
مسیرها و قواعد دیوار آتش از اسکریپتی که آنها را ساخته بیشتر عمر میکنند، بنابراین برچیدن باید دقیقاً اشیایی را بردارد که نشست مالک آنهاست. قواعد را هم با نشانگر پروفایل و هم با واسط برچسب بزنید و بر اساس همان برچسب حذف کنید. اگر دو تونل بتوانند همزمان بالا باشند، حذف هر چیزی که به ppp اشاره میکند همان راهی است که یک قطع اتصال اتصال دیگر را میشکند.
حالتی را آزمایش کنید که باگ را آشکار میکند: نشست دوم PPP را وقتی اولی هنوز متصل است بالا بیاورید، سپس اولی را دوباره وصل کنید و ببینید قلاب کدام واسط را گزارش میکند. اجرای موفق با یک نشست درباره تخصیص نام چیزی را ثابت نمیکند. با VPN متوقف تکرار کنید تا تأیید شود برچیدن مسیر کهنهای باقی نمیگذارد.
نشانگر، واسط و مسیر قلاب را در یادداشتهای استقرار نگه دارید. وقتی شماره پس از راهاندازی مجدد تغییر میکند، آن سه مقدار توضیح میدهند چرا اسکریپت بدون هیچ ویرایش پیکربندی متفاوت رفتار کرده است.