نمونهٔ نامدار SQL Server روی VPN: کشف، نه پورت 1433
نمونهٔ نامدار پیش از اتصال از SQL Browser پورت میپرسد. اگر نام روی VPN شکست بخورد اما tcp:host,port کار کند، شکاف در کشف است.
اکثر مردم نام میزبان SQL Server را نشانی کامل میبینند و VPN را چیزی که یا مجاز است یا نه. در عمل نمونهٔ نامدار باعث میشود کلاینت پس از DNS جستوجوی دومی انجام دهد و همان جستوجو بخشی است که تونل بیشتر از همه میشکند. یک نقطهٔ پایانی صریح از آن دور میزند، به همین دلیل tcp:host,port میتواند کار کند در حالی که host\INSTANCE به پایان مهلت میرسد. تفاوت میان یافتن سرویس و اجازهٔ استفاده از آن است.
افسانه: یک نام میزبان یعنی یک پورت
نام میزبان به یک نشانی تبدیل میشود و کارش همانجا تمام میشود. نمونهٔ نامدار نام نمونهای اضافه میکند که سرور باید آن را به پورت TCP ترجمه کند و کلاینت نمیتواند حدس بزند. پورت 1433 مقدار پیشفرض یک نمونهٔ پیشفرض است، نه ویژگی هر نمونه روی دستگاه. یکی دانستن این دو، نشانهٔ کلاسیک را میسازد: ping کار میکند، DNS کار میکند، پیمایش 1433 چیزی نشان نمیدهد و نتیجه این است که شبکه SQL را مسدود میکند.
فرض دوم هم به همین شکل شکست میخورد: اینکه باز کردن TCP 1433 کافی است. اگر نمونه جای دیگری گوش دهد، 1433 باز فقط ثابت میکند چیزی دیگر آنجاست. پورت باید با شنونده بخواند و که شنونده جزئیاتی از پیکربندی سمت سرور است، این را باید پرسید نه حدس زد.
کلاینت در واقع با نمونهٔ نامدار چه میکند
پس از حل نام میزبان، کلاینت درخواست کشف را روی UDP 1434 به SQL Server Browser میفرستد و میپرسد نمونهٔ نامدار از کدام پورت استفاده میکند. سرویس مرورگر از رجیستری خود سرور پاسخ میدهد و سپس کلاینت اتصال TCP به آن پورت باز میکند. پیش از آنکه حتی ورود آزمایش شود، دو پروتکل و دو پورت درگیرند.
nslookup sqlhost.corp.example
nc -vzu sqlhost.corp.example 1434
Get-Service -Name SQLBrowser
به همین دلیل مسدود کردن فقط UDP مهلتی میسازد که شبیه میزبان مرده است. اگر سرویس مرورگر متوقف یا غیرفعال باشد، درخواست کشف بیپاسخ میماند، هرچند موتور پایگاه داده در حال اجراست و پورت TCP آن باز است. اگر نمونه با پورت ثابت پیکربندی شده باشد، کلاینت باز هم میپرسد مگر اینکه نقطهٔ پایانی مستقیماً به آن داده شده باشد. هر یک از این خطاها در پیام خطای برنامه یکسان به نظر میرسد و به اصلاحهای متفاوتی نیاز دارد.
سرویس مرورگر یک تسهیل برای کشف است، نه خود پایگاه داده. متوقف کردنش موتور را متوقف نمیکند و راهاندازیاش پورت TCP نمونه را باز نمیکند.
چرا نقطهٔ پایانی صریح وقتی نام کار نمیکند کار میکند
نقطهٔ پایانی صریح جستوجو را از زنجیره حذف میکند: کلاینت مستقیم به نشانی و پورتی که نام بردید وصل میشود. این نخست یک تشخیص است، نه بهطور خودکار راهحل دائمی، چون پورت ممکن است تغییر کند اگر نمونه بعداً به پورت پویا پیکربندی شود. پیش از نتیجهگیری، دو شکل را با همان کلاینت و همان حساب مقایسه کنید.
sqlcmd -S "tcp:sqlhost.corp.example,51433" -U app_login -Q "SELECT @@SERVERNAME"
Test-NetConnection sqlhost.corp.example -Port 51433
اگر شکل صریح موفق شود و شکل نامدار شکست بخورد، شکاف در کشف است و میتوانید انتخاب کنید چگونه آن را ببندید: عبور UDP 1434 از تونل را مجاز کنید، یا از مدیر بخواهید پورت ثابتی تعیین و نقطهٔ پایانی را مستند کند. هر دو تصمیمهای آگاهانه با هزینههای نگهداری متفاوتاند. باز کردن هر پورت در بازه هیچیک از این دو نیست و همان گزینهای است که معمولاً در پایان یک روز طولانی پیشنهاد میشود. انتخاب را همانجا که رشتههای اتصال زندگی میکنند ثبت کنید.
اگر هیچیک از دو شکل کار نکرد، مشکل بالادست کشف است. پیش از سرزنش سرویس مرورگر، شنونده، مسیر و قاعدهٔ دسترسی برای پورتی که نمونه واقعاً استفاده میکند را بررسی کنید.
پس از کشف: احراز هویت و هویت جدا هستند
شکست ورود رویدادی متفاوت از مهلت است و هویت VPN بهخاطر تونل به ورود SQL تبدیل نمیشود. وقتی کلاینت به پورت درست میرسد، موتور پایگاه داده احراز هویت و مجوزهای خودش را اعمال میکند. آمیختن دو مرحله در یک تیکت همان راهی است که یک مشکل کشف به تیم نادرست سپرده میشود. پیش از تغییر هر چیزی شمارهٔ خطا را بخوانید.
اگر درایور گواهی سرور را اعتبارسنجی میکند، نام میزبان مستند را نگه دارید، چون اتصال با نشانی عددی میتواند آن بررسی را تغییر دهد بهجای اینکه مشکل اصلی را حل کند. درایورهای جدید Microsoft بهصورت پیشفرض رمزنگاری میکنند، بنابراین ناسازگاری نام پس از یک اتصال TCP موفق بهصورت خطای گواهی ظاهر میشود. این پیشرفت است نه شکست تازه.
افسانهای که باید کنار گذاشت این است که نام میزبان SQL Server نشانی کامل است. آن یک میزبان است بهعلاوه، برای نمونهٔ نامدار، جستوجویی که تونل ممکن است حمل نکند. پورت را نام ببرید، مسیر کشف را نام ببرید و شکست بعدی خواهد گفت کدام لایه را درست کنید.