Іменований екземпляр 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 — це повна адреса. Це хост плюс для іменованого екземпляра пошук, який тунель може не передати. Назвіть порт, назвіть шлях виявлення, і наступний збій скаже, який рівень виправляти.