اسکریپتنویسی کلاینت VPN: لایه را پیش از رمز عبور انتخاب کنید
CLI فروشنده، rasdial، نیت برنامه یا خودکارسازی رابط هرکدام متفاوت شکست میخورند. لایه را انتخاب کنید، راز را بیرون از argv نگه دارید و منتظر وضعیت بمانید، نه کدهای خروج.
اسکریپتها کلاینتهای VPN را در همان لایهای راه میاندازند که نویسنده انتخاب کرده است، و آن لایه بهندرت همان لایهای است که کار به آن نیاز داشت. خط فرمان فروشنده، شمارهگیر سیستمعامل و نیت یک برنامه موبایل همگی در نقاط مختلف زندگی اتصال برمیگردند. آنها راز را هم متفاوت مدیریت میکنند، و همین تفاوت تعیین میکند که آیا رمز عبور برای هر کاربر روی دستگاه دیده میشود. لایه را پیش از نوشتن نخستین خط اسکریپت انتخاب کنید.
لایه 1: خط فرمان فروشنده
بیشتر کلاینتهای رومیزی خط فرمانی ارائه میدهند که نام پروفایل و، بسیار زیاد، رمز عبور را میپذیرد. کلاینت قدیمی Cisco فعل connect را با آرگومانهای کاربر و رمز عبور میپذیرفت؛ macOS سرویس داخلی را از طریق networksetup ارائه میکند؛ NetworkManager به nmcli پاسخ میدهد. این فراخوانیها وقتی فرمان تمام میشود برمیگردند، که همان لحظهای نیست که تونل قابل استفاده میشود. مستندات خود فروشنده را برای نسخهای که مستقر میکنید بخوانید، چون این رابطها تغییر میکنند و برخی کاملاً حذف میشوند.
nmcli connection up "Work VPN"
networksetup -connectpppoeservice "Work VPN"
مزیت این است که فروشنده مخزن پروفایل خودش را میشناسد، پس فراخوانی همان پیکربندیای را به کار میبرد که رابط گرافیکی به کار میبرد. عیب این است که هر فروشنده فعلهای خودش را اختراع میکند، و اسکریپتی که برای یک کلاینت نوشته شده به کلاینت دیگر منتقل نمیشود. این لایه را کوتاهترین راه بدانید وقتی کلاینت ثابت است و نسخه تثبیت شده.
لایه 2: سرویس خود سیستمعامل
در Windows شمارهگیر بخشی از سیستمعامل است و روی یک ورودی دفترچه تلفن کار میکند نه مخزن پروفایل فروشنده. این آن را در میان کلاینتها قابلحملتر و اسکریپتپذیرتر از یک حساب سرویس میکند. همچنین یعنی اتصال میتواند در یک جا وجود داشته باشد و در جای دیگر نه، که کسانی را که به فهرست اشتباه نگاه میکنند گیج میکند.
rasdial "Work VPN" user pass
Get-VpnConnection -Name "Work VPN" | Select-Object ConnectionStatus
وقتی باید ورودی را بسازید یا حذف کنید نه اینکه به آن زنگ بزنید، از سطح PowerShell استفاده کنید. لایههای WMI و cmdlet همان اشیاء را با نامهای مختلف ارائه میدهند، و حذف عملیاتی جدا از قطع اتصال است. اسکریپتی که فقط زنگ میزند پس از مهاجرت ورودیهای کهنه باقی میگذارد. پیش از وعده دادن که پاکسازی رخ میدهد، بررسی کنید که خودکارسازی شما در کدام مخزن مینویسد.
Remove-VpnConnection -Name "Old VPN" -Force
Get-VpnConnection
در macOS معادل آن فهرست سرویسهای شبکه است، جایی که سرویس موجود با نام متصل میشود نه اینکه در جا ساخته شود.
اعتبارنامهها در هر لایه نشت میکنند، پس کانال را انتخاب کنید
هر چیزی که روی خط فرمان عبور میدهید در جدول فرایندها برای هر کاربر محلی دیده میشود، و معمولاً در تاریخچه پوسته هم میماند. جایگزین پشتیبانیشده OpenVPN این است که راز را از یک فایل بخوانید با --askpass، و خود فایل به اجازههایی نیاز دارد که با اعتمادی که به آن میگذارید همخوان باشد. لوله نامدار از نوشتن راز روی دیسک پرهیز میکند اما به هر فرایندی که بتواند آن را باز کند اجازه میدهد آنجا بنویسد. در Windows راز را در مدیر اعتبارنامه یا در فایلی نگه دارید که فقط حساب سرویس میتواند بخواند، و هرگز بهصورت متنی در یک فایل دستهای نگذارید.
openvpn --config /etc/openvpn/work.conf --askpass /etc/openvpn/work.secret --auth-nocache --daemon
ls -l /etc/openvpn/work.secret
همین قاعده برای توکنها و کدهای یکبارمصرف هم صادق است: اگر خودکارسازی به آنها نیاز دارد، به کانالی نیاز دارد که آرگومان خط فرمان نیست. وقتی مکانیزم را عوض میکنید راز را بچرخانید، چون مقدار قدیمی جایی در یک گزارش مانده است. اسکریپتی که کار میکند و نشت میکند اسکریپت کارکننده نیست.
منتظر وضعیت بمانید، سپس یک مالک را نظارت کنید
هر یک از این فراخوانیها پیش از آماده شدن تونل برمیگردد، پس وضعیتی را که کلاینت ارائه میدهد بپرسید یا مقصدی درون آن را با مهلت زمانی بیازمایید. کپی فایلها یا باز کردن اتصال پایگاهداده بلافاصله پس از فراخوانی اتصال یک مسابقه است، و به شکلی متناوب شکست میخورد که شبیه خطای شبکه به نظر میرسد.
ip link show tun0
nmcli -t -f GENERAL.STATE connection show "Work VPN"
curl -sS --max-time 5 https://app.internal.example/health -o /dev/null
قطع اتصال همین مشکل را برعکس دارد: فرایند میتواند پیش از رفتن مسیرها خارج شود. از قلابهای کلاینت در جایی که وجود دارند استفاده کنید، مانند اسکریپتهای up و down OpenVPN یا ExecStartPost یک واحد systemd، چون در همان نقطهای اجرا میشوند که واقعاً برایتان مهم است. قلابها با امتیازهای چیزی اجرا میشوند که آنها را فراخوانده است، پس قلابی که شبکه را دوباره راه میاندازد به قاعدهای صریح نیاز دارد نه فرض. در طول عمر اتصال دقیقاً یک مالک نگه دارید.
وقتی دو ناظر همان پروفایل را راه میاندازند و متوقف میکنند، نتیجه یک حلقه اتصال دوباره است که مانند قطعی ارائهدهنده خوانده میشود. Runbook وقتی پایان مییابد که لایه مستند شده باشد، راز کانالی داشته باشد که argv نیست، شرط انتظار بررسی وضعیت با مهلت باشد، و یک فرایند مالک چرخه عمر باشد.