Pasiekti VPN kliento paslaugą: atvirkštinis tunelis arba DNAT
Pasiekti OpenVPN kliento paslaugą be prievado persiuntimo: palyginkite atvirkštinį SSH tunelį su DNAT serverio pusėje ir tris sąlygas, lemiančias pasirinkimą.
Net nešiojamasis kompiuteris už operatoriaus NAT gali aptarnauti kolegą, jei VPN serveris atlieka susitikimo vietos vaidmenį. Ten veda du mechanizmai: klientas jungiasi į išorę ir prašo serverio laikyti klausymosi prievadą, arba serveris paskelbia prievadą ir išverčia jį į tunelį. Abu sprendžia tą pačią pasiekiamumo problemą ir elgiasi skirtingai gedimo, priežiūros ir registravimo metu. Trys sąlygos nusprendžia, kuris tinka jūsų konfigūracijai.
Dvi formos, viena susitikimo vieta
Pirmoje formoje klientas atveria SSH sesiją į išorę ir prašo serverio klausytis pasirinktame prievade, o kiekvieną ryšį grąžina per tą sesiją. Serveryje nieko nepersiunčiama ir pakeitimų paketuose nevyksta, todėl vieninteliai reikalavimai yra SSH paskyra, leistas persiuntimas ir užkardos taisyklė prievadui. Paslauga lieka pririšta prie loopback kliente, o tai paprastai ir yra norima.
ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]
Antroje formoje viešąjį prievadą valdo serveris ir perrašo kiekvieną ryšį link kliento tunelio adreso. Tam reikia įjungto IP persiuntimo, paskirties vertimo įėjime ir šaltinio vertimo išėjime, ir tai veikia toliau, kai nėra jokios SSH sesijos. Prievadas priklauso serveriui, o ne sesijai, ir būtent ši savybė nulemia daugumą realių atvejų.
Nė viena forma nėra saugesnė iš prigimties. Abi galiausiai atskleidžia vieną paslaugos prievadą visiems, kurie gali pasiekti viešąjį serverio adresą, ir abi vis dar priklauso nuo pačios paslaugos autentifikavimo.
Pirmoji sąlyga: ar prievadas turi gyvuoti ilgiau nei sesija
Atvirkštinis persiuntimas gyvuoja lygiai tiek, kiek jį sukūrusi SSH sesija. Nutrūkus ryšiui klausytojas išnyksta, o kolega pamato atmestą ryšį, o ne lėtą kelią. Komandos priežiūra su systemd unit ir perkrovimo politika tai išsprendžia, o ExitOnForwardFailure=yes padaro nepavykusį prisirišimą matomą iš karto, užuot palikus sesiją be persiuntimo.
Išverstas prievadas išgyvena perkrovimus, jei taisyklės išsaugomos, bet priklauso nuo to, ar klientas išlaikys tą patį tunelio adresą. Dinaminis telkinys, kuris po prisijungimo iš naujo suteikia nešiojamajam kitą adresą, tyliai nukreipia taisyklę į nieką. Pirmiausia rezervuokite tunelio adresą, tada rašykite taisyklę ir traktuokite abu kaip vieną pakeitimą.
Jei paslauga turi atsakyti trečią valandą nakties be jokio stebėtojo, forma su serverio paskelbtu prievadu turi mažiau judančių dalių, nes vienintelis procesas, kuris turi išlikti, yra pats tunelis.
Antroji sąlyga: kam priklauso užkarda ir žurnalai
Atvirkštinė forma laiko visą politiką dviejose vietose. sshd per AllowTcpForwarding sprendžia, ar nuotoliniai persiuntimai apskritai leidžiami, o GatewayPorts sprendžia, ar klausytojas prisiriša prie loopback, ar prie kiekvieno adreso. Su numatytąja reikšme no kolega už serverio ribų negali pasiekti prievado, nors persiuntimas pavyko, ir tai atrodo kaip sugedęs tunelis, nors iš tikrųjų tai prisirišimo adresas.
sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config
Išverstai formai reikia įjungto persiuntimo ir dviejų taisyklių, ir antroji taisyklė yra vieta, kur dauguma receptų suklysta. Šaltinio vertimo apribojimas conntrack būsena DNAT reiškia, kad perrašomi tik paskirties taisyklės sukurti ryšiai, o ne kiekvienas paketas, kurį serveris siunčia į tunelį.
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8081 -j DNAT --to-destination 10.88.0.6:8080
sudo iptables -t nat -A POSTROUTING -o tun0 -m conntrack --ctstate DNAT -j SNAT --to-source 10.88.0.1
Tas perrašymas taip pat sunaikina priskyrimą. Po jo klientas kiekvieną skambintoją mato kaip serverio tunelio adresą, o tai suplaka bet kokį greičio limitą pagal adresą į vieną kibirą ir paslepia, kas ką išsiuntė. Jei priskyrimas svarbus, užbaikite ryšį serveryje arba palikite leidimo sprendimą ten ir perduokite tapatybę antraštėje, kuria paslauga pasitiki. Pasirinkimas tarp šių dviejų pataisų priklauso nuo to, ar paslauga apskritai skaito tarpinio serverio antraštę.
Trečioji sąlyga: vienas prievadas ar daug, ir kam priklauso vardas
Viena paslauga viename prievade yra atvejis, kai atvirkštinis persiuntimas laimi pastangų sąskaita. Reikia vienos komandos, vienos paskyros ir vienos užkardos taisyklės, o tvarkymas yra sesijos nutraukimas. Kelios paslaugos tame pačiame viešajame adrese stumia jus link serverio paskelbtos formos, nes kiekvienam atvirkštiniam persiuntimui reikia savo serverio prievado, o aibė auga su kiekviena paslauga.
Vardai dar labiau apsunkina. Atvirkštinis persiuntimas gali būti už TCP tarpinio serverio, kuris maršrutizuoja pagal SNI, o išverstas prievadas paprastai yra vienas prievadas vienai paslaugai. Jei paslauga pati užbaigia TLS ir jai reikia pirminio pagrindinio kompiuterio vardo, tarpinio serverio metodas jį išsaugo, o DNAT metodas išsaugo tik tuo atveju, jei paslauga priima tą vardą tame prievade.
Užrašykite, kuri iš trijų sąlygų nulėmė formą. Priešingu atveju kitas žmogus, pridėsiantis antrą paslaugą, vėl atidarys tą patį palyginimą su mažiau konteksto.
Nuspręskite, tada išbandykite iš išorės
Išbandykite kelią iš tinklo, kuris neturi jokio maršruto iki nešiojamojo kompiuterio, ir stebėkite serverio skaitiklius, kol užklausa vykdoma. Bandymas iš serverio į jo paties viešąjį adresą čia nieko neįrodo, nes paketas sukuriamas vietiškai ir niekada nepasiekia įeinančio vertimo kabliuko, todėl testas gali praeiti, nors tikrasis kelias sugadintas.
sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20
Skaitikliai, kurie nejuda, reiškia, kad paketas niekada nepasiekė taisyklės, o tai rodo tiekėją arba pagrindinio kompiuterio užkardą. Skaitikliai, kurie juda, kai paslauga atmeta, rodo paties kliento užkardą arba adresą, kuriuo paslauga klausosi. Tunelis, kuris perneša paketą, bet nieko negrąžina, yra maršruto arba atgalinio kelio problema, ir nė vieno iš šių trijų rezultatų neturėtų būti derinama redaguojant kliento adapterį. Užrašykite, kuris skaitiklis pajudėjo, prieš ką nors keisdami, nes kitam testui reikia tos bazinės linijos.
Kai forma veikia, užrašykite prievadą, savininką ir priežiūros metodą šalia tunelio konfigūracijos. Pasiekiamumo pataisa, kuri egzistuoja tik kažkieno apvalkalo istorijoje, yra vieno perkrovimo atstumu nuo pasikartojančio incidento.