Повечето хора приемат името на хост на SQL Server за пълен адрес, а VPN — като или разрешен, или не. На практика именуваният екземпляр кара клиента да направи второ търсене след DNS и точно това търсене тунелът най-често чупи. Явната крайна точка го заобикаля, затова tcp:host,port може да работи, докато host\INSTANCE изтича. Разликата е между намирането на услугата и получаването на разрешение да я използвате.

Митът: едно име на хост означава един порт

Името на хоста се разрешава до адрес и дотук свършва работата му. Именуваният екземпляр добавя име на екземпляр, което сървърът трябва да преведе в TCP порт, а клиентът не може да го познае. Порт 1433 е по подразбиране за екземпляр по подразбиране, а не свойство на всеки екземпляр на машината. Ако третираме двете като едно и също, се получава класическият симптом: ping работи, DNS работи, сканирането на 1433 не показва нищо и изводът е, че мрежата блокира SQL.

Второ предположение се проваля по същия начин: че отварянето на TCP 1433 е достатъчно. Ако екземплярът слуша другаде, отворен 1433 доказва само, че там има нещо друго. Портът трябва да съвпада със слушателя, а че слушателят е подробност от конфигурацията от страна на сървъра трябва да се пита, вместо да се предполага.

Какво всъщност прави клиентът с именуван екземпляр

След като разреши хоста, клиентът изпраща заявка за откриване до SQL Server Browser на UDP 1434 и пита кой порт използва именуваният екземпляр. Услугата на браузъра отговаря от собствения регистър на сървъра и след това клиентът отваря 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 е пълен адрес. То е хост плюс, за именуван екземпляр, търсене, което тунелът може да не пренесе. Назовете порта, назовете пътя на откриване и следващата повреда ще ви каже кой слой да поправите.

Подобни статии