وظایف پس از VPN را از دیسپچر اجرا کنید، نه از if-up
یک هوک قدیمی رابط، اتصال VPN را نمیبیند. vpn-up را با UUID پروفایل تطبیق دهید، کار را تکرارپذیر نگه دارید و برای قطع اتصالی که هرگز رخ نمیدهد برنامه داشته باشید.
اسکریپتی که باید پس از بالا آمدن VPN اجرا شود، به رویدادی از سمت مؤلفهای نیاز دارد که مالک اتصال است. فایلی که در پوشه قدیمی هوک شبکه گذاشته میشود، فراخوان بازگشتی برای هر VPNای نیست که NetworkManager، pppd یا فرایند مستقل OpenVPN میتواند بسازد. هر یک از این مالکان رویداد متفاوتی با محیط متفاوت گزارش میدهد، پس پیش از انتخاب هوک باید مالک شناسایی شود. در غیر این صورت اسکریپت درست است و فقط هرگز اجرا نمیشود.
برای VPNای که NetworkManager مدیریت میکند، دیسپچر جای درست است و vpn-up اقدام درست.
از vpn-up استفاده کنید، نه رویداد رابط
دیسپچر میان up و vpn-up تفاوت میگذارد. اولی رابط فعالشده را گزارش میدهد؛ دومی اتصال VPN فعالشده را. بالا آمدن Wi-Fi فقط یعنی پیوند زیرین وجود دارد؛ تونل ممکن است هنوز در حال مذاکره باشد یا هرگز احراز هویت نشود.
اسکریپت رابط و اقدام را دریافت میکند، در حالی که جزئیات اتصال از طریق محیط میآید، از جمله UUID پروفایل و رابط IP مربوط به VPN. این متغیرها را بخوانید، نه اینکه هویت را از نام دستگاهها استنتاج کنید.
تطبیق را به یک اتصال محدود کنید
بر اساس UUID اتصال یا هویت دیگری که دیسپچر میدهد تطبیق دهید، نه پیشوند tun یا ppp0. نام رابطها پایدار نیست، همزمان میتواند بیش از یک تونل وجود داشته باشد، و دو پروفایل میتوانند نام نمایشی یکسان داشته باشند. تطبیق پیشوند tun یعنی اسکریپت سرانجام برای اتصالی اجرا میشود که کسی قصد دست زدن به آن را نداشت. همچنین میتواند برای یک پروفایل دو بار اجرا شود، وقتی اتصال دوباره دستگاه را بازمیسازد.
کار را چنان بسازید که اجرای دوباره بیاثر باشد. فراخوان بازگشتیای که در هر فراخوانی مسیری میافزاید، سرانجام جدول را با تکراریها پر میکند و همان نسخه دوم است که مسیریابی را میشکند.
بدانید فعالسازی چه چیزی را اثبات نمیکند
vpn-pre-up پیش از آن اجرا میشود که NetworkManager گزارش دهد VPN کاملاً فعال است، و مدیر منتظر آن اسکریپتها میماند. مرحله مسدودکننده را فقط زمانی به کار ببرید که کار واقعاً به آنجا تعلق دارد، چون بررسی کند، فعالسازیای را که هر مؤلفه دیگری منتظر دیدنش است به تأخیر میاندازد.
وجود مسیرها اثبات نمیکند که برنامهای گوش میدهد، نامی خصوصی حل میشود یا نشست کاربری وجود دارد. اینها را جداگانه با مهلتی محدود بررسی کنید و به جای تکرار کل زنجیره، گزارش دهید کدام لایه شکست خورده است.
به زمینهای که اسکریپت در آن اجرا میشود احترام بگذارید
اسکریپتهای دیسپچر با root و بیرون از هر نشست کاربری اجرا میشوند. فرض نکنید محیط کاربر واردشده، نشست گرافیکی او یا جاکلیدی بازشده در دسترس است. هیچکس نباید به نبود زمینه دسکتاپ با خواندنی کردن هر اعتبارنامه برای هر فرایند پاسخ دهد. کار نشست کاربر را در یک سرویس کاربر یا کمکیار نشست نگه دارید که فراخوان بازگشتی بتواند بدون جا زدن خود به جای کاربر به آن سیگنال بدهد.
مالکیت و مجوزهای اسکریپت هم مهم است. فایلی که با root اجرا میشود و هر کاربری میتواند جایگزینش کند، مسیری برای افزایش سطح دسترسی است، و یافتهای است مستقل از اینکه منطق VPN درست باشد یا نه.
برای قطع اتصالی که هرگز رخ نمیدهد برنامه بریزید
NetworkManager مستند میکند که vpn-pre-down برای قطعهای اجباری مانند پایان غیرمنتظره یا از دست رفتن اتصال منتشر نمیشود. پس پاکسازیای که فقط پیرامون یک pre-down نرم ساخته شده، ذاتاً ناقص است. هر وضعیت مشترکی که اسکریپت تغییر میدهد به مالک دیگری نیاز دارد که بتواند آن را پس از خرابی بازگرداند، و این مسیر بازیابی باید آزموده شود نه فرض.
هوک را با یک اتصال عادی، یک اتصال دوباره، یک قطع عمدی و یک کابل کشیده آزموده کنید. UUID، اقدام و رابطی که اجرا شد را بدون ثبت اطلاعات محرمانه یادداشت کنید. همان یادداشت تنها شاهد قابل اعتماد است که هوک برای اتصال مورد نظر شما اجرا شده، و همان است که تغییر بعدی را ایمن میکند.