شما یک سرویس VPN ذخیره‌شده در تنظیمات سیستم دارید و می‌خواهید ترمینال آن را راه‌اندازی کند. در macOS مسیر پشتیبانی‌شده scutil --nc است، اما فقط برای سرویس‌هایی که مدیریت‌کننده اتصالات شبکه خود سیستم مالک آن‌هاست. نوار منو API نیست: کلاینت‌های شخص ثالث معمولاً اتوماسیون خودشان را دارند، و پروفایلی که سرویس مدیریت ارسال می‌کند ممکن است راه‌اندازی محلی را رد کند. این چک‌لیستی است که اجرا می‌کنم: سرویس دقیق را پیدا کنید، وضعیت آن را بخوانید، راه‌اندازی‌اش کنید، منتظر تغییر وضعیت بمانید و سپس ثابت کنید که ترافیک واقعاً از تونل عبور می‌کند. در اولین مرحله‌ای که نمی‌خواند بایستید، چون هر فرمان بعدی فرض می‌کند فرمان قبلی موفق بوده است.

پیش از تلاش برای راه‌اندازی، سرویس را پیدا کنید

با فهرست موجودی شروع کنید، نه با نام پروفایلی که به یاد دارید:

scutil --nc help
scutil --nc list

هر خط یک وضعیت را با شناسه سرویس، نوع و نام نمایشی جفت می‌کند. شناسه همان مقداری است که برای اسکریپت‌نویسی به کار می‌آید، چون نام‌های نمایشی تکرار می‌شوند و قابل ویرایش‌اند. راهنمای scutil اپل حالت اتصال شبکه را مستند می‌کند، در حالی که --nc help نصب‌شده فهرست معتبر زیرفرمان‌ها روی همان Mac است؛ فرض نکنید پرچمی از راهنمای قدیمی‌تر هنوز در نسخه macOS شما وجود دارد.

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

وضعیت فعلی را بخوانید و انتخاب‌گر را تأیید کنید

پیش از راه‌اندازی از سرویس وضعیت بپرسید تا بدانید راه‌اندازی موفق چه چیزی را باید تغییر دهد:

scutil --nc status "Office VPN"

اگر دو سرویس نام نمایشی یکسانی داشته باشند، نام مبهم است. به‌جای آن شناسه را بدهید؛ فرمان هر دو را می‌پذیرد، اما تنها شناسه تضمین می‌کند یک سرویس انتخاب شود. پیش از تجزیه در اسکریپت بررسی کنید که واژه وضعیت یکی از موارد آشنا باشد — معمولاً Connected، Disconnected، Connecting یا Disconnecting. همچنین بررسی کنید که پروفایل مدیریت‌شده است یا نه، چون پیکربندی قفل‌شده ممکن است فرمان را بپذیرد و باز هم آن را نادیده بگیرد یا تأیید بخواهد.

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

اتصال را راه‌اندازی کنید و منتظر تثبیت وضعیت بمانید

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

scutil --nc start "Office VPN"
n=0
while [ "$n" -lt 30 ]; do
  state=$(scutil --nc status "Office VPN" | head -n 1)
  [ "$state" = "Connected" ] && break
  [ "$state" = "Disconnected" ] && { echo "start failed"; exit 1; }
  sleep 2
  n=$((n + 1))
done

وضعیت Connecting که هرگز حل نمی‌شود معمولاً به اعتبارنامه‌ها، MFA یا سرور اشاره دارد، نه به scutil. فرمان نمی‌تواند ورود تعاملی فراهم کند، پس پروفایلی که انتظار توکن یا کلید سخت‌افزاری دارد در Connecting می‌ماند و در نهایت عقب می‌کشد. پیش از افزودن تلاش‌های مجدد واژه وضعیت را بخوانید؛ حلقه‌ای در برابر درخواست احراز هویت نمی‌تواند موفق شود.

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

ثابت کنید تونل ترافیک حمل می‌کند، نه فقط اینکه Connected می‌گوید

Connected اتصال را توصیف می‌کند، نه تصمیم مسیریابی را. سرویس‌های بومی PPP و IKEv2 رابط ppp یا utun می‌سازند و مسیرها را نصب می‌کنند، در حالی که تونل تقسیم‌شده مسیر پیش‌فرض را عمداً دست‌نخورده می‌گذارد. رابط‌ها و هر دو خانواده نشانی را بررسی کنید:

ifconfig -l
netstat -rn -f inet
netstat -rn -f inet6
scutil --dns

رابطی را که سرویس ساخته پیدا کنید نه اینکه عددی را حدس بزنید، سپس از جدول مسیریابی بپرسید مقصد مشخصی از کدام رابط استفاده می‌کند: route -n get 10.0.0.10، با جایگزین‌کردن یک میزبان داخلی. اگر رابط فیزیکی را گزارش دهد، تونل بالاست اما آن جریان را حمل نمی‌کند. مسیرهای تونل تقسیم‌شده، ترتیب حل‌کننده و هر قاعده فایروال محلی را که رابط تونل را مجاز می‌داند ولی فرایند را نه، بررسی کنید.

تفکیک نام همان منفی کاذب همیشگی است. نام‌های داخلی می‌توانند از طریق حل‌کننده اشتباه تفکیک شوند در حالی که تونل کاملاً سالم است، و این شبیه خرابی VPN است ولی نیست. scutil --dns ترتیبی را نشان می‌دهد که macOS استفاده خواهد کرد؛ پس از تغییر حل‌کننده، حافظه نهان را با dscacheutil -flushcache و sudo killall -HUP mDNSResponder پاک کنید.

اعتبارنامه‌ها و امتیازها را بیرون از خط فرمان نگه دارید

هرگز گذرواژه، کلید از پیش اشتراکی یا توکن را در آرگومان‌ها نگذارید. آرگومان‌ها در فهرست فرایندها دیده می‌شوند و در تاریخچه پوسته ثبت می‌شوند، و متن پشتیبانی کپی‌شده می‌تواند آن‌ها را لو دهد. مدیریت اعتبارنامه خود پروفایل — چه آیتم Keychain، چه اعلان سیستم یا جریان احراز هویت کلاینت — جای رازهاست.

اجرای فرمان با sudo ورود تعاملی را بدون مراقب نمی‌کند. کاربر مؤثر را تغییر می‌دهد، نه در دسترس بودن اعلان GUI، توکن سخت‌افزاری یا Keychain ورود. یک LaunchAgent می‌تواند سرویس را پس از ورود کاربر و باز شدن Keychain راه‌اندازی کند؛ یک LaunchDaemon معمولاً به آن بخش‌های نشست کاربر نمی‌رسد. اگر سازمانی سرویس را مدیریت می‌کند، قواعد چرخه عمر آن بر هر اسکریپت محلی حاکم است.

سرویس را متوقف کنید و بررسی کنید که متوقف مانده است

با همان انتخابگری که برای راه‌اندازی استفاده کردید متوقف کنید، سپس وضعیت را دوباره بخوانید نه اینکه فرض کنید تونل رفته است:

scutil --nc stop "Office VPN"
scutil --nc status "Office VPN"

توقفی که به Disconnected برمی‌گردد هنوز یک چیز برای بررسی باقی می‌گذارد: اینکه پروفایل روی اتصال در صورت تقاضا تنظیم شده باشد، که می‌تواند آن را بدون اسکریپت شما برگرداند. اگر کلاینت دیگری مسیرهایی روی همان Mac داشته باشد، آن مسیرها می‌توانند از توقف بومی جان سالم به در ببرند. پیش از نتیجه‌گیری اینکه دستگاه خارج از VPN است، بررسی مسیر را دوباره اجرا کنید.

برای پوششی که دستی اجرا می‌کنید، ترتیب را ثابت نگه دارید: فهرست، وضعیت، راه‌اندازی، بررسی، آزمون مسیر، توقف، تأیید. وقتی شناسه در دسترس است نام دوستانه را از خروجی آزاد تجزیه نکنید، و خروج فرمان راه‌اندازی را آمادگی نشمارید. مدیر اتصالات وضعیت را گزارش می‌دهد؛ مدرک شما وضعیت به‌علاوه مسیری است که به تونل اشاره می‌کند.

مقالات مرتبط