Іменны экзэмпляр 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 даказвае толькі, што там ёсць нешта іншае. Порт павінен адпавядаць слухачу, а што слухач — дэталь канфігурацыі на баку сервера трэба пытаць, а не дадумваць.
Што кліент насамрэч робіць з іменным экзэмплярам
Пасля развязання імя хоста кліент дасылае запыт выяўлення да 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 — гэта поўны адрас. Гэта хост плюс, для іменнага экзэмпляра, пошук, які тунэль можа не перадаць. Назавіце порт, назавіце шлях выяўлення, і наступная няўдача скажа, які ўзровень выпраўляць.