Jak se připojit k SSH/RDP serveru v Azure s proxy
Pokud se někdy budete chtít připojit k virtuálce v Azure z korporátní sítě, a nebudete mít dedikovanou linku, nebo dedikované IP, pravděpodobně narazíte, protože budete za firemní proxynou a ven se jen tak nedostanete, ani nemůžete počítat s tím, že by vám někdo dovolil přístup do venkovní sítě na všechny SSH nebo RDP porty.
Když jsem toto řešil, uvažoval jsem, jak na to. Jednou z možností je připojit se například k Linux serveru přes sériový port (což pokud si rozkliknete v Azure pod položkou Connect další možnosti, toho můžete využít). Sériový port má ovšem dva problémy, za prvé nemůžete přenášet soubory (i když teoreticky byste mohli vložit třeba BASE64 encoded text) a za druhé celá ta konzole funguje tak trošku divně - například když dáte šipečku v konzoli nahoru, abyste si zobrazili předchozí příkazy, vše se tak nějak rozhodí. Toto tedy není optimální řešení.
Druhou možností je použít Azure Portal CLI. Bavím se o tom CLI, které je k dispozici přímo na portálových stránkách. Když si ho rozkliknete, a například dáte curl ifconfig.me
nebo curl api.ipify.org
měli byste získat svoji IP adresu, kterou pak můžete whitelistovat v NSG (Network Security Group) a připojit se přímo z portálu. Prostředí je o něco komfortnější, jenomže mě se po pěti minutách samo odpojovalo a odhlašovalo, navíc po restartu připojení se změnila veřejná IP, a musel jsem ji znovu povolovat, takže se nejedná také o nějak optimální řešení. A to nepočítám to, že webová konzole je problematická, jakmile kopírujete, zvýrazňujete, nebo vkládáte text, prostě lokální terminálový emulátor je lepší.
Poslední možnost, kterou jsem řešil, je asi nejlepší, připojit se z vlastního terminálu. U toho jsem zvažoval použití příkazu az ssh vm
, který mi ovšem za proxy serverem nefungoval. Když jsem použil přepínač --debug
pochopil jsem proč, on totiž nepoužívá websockety (jak bych očekával, protože třeba takové je chování u AWS), ale lokálního ssh klienta s přímým připojením, podívejte se níže.
cli.azext_ssh.ssh_utils: Running ssh command C:\WINDOWS\System32\openSSH\ssh.exe xxx.xxx.xxx.xxx -l [email protected] -i C:\Users\xxx\xxx\id_rsa -o CertificateFile="C:\xxxx\xxx\id_rsa.pub-aadcert.pub" -vvv
Takže tudy cesta také nevede. Poslední možnost (a rozhodně ne zadarmo), je použití Bastion hosta, kterého si stiskem jednoho tlačítka vytvoříte. Ten totiž podporuje jednu takovou vychytávku od roku 2022, a tomu se říká native client
Ten umožňuje se poměrně jednoduše připojit i pomocí proxy (když máte nastaveny příslušné promměnné prostředí, jako HTTP_PROXY a HTTPS_PROXY) a spojení tunelovat přes websockety. Takže pak vám třeba ve Windows aplikaci Terminál a Azure CLI stačí zadat tento příkaz, a máte plnohodnotnou konzoli i za firewallem. Resource ID mašiny získáte tím, že si necháte vypsat její JSON, v konzoli jsem ho přímo nenašel, i když na portálu se dá JSON poměrně jednoduše vytáhnout.
az network bastion ssh --name "bastion" --resource-group "rg" --target-resource-id "/subscriptions/.../virtualMachines/..." --auth-type AAD
Samozřejmě můžete použít i režim tunelu, a tunelovat si SSH, RDP či jiný port, a využít vlastního SSH klienta.
Toto řešení (ač vyžaduje platbu za Bastion) mi přijde osobně pro připojení ke stanicím nejelegantnější a pohodlnější, když jste za proxy.