خطای 789 در یک اتصال L2TP ویندوز یعنی تونل درون تبادل امنیتی IPsec مرده است، که خیلی پیش از آنکه ویندوز گذرواژه کاربر را جایی بفرستد رخ می‌دهد. تلاش دوباره برای گذرواژه یا بازنشانی آن در دایرکتوری نمی‌تواند آن مرحله را جلو ببرد. چیزی که آن را جلو می‌برد بازسازی اتصال از PowerShell با پیشنهادی است که دروازه واقعاً ارائه می‌دهد، چون جادوگر تنظیمات دگرگونی‌های IPsec را بی‌صدا انتخاب می‌کند و هرگز نشان نمی‌دهد چه برگزیده است. این راهنمای کار برای همین است: پروفایل را بسازید، پیشنهاد را ثابت کنید، سپس از جدول مرحله‌ها استفاده کنید تا کد بعدی چیزی به شما بگوید.

پروفایل را بدون جادوگر بسازید

Add-VpnConnection یک ورودی بومی دفترچه تلفن می‌نویسد، پس نتیجه همان شیئی است که برنامه تنظیمات بعداً ویرایشش می‌کند. وقتی اتصال باید برای هر حساب روی دستگاه وجود داشته باشد آن را از یک نشست ارتقایافته اجرا کنید، یا وقتی باید خصوصی بماند از زمینه کاربر:

Add-VpnConnection -Name "Contoso L2TP" `
  -ServerAddress 203.0.113.10 `
  -TunnelType L2tp `
  -EncryptionLevel Required `
  -AuthenticationMethod MSChapv2 `
  -RememberCredential -Force

-AuthenticationMethod را با آنچه دروازه ارائه می‌دهد هماهنگ کنید. MSChapv2، EAP و PAP قابل تعویض نیستند، و پروفایلی که روشی را طلب کند که سرور نمی‌پذیرد پیش از آنکه به هیچ رکورد کاربری رجوع شود شکست می‌خورد. -EncryptionLevel Required را برای هر چیز واقعی نگه دارید؛ Optional به ویندوز اجازه می‌دهد تونل رمزنگاری‌نشده را بپذیرد اگر طرف مقابل یکی ارائه دهد، که یک میان‌بُر آزمایشگاهی است و تنظیمی برای انتشار نیست.

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

پیشنهاد را ثابت کنید به‌جای پذیرش مقادیر پیش‌فرض

ویندوز خودش دگرگونی‌های IPsec را پر می‌کند، و به همین دلیل دو دستگاه با اتصالی که یکسان به نظر می‌رسد می‌توانند در برابر همان دروازه متفاوت شکست بخورند. Set-VpnConnectionIPsecConfiguration روش پشتیبانی‌شده برای ثابت کردن آن‌هاست:

Set-VpnConnectionIPsecConfiguration -ConnectionName "Contoso L2TP" `
  -AuthenticationTransformConstants SHA256128 `
  -CipherTransformConstants AES128 `
  -EncryptionMethod AES128 `
  -IntegrityCheckMethod SHA256 `
  -DHGroup Group14 `
  -PfsGroup None `
  -PassThru -Force

آن مجموعه یک چیدمان رایج L2TP/IPsec است، نه پاسخی جهانی. هر پارامتر فهرست ثابتی از مقادیر می‌پذیرد، و ترکیبی که پلتفرم نمی‌تواند نگاشت کند به‌صورت خطای cmdlet برمی‌گردد نه پروفایلِ بی‌صدا تضعیف‌شده. با چنین خطایی مانند اظهارنظری درباره مقادیر رفتار کنید، نه درباره مجوزهای شما.

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

شکست را بر اساس مرحله بخوانید، نه بر اساس متن خطا

789 به خانواده‌ای از کدها تعلق دارد که همه در گفتگوی کلاینت یکسان به نظر می‌رسند. پیش از آنکه دوباره به پروفایل دست بزنید کد را در برابر مرحله‌ای که به آن تعلق دارد بگذارید:

What you seeStage that failedCheck first
Nothing happens, then a timeoutNo IKE response at allServer address, UDP 500 and 4500 reachability, NAT traversal on the gateway
Error 789IKE security exchangeProposal, pre-shared key, certificate trust and client clock
Error 691 or a repeated password promptUser authenticationAccount state, domain, RADIUS or NPS policy
Tunnel up, some hosts unreachableRouting or DNS after PPPSplit-tunnel routes, pushed DNS, remote subnet mask

دو نقش اعتبارنامه اینجا مهم‌اند. کلید از پیش به‌اشتراک‌گذاشته یا گواهی طرفین را برای یکدیگر احراز هویت می‌کند، در حالی که MSChapv2 یا EAP شما را درون تونل احراز هویت می‌کند. بازنشانی گذرواژه کاربر نمی‌تواند اولی را درست کند، راز مشترک تازه نمی‌تواند دومی را درست کند، و تغییر هر دو با هم مدرک اینکه کدام اشتباه بود را نابود می‌کند.

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

پیش از آنکه آن را درست‌شده بخوانید از هر دو سر بررسی کنید

پروفایل را دوباره بخوانید، اما انتظار دیدن پیشنهاد در خروجی را نداشته باشید. Get-VpnConnection نام، نشانی سرور، نوع تونل، سطح رمزنگاری و روش احراز هویت را گزارش می‌کند و هیچ چیزی درباره دگرگونی‌ها نمی‌داند، پس خواندن تأیید می‌کند که ورودی وجود دارد و به میزبان درست اشاره می‌کند:

Get-VpnConnection -Name "Contoso L2TP" |
  Select-Object Name, ServerAddress, TunnelType, EncryptionLevel, AuthenticationMethod

از خط فرمان شماره بگیرید تا به‌جای گفتگو یک عدد بگیرید: rasdial "Contoso L2TP" همان کد شکستی را برمی‌گرداند که رابط برمی‌گرداند، و rasdial "Contoso L2TP" /disconnect آن را بین تلاش‌ها پاک می‌کند. سپس سمت دروازه را برای همان تلاش بخوانید. ipsec statusall از strongSwan یا گزارش IKE روتر می‌گوید کدام پیشنهاد رسید و کدام رد شد، و مقایسه آن با مقادیر cmdlet تنها گامی است که واقعاً اثبات می‌کند دو سر به توافق رسیده‌اند.

اتصال موفق خط پایان نیست. برنامه‌ای را که برای کاربر مهم است باز کنید، چون مسیرها، DNS هل‌داده‌شده و تنظیمات تونل تقسیم‌شده پس از بالا آمدن تونل شکست می‌خورند و اصلاً گفتگوی خطایی تولید نمی‌کنند.

خودکارش کنید و پاک عقب بکشید

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

subprocess.run(["rasdial", "Contoso L2TP"], check=True)

اعتبارنامه‌ای محدود به حسابی که کار را اجرا می‌کند ترجیح دهید، یا بگذارید پروفایل آن را با -RememberCredential ذخیره کند، به‌جای گذراندن گذرواژه به‌عنوان آرگومان در یک وظیفه زمان‌بندی‌شده. خود دستورهای تأمین برای تکرار با -Force ایمن‌اند، اما با خوشحالی پیشنهاد قدیمی را رو می‌کشند، پس اجرای دوباره تنها وقتی کمک می‌کند که اسکریپت مقادیر جاری را حمل کند.

پروفایل‌ها از راه‌اندازی‌های دوباره جان سالم به در می‌برند و بیشتر از پیکربندی دروازه‌ای که برایش ساخته شده‌اند عمر می‌کنند. وقتی پیشنهاد دروازه جابه‌جا می‌شود، ورودی را بردارید و دوباره بسازید به‌جای اینکه مجموعه دومی از مقادیر را روی آن بچینید: Remove-VpnConnection -Name "Contoso L2TP" -Force، سپس دو cmdlet را با مجموعه جدید تکرار کنید.

حلقه را با چهار بررسی که کنار اسکریپت زندگی می‌کنند ببندید: Get-VpnConnection نوع تونل و سطح رمزنگاری مورد انتظار را نشان می‌دهد؛ دروازه فاز 1 و فاز 2 کامل‌شده را برای نشانی کلاینت شما ثبت می‌کند؛ rasdial موفقیت برمی‌گرداند و برنامه باز می‌شود؛ و پیشنهاد ثبت‌شده در اسکریپت با تنظیم جاری دروازه مطابقت دارد. وقتی 789 بعدی برسد، آن مقایسه دقیقه‌ها طول می‌کشد نه یک بعدازظهر.

مقالات مرتبط