Pojmenovaná instance SQL Serveru přes VPN: zjišťování, ne port 1433
Pojmenovaná instance se před připojením ptá SQL Browseru na port. Pokud jméno přes VPN selže, ale tcp:host,port funguje, mezerou je zjišťování.
Většina lidí považuje název hostitele SQL Serveru za úplnou adresu a VPN za něco, co je buď povolené, nebo ne. V praxi pojmenovaná instance přiměje klienta provést po DNS druhý dotaz, a právě tento dotaz tunel nejčastěji rozbíjí. Explicitní koncový bod to obejde, a proto tcp:host,port může fungovat, zatímco host\INSTANCE vyprší. Rozdíl je mezi nalezením služby a získáním povolení ji používat.
Mýtus: jeden název hostitele znamená jeden port
Název hostitele se přeloží na adresu a tím jeho práce končí. Pojmenovaná instance přidává název instance, který musí server přeložit na TCP port, a klient ho nemůže uhodnout. Port 1433 je výchozí pro výchozí instanci, ne vlastnost každé instance na stroji. Když obojí považujeme za totéž, vznikne klasický příznak: ping funguje, DNS funguje, sken 1433 nic neukáže a závěr je, že síť blokuje SQL.
Druhý předpoklad selhává stejně: že otevřít TCP 1433 stačí. Pokud instance naslouchá jinde, otevřený 1433 dokazuje jen to, že tam je něco jiného. Port se musí shodovat s naslouchající službou a naslouchající služba je detail konfigurace na straně serveru, což se má zjistit dotazem, ne odhadem.
Co klient s pojmenovanou instancí skutečně dělá
Po přeložení hostitele pošle klient žádost o zjištění na SQL Server Browser přes UDP 1434 a ptá se, který port pojmenovaná instance používá. Služba prohlížeče odpovídá z vlastního registru serveru a klient pak otevře TCP připojení k tomuto portu. Než se vůbec zkusí přihlášení, účastní se dva protokoly a dva porty.
nslookup sqlhost.corp.example
nc -vzu sqlhost.corp.example 1434
Get-Service -Name SQLBrowser
Proto blokování pouze UDP vytváří časový limit, který vypadá jako mrtvý hostitel. Pokud je služba prohlížeče zastavená nebo zakázaná, žádost o zjištění zůstane bez odpovědi, i když databázový stroj běží a jeho TCP port je otevřený. Pokud je instance nakonfigurována se statickým portem, klient se stále ptá, dokud nedostane koncový bod přímo. Každá z těchto poruch vypadá v chybové zprávě aplikace stejně a potřebují různá řešení.
Služba prohlížeče je pohodlí pro zjišťování, ne databáze. Její zastavení nezastaví stroj a její spuštění neotevře TCP port instance.
Proč explicitní koncový bod funguje, když název ne
Explicitní koncový bod odstraňuje dotaz z posloupnosti: klient se připojí přímo na adresu a port, které jste uvedli. To je nejprve diagnostika, ne automaticky trvalé řešení, protože port se může změnit, pokud se instance později překonfiguruje na dynamický. Než uděláte závěry, porovnejte obě formy se stejným klientem a stejným účtem.
sqlcmd -S "tcp:sqlhost.corp.example,51433" -U app_login -Q "SELECT @@SERVERNAME"
Test-NetConnection sqlhost.corp.example -Port 51433
Pokud explicitní forma funguje a pojmenovaná selhává, mezerou je zjišťování a můžete zvolit, jak ji uzavřít: povolit UDP 1434 tunelem, nebo požádat správce, aby připnul statický port a zdokumentoval koncový bod. Obojí jsou záměrná rozhodnutí s různými náklady na údržbu. Otevřít každý port v rozsahu není ani jedno z nich a je to možnost, která se obvykle navrhuje na konci dlouhého dne. Zapište volbu tam, kde žijí připojovací řetězce.
Pokud nefunguje ani jedna forma, problém je výš než zjišťování. Zkontrolujte naslouchající službu, trasu a přístupové pravidlo pro port, který instance skutečně používá, než obviníte službu prohlížeče.
Po zjištění: ověřování a identita jsou oddělené
Selhání přihlášení je jiná událost než časový limit a identita VPN se tunelem nestane přihlášením SQL. Jakmile klient dosáhne správného portu, databázový stroj uplatní své vlastní ověřování a oprávnění. Smíchat obě fáze v jednom tiketu je způsob, jak se problém se zjišťováním přiřadí špatnému týmu. Než něco změníte, přečtěte si číslo chyby.
Ponechte zdokumentovaný název hostitele, pokud ovladač ověřuje certifikát serveru, protože připojení přes číselnou adresu může tuto kontrolu změnit, místo aby vyřešilo původní problém. Nedávné ovladače Microsoftu ve výchozím nastavení šifrují, takže neshoda názvu se projeví jako chyba certifikátu po úspěšném TCP připojení. To je pokrok, ne nová porucha.
Mýtus, který je třeba opustit, je, že název hostitele SQL Serveru je úplná adresa. Je to hostitel plus pro pojmenovanou instanci dotaz, který tunel nemusí přenést. Pojmenujte port, pojmenujte cestu zjišťování a příští porucha vám řekne, kterou vrstvu opravit.