JConsole sa pripojí k registru a potom ju RMI pošle inam
To, že port registra odpovedá, je len prvý skok. Vzdialený server JMX môže ohlásiť iného hostiteľa a iný port konektora a tunel sa musí dostať k obom.
Pripojte sa tunelom k portu registra, sledujte, ako sa začína handshake, a potom sledujte, ako JConsole napriek tomu vyprší časový limit. Deje sa to preto, lebo prvé TCP spojenie nie je riadiace spojenie: je to vyhľadanie. Register RMI odpovie referenciou, ktorá uvádza hostiteľa a druhý port, a JConsole potom ide tam, kam jej bolo povedané. Ak tunel dosiahne iba prvý port servera alebo referencia uvádza adresu, ktorá existuje len v miestnej sieti samotného servera, klient sa zasekne po tom, čo to vyzeralo na úspech.
Mýtus: jeden otvorený port je jedno spojenie
Vzdialený JMX cez RMI zahŕňa aspoň dva koncové body a vyberajú ich rôzne časti systému. Port registra je ten, ktorý zadávate do klienta, a existuje preto, aby vydal stub, ktorý opisuje skutočný konektor. Ak prvý úspešný socket považujete za dôkaz, že cesta správy je otvorená, dvojminútová diagnóza sa zmení na celé popoludnie firewallových tiketov.
Sledujte chybu samotného klienta, nie zoznam počúvajúcich na serveri. Zlyhanie po začiatku handshaku vám hovorí, že sa nedokončilo druhé spojenie, nie prvé.
Čo register vracia
Stub obsahuje adresu a port serializované v okamihu, keď bol konektor vytvorený. Na serveri s niekoľkými rozhraniami mohol stack zvoliť adresu dostupnú z miestnej siete a nedostupnú z vašej. Klient rozdiel nepozná; jednoducho volá hodnotu, ktorú dostal, a balík sleduje trasu, ktorá pre danú adresu existuje, na VPN klientovi často žiadnu. To je okamih, keď sa pokúša druhé spojenie.
To je aj dôvod, prečo je zlyhanie medzi prostrediami občasné: ten istý server sa môže správať inak pre používateľa v miestnej sieti a pre používateľa v tuneli, bez akokoľvek zmenenej konfigurácie JMX.
Dva porty a dve vlastnosti, ktoré ich fixujú
Port registra pochádza z com.sun.management.jmxremote.port a konektor možno zafixovať pomocou com.sun.management.jmxremote.rmi.port namiesto toho, aby sa nechal na tom, čo pridelí stack. Nastavte oba explicitne, keď je medzi klientom a serverom firewall alebo bezpečnostná skupina, pretože nepredvídateľný druhý port nemožno povoliť vopred a široký rozsah otvorený kvôli nemu je horší ako jeden pevný port.
Potom pomocou ss -ltn alebo netstat -an na serveri overte, že oba porty počúvajú a na ktorých adresách. Počúvajúci proces viazaný na loopback je správny pre čisto lokálne nasadenie a pre toto je nanič.
Keď je ohlásené meno nesprávne
Meno hostiteľa vo vzdialenej referencii nastavuje java.rmi.server.hostname. Ovplyvňuje, čo stub ohlasuje; samo o sebe nie je pokynom pripútať každý počúvajúci proces k jednému rozhraniu, a preto jeho nastavenie nie vždy prinesie očakávané správanie s jedným portom. Nastavte ho, reštartujte proces a potom overte, čo stub skutočne obsahuje. Zvoľte meno alebo adresu, ktorú klient dokáže preložiť a dosiahnuť tunelom, a reštartujte proces, aby sa stub znova zostavil.
Siete kontajnerov to zhoršujú, pretože adresa, ktorú proces vidí, môže byť interná a zvonku kontajnera nesmerovateľná. Zverejnite zamýšľané meno hostiteľa explicitne namiesto toho, aby ste voľbu nechali na platforme.
Ak tunelujete cez SSH namiesto VPN, ten istý problém sa objaví v inom kabáte: presmerovanie iba portu registra nechá druhý koncový bod ukazovať na adresu, ktorú váš klient nedosiahne. Presmerujte oba porty a zariaďte, aby sa ohlásené meno preložilo na niečo, čo klient dosiahne lokálne.
Nevypínajte bezpečnosť správy, aby ste si to zjednodušili
Úryvky, ktoré vypínajú autentifikáciu a TLS, sa ľahko nájdu a privedú spojenie k fungovaniu spôsobom, ktorý budete musieť neskôr vrátiť. Vzdialený JMX je rozhranie na správu s rovnakými právami ako proces, ktorý kontroluje; zachovajte jeho riadenie prístupu, a ak klient nemôže predložiť prihlasovacie údaje, opravte to.
Keď sú koncové body správne, uchovajte ďalšiu chybu, ktorú uvidíte. Odmietnutie úložiska dôvery alebo účtu je neskoršou fázou než nedostupný konektor a znamená, že sieťová práca je hotová.