Arritja e një shërbimi në një klient VPN: tunel i kundërt ose DNAT
Arritja e një shërbimi në një klient OpenVPN pa përcjellje porti: krahasoni një tunel SSH të kundërt me DNAT në server dhe tre kushtet që zgjedhin një.
Edhe një laptop pas NAT-it të operatorit mund t'i shërbejë një kolegu, mjafton që serveri VPN të veprojë si pikë takimi. Dy mekanizma çojnë atje: klienti lidhet nga jashtë dhe i kërkon serverit të mbajë një port dëgjimi, ose serveri publikon një port dhe e përkthen në tunel. Të dyja zgjidhin të njëjtin problem arritshmërie dhe sillen ndryshe në dështim, mbikëqyrje dhe regjistrim. Tre kushte vendosin cila i përket konfigurimit tuaj.
Dy forma, një pikë takimi
Në formën e parë klienti hap një sesion SSH nga jashtë dhe i kërkon serverit të dëgjojë në një port të zgjedhur, duke e kthyer çdo lidhje përmes atij sesioni. Në server nuk përcillet asgjë dhe nuk ndodh asnjë përkthim paketash, prandaj kërkesat e vetme janë një llogari SSH, një përcjellje e lejuar dhe një rregull firewall për portin. Shërbimi mbetet i lidhur me loopback në klient, që zakonisht është ajo që dëshironi.
ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]
Në formën e dytë serveri zotëron portin publik dhe rishkruan çdo lidhje drejt adresës së tunelit të klientit. Kjo kërkon përcjellje IP të aktivizuar, një përkthim destinacioni në hyrje dhe një përkthim burimi në dalje, dhe vazhdon të funksionojë kur nuk ekziston asnjë sesion SSH. Porti i përket serverit dhe jo një sesioni, dhe kjo veti vendos shumicën e rasteve reale.
Asnjëra formë nuk është më e sigurt nga ndërtimi. Të dyja përfundojnë duke ekspozuar një port shërbimi ndaj kujtdo që mund të arrijë adresën publike të serverit, dhe të dyja varen ende nga vërtetimi i vetë shërbimit.
Kushti i parë: duhet porti të jetojë më gjatë se sesioni
Një përcjellje e kundërt jeton saktësisht sa sesioni SSH që e krijoi. Kur lidhja bie, dëgjuesi zhduket dhe kolegu sheh një lidhje të refuzuar në vend të një rruge të ngadaltë. Mbikëqyrja e komandës me një njësi systemd dhe një politikë rindezjeje e zgjidh këtë, dhe ExitOnForwardFailure=yes e bën të dukshme menjëherë një lidhje të dështuar në vend që të lërë një sesion që punon pa përcjellje.
Një port i përkthyer i mbijeton rindezjeve nëse rregullat ruhen, por varet nga mbajtja e të njëjtës adresë tuneli nga klienti. Një grup dinamik që i jep laptop-it një adresë tjetër pas rilidhjes e drejton rregullin në heshtje drejt asgjëje. Rezervoni fillimisht adresën e tunelit, pastaj shkruani rregullin, dhe trajtoni të dyja si një ndryshim të vetëm.
Nëse shërbimi duhet të përgjigjet në orën tre të mëngjesit pa askush që shikon, forma me portin e publikuar nga serveri ka më pak pjesë lëvizëse, sepse procesi i vetëm që duhet të mbetet në këmbë është vetë tuneli.
Kushti i dytë: kujt i përkasin firewalle dhe regjistrat
Forma e kundërt mban të gjithë politikën në dy vende. sshd vendos përmes AllowTcpForwarding nëse përcjelljet në distancë lejohen fare, dhe GatewayPorts vendos nëse dëgjuesi lidhet me loopback ose me çdo adresë. Me vlerën e paracaktuar no një koleg jashtë serverit nuk arrin dot portin edhe pse përcjellja pati sukses, dhe kjo duket si tunel i prishur kur në të vërtetë është adresë lidhjeje.
sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config
Forma e përkthyer kërkon përcjellje të aktivizuar dhe dy rregulla, dhe rregulli i dytë është vendi ku gabojnë shumica e recetave. Kufizimi i përkthimit të burimit në gjendjen conntrack DNAT do të thotë që rishkruhen vetëm lidhjet e krijuara nga rregulli i destinacionit, jo çdo paketë që serveri dërgon në 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
Ai rishkrim shkatërron edhe atribuimin. Pas tij klienti e sheh çdo telefonues si adresën e tunelit të serverit, gjë që i bashkon të gjitha kufizimet e shpejtësisë për adresë në një kovë dhe fsheh kush dërgoi çfarë. Nëse atribuimi ka rëndësi, përfundoni lidhjen në server ose mbani atje vendimin e lejes dhe kaloni një identitet në një krye që shërbimi i beson. Zgjedhja midis këtyre dy rregullimeve varet nga ajo nëse shërbimi lexon fare një krye proxy.
Kushti i tretë: një port apo shumë, dhe kujt i përket emri
Një shërbim i vetëm në një port të vetëm është rasti ku përcjellja e kundërt fiton në mundim. Ju nevojitet një komandë, një llogari dhe një rregull firewall, dhe pastrimi është vrasja e sesionit. Shumë shërbime në të njëjtën adresë publike ju shtyjnë drejt formës së publikuar nga serveri, sepse çdo përcjellje e kundërt kërkon portin e vet të serverit dhe bashkësia rritet me çdo shërbim.
Emrat e ndërlikojnë më tej. Një përcjellje e kundërt mund të qëndrojë pas një proxy TCP që rrugëton sipas SNI, ndërsa një port i përkthyer është zakonisht një port për shërbim. Nëse shërbimi e përfundon vetë TLS-in dhe kërkon emrin origjinal të hostit, qasja me proxy e ruan atë, dhe qasja DNAT e ruan vetëm nëse shërbimi e pranon atë emër në atë port.
Shkruani cili nga tre kushtet e vendosi formën. Përndryshe personi tjetër që shton një shërbim të dytë do të rihapë të njëjtin krahasim me më pak kontekst.
Vendosni, pastaj provoni nga jashtë
Provoni rrugën nga një rrjet që nuk ka asnjë rrugë drejt laptop-it, dhe vëzhgoni numëruesit në server ndërsa kërkesa ekzekutohet. Prova nga serveri drejt adresës së tij publike nuk provon asgjë këtu, sepse paketa krijohet lokalisht dhe nuk arrin kurrë grepin e përkthimit të hyrjes, prandaj testi mund të kalojë ndërsa rruga reale është e prishur.
sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20
Numëruesit që mbeten të sheshtë nënkuptojnë se paketa nuk arriti kurrë te rregulli, gjë që tregon ofruesin ose firewalle e hostit. Numëruesit që lëvizin ndërsa shërbimi refuzon tregojnë firewalle e vetë klientit ose adresën në të cilën shërbimi dëgjon. Një tunel që e mbart paketën por nuk kthen asgjë është problem rruge ose rruge të kundërt, dhe asnjëri prej këtyre tre rezultateve nuk duhet korrigjuar duke redaktuar përshtatësin e klientit. Shkruani cili numërues lëvizi përpara se të ndryshoni diçka, sepse testi i radhës ka nevojë për atë bazë.
Kur forma funksionon, regjistroni portin, pronarin dhe metodën e mbikëqyrjes pranë konfigurimit të tunelit. Një rregullim arritshmërie që ekziston vetëm në historikun e shell-it të dikujt është një rindezje larg një incidenti të përsëritur.