Atvirkštinis SSH vienam įrenginiui: loopback klausytojas ar maršrutizuotas VPN?
Vienas valdymo prievadas įrenginiui, kuris gali tik skambinti į išorę. Trys sąlygos nusprendžia, ar atvirkštinio tunelio pakanka, ar reikia tikro maršrutizuoto kelio.
Jūsų įrenginys yra už operatoriaus NAT, gali atidaryti išeinančius ryšius ir paleidžia SSH serverį, kurio niekas negali pasiekti. Gaunamas prašymas paprastai formuluojamas kaip "duokite jam VPN", o tai yra vienas atsakymas iš kelių. Prieš priimdami jį, nuspręskite, ar jums reikia vieno administracinio TCP prievado, ar maršrutizuoto kelio į visą potinklį, nes tai skirtingi projektai su skirtinga ekspozicija.
Atvirkštinis tunelis gerai atsako į siaurą variantą. Įrenginys skambina jūsų mazgui, prašo mazgo klausytis loopback prievado ir persiunčia tą prievadą atgal į savo SSH paslaugą. Tada administratoriai pasiekia klausytoją per mazgą, o ne per viešą internetą.
Trys sąlygos, kurios nulemia pasirinkimą
Užsirašykite jas prieš bet kokią konfigūraciją. Jos yra riba tarp riboto valdymo įėjimo ir tinklo išplėtimo, o jų sumaišymas yra būdas, kuriuo penkių eilučių tunelis virsta be šeimininko plokščiu tinklu.
| Condition | Reverse tunnel fits | Something else is needed |
|---|---|---|
| How many services must be reachable? | One, or a small fixed set on loopback | Anything that needs many ports or dynamic discovery |
| Who connects, and how are they authenticated? | Named administrators with their own hub accounts | Third parties, or anything needing per-flow audit you do not control |
| Does the device's own LAN need to be reachable? | No | Yes, so a routed VPN or a managed platform is the honest answer |
Trečioji eilutė yra ta, dėl kurios žmonės ginčijasi. Tunelis į įrenginio SSH prievadą neįtraukia jo kaimynų į jūsų tinklą, ir neturėtų būti daroma, kad taip atrodytų per tolesnių peradresavimų grandinę. Jei poreikis iš tikrųjų yra LAN, pasakykite tai ir suprojektuokite jį vietoj to.
Mazgo pusė: ribota relės paskyra
Duokite kiekvienam įrenginiui savo relės paskyrą su viešojo rakto autentifikavimu ir be interaktyvios sesijos. Match blokas, apribotas ta paskyra, palieka leidimą mažą, o privatus raktas lieka įrenginyje, kur jam vieta.
Match User relay-dev-7
AuthenticationMethods publickey
PubkeyAuthentication yes
AllowTcpForwarding remote
PermitListen 127.0.0.1:21022
GatewayPorts no
MaxSessions 0
PermitTTY no
X11Forwarding no
AllowAgentForwarding no
MaxSessions 0 yra įdomi eilutė. Ji atmeta apvalkalo ir posistemių sesijas, o tuo pačiu leidžia peradresavimą, kurio įrenginiui reikia, todėl pavogtas raktas negali būti paverstas interaktyviu prisijungimu. PermitListen fiksuoja mazgo pusės klausytojo adresą ir prievadą, ir GatewayPorts no laiko jį loopback, o ne atidaro tinklui, kuriame yra mazgas.
Išbandykite efektyvią konfigūraciją prieš įkeldami iš naujo ir tuo metu laikykite atidarytą antrą sesiją. Match blokas, kuris netyčia taikomas visiems, arba rašybos klaida parinkties pavadinime, yra klasikinis būdas užsirakinti už mašinos, kurią kietinate. Iškelkite veikiančią konfigūraciją ir perskaitykite parinktis iš naujo, o ne pasitikėkite ką tik parašytu failu. Atkreipkite dėmesį, kad parinkčių palaikymas skiriasi tarp versijų, todėl naujesniame serveryje priimta eilutė gali būti tiesiog ignoruojama senesniame.
Įrenginio pusė: peradresavimas, kuris garsiai nepavyksta
Įrenginys atidaro ryšį ir prašo klausytojo. Du adresai argumente -R reiškia skirtingus dalykus, o jų skaitymas iš kairės į dešinę yra greičiausias būdas įsiminti, kuris yra kuris.
ssh -NT \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
-R 127.0.0.1:21022:127.0.0.1:22 \
[email protected]
Kairioji pora yra tai, kur mazgas turėtų klausytis. Dešinioji pora yra tai, prie ko įrenginys jungiasi, kai ateina prašymas, išsprendžiama jo paties pusėje. Juos sukeitus gaunamas tunelis, kuris švariai pakyla ir peradresuoja į netinkamą vietą, o tai blogiau nei nesėkmė.
ExitOnForwardFailure=yes priverčia komandą išeiti, kai prašomo klausytojo neįmanoma sukurti, todėl paleidimo iš naujo kilpa pasako tiesą, o ne palieka pusiau veikiančią sesiją. Jis nieko nesako apie tai, ar vietinė SSH paslauga vėliau sveika, todėl sujunkite jį su procesų tvarkykle ir retkarčiais tikru ryšio testu.
Niekada nekeiskite loopback klausymosi adreso pakaitos simboliu, kad išvengtumėte papildomo šuolio. Tas vienas pakeitimas yra skirtumas tarp valdymo kelio ir viešai pasiekiamo prievado, ir paprastai tai nutinka derinant, o paskui lieka. Jei kolega negali pasiekti prievado per mazgą, pataisykite šuolio konfigūraciją, o ne plėskite susiejimą. Loopback yra visas šio dizaino saugumo argumentas.
Administratoriaus prieiga per mazgą
Administratorius su paprasta paskyra mazge gali per jį peršokti į persiųstą prievadą. Relės paskyra tam nenaudojama, ir būtent tai yra prasmė laikyti jas atskirai.
ssh -J [email protected] -o HostKeyAlias=device-7 \
-p 21022 [email protected]
Patikrinkite įrenginio pagrindinio kompiuterio raktą po pasirinktu slapyvardžiu, nes tas raktas identifikuoja įrenginį grandinės gale, o tunelis yra tik transportas. Prisijungimas nuo galo iki galo vis dar autentifikuoja abu galus; tunelis, pasibaigiantis bendrame mazge, savaime nepadaro jo patikimu keliu.
Prisiimkite gyvavimo ciklą
Paleiskite įrenginio komandą procesų tvarkyklėje su tiksliai vienu aktyviu egzempliumi ir sąmoningai pasirinkta paleidimo iš naujo politika. Keepalive parinktys aptinka negyvą partnerį; jos neprikelia proceso, kuris išėjo.
Tada parašykite išėmimo iš eksploatacijos procedūrą. Kiekvienas įrenginys gauna savo klausytoją ir savo raktą, todėl išėmimas reiškia atšaukti tą paskyrą ir pašalinti tą raktą, o ne sukti visai flotilei bendrą paslaptį.
Galiausiai prisiminkite, ką loopback jums duoda. Jis riboja tinklo ekspoziciją ir nieko nedaro dėl kitų vietinių naudotojų bendrame mazge, todėl paties mazgo prieigos politika vis tiek turi būti teisinga. sshd_config nuoroda dokumentuoja kiekvieną aukščiau naudotą parinktį, ir verta perskaityti peradresavimo skyrius iki galo prieš išplečiant bet kurią iš jų.