VPN-kliendi teenusele jõudmine: pöördtunnel või DNAT
Jõuda OpenVPN-kliendi teenusele ilma pordiedastuseta: võrrelge pöörd-SSH-tunnelit serveripoolse DNAT-iga ja kolme tingimust, mis valiku teevad.
Isegi operaatori NAT-i taga olev sülearvuti saab kolleegi teenindada, kui VPN-server toimib kohtumispaigana. Sinna viib kaks mehhanismi: klient helistab välja ja palub serveril hoida kuulamisporti, või server avaldab pordi ja tõlgib selle tunnelisse. Mõlemad lahendavad sama kättesaadavuse probleemi ning käituvad rikke, järelevalve ja logimise korral erinevalt. Kolm tingimust otsustavad, milline neist teie seadistusse kuulub.
Kaks kuju, üks kohtumispaik
Esimeses kujus avab klient väljapoole SSH-sessiooni ja palub serveril valitud pordil kuulata, suunates iga ühenduse selle sessiooni kaudu tagasi. Serveris ei suunata midagi edasi ja paketitõlget ei toimu, seega on ainsad nõuded SSH-konto, lubatud edasisuunamine ja pordi tulemüürireegel. Teenus jääb kliendis loopbacki külge, mis on tavaliselt soovitud tulemus.
ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]
Teises kujus kuulub avalik port serverile ja see kirjutab iga ühenduse ümber kliendi tunneli aadressi suunas. See nõuab lubatud IP-edastust, sihtkoha tõlget sissepoole ja allika tõlget väljapoole ning jätkab tööd ka siis, kui SSH-sessiooni ei ole. Port kuulub serverile, mitte sessioonile, ja just see omadus otsustab enamiku tegelikke juhtumeid.
Kumbki kuju ei ole oma ülesehituselt turvalisem. Mõlemad jätavad ühe teenusepordi lahti kõigile, kes pääsevad serveri avalikule aadressile, ja mõlemad sõltuvad endiselt teenuse enda autentimisest.
Tingimus üks: kas port peab sessioonist kauem elama
Pöördedastus elab täpselt nii kaua kui selle loonud SSH-sessioon. Kui link katkeb, kuulaja kaob ja kolleeg näeb aeglase tee asemel keeldutud ühendust. Käsu järelevalve systemd-üksuse ja taaskäivituse poliitikaga parandab selle ning ExitOnForwardFailure=yes teeb ebaõnnestunud sidumise kohe nähtavaks, selle asemel et jätta edastuseta sessioon tööle.
Tõlgitud port elab taaskäivitused üle, kui reeglid on püsivalt salvestatud, kuid see sõltub sellest, et klient hoiaks sama tunneli aadressi. Dünaamiline varu, mis annab sülearvutile pärast taasühendamist teise aadressi, suunab reegli vaikselt tühja. Broneerige esmalt tunneli aadress, seejärel kirjutage reegel, ja käsitlege mõlemat ühe muudatusena.
Kui teenus peab vastama kell kolm öösel ilma kellegi pilguta, on serveri avaldatud pordiga kujul vähem liikuvaid osi, sest ainus protsess, mis peab püsti püsima, on tunnel ise.
Tingimus kaks: kellele kuuluvad tulemüür ja logid
Pöördkuju hoiab kogu poliitikat kahes kohas. sshd otsustab AllowTcpForwarding kaudu, kas kaugedastus on üldse lubatud, ja GatewayPorts otsustab, kas kuulaja seotakse loopbacki või iga aadressiga. Vaikeväärtusega no ei pääse serverist väljaspool olev kolleeg pordile ligi isegi siis, kui edastus õnnestus, ja see näeb välja nagu katkine tunnel, kuigi tegelikult on tegu sidumisaadressiga.
sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config
Tõlgitud kuju vajab lubatud edastust ja kahte reeglit, ja teine reegel on koht, kus enamik retsepte eksib. Allika tõlke piiramine conntracki olekuga DNAT tähendab, et ümber kirjutatakse ainult need ühendused, mille lõi sihtkoha reegel, mitte iga pakett, mille server tunnelisse saadab.
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
See ümberkirjutus hävitab ka omistamise. Pärast seda näeb klient iga kutsujat serveri tunneli aadressina, mis surub iga aadressipõhise kiiruspiirangu ühte ämbrisse ja varjab, kes mida saatis. Kui omistamine on oluline, lõpetage ühendus serveris või jätke loa otsus sinna ja edastage identiteet päises, mida teenus usaldab. Valik nende kahe paranduse vahel sõltub sellest, kas teenus üldse puhverserveri päist loeb.
Tingimus kolm: üks port või palju, ja kellele kuulub nimi
Üks teenus ühel pordil on juhtum, kus pöördedastus võidab vaeva arvelt. Vaja on üht käsku, üht kontot ja üht tulemüürireeglit ning koristamine on sessiooni tapmine. Mitu teenust samal avalikul aadressil lükkavad teid serveri avaldatud kuju poole, sest iga pöördedastus vajab oma serveriporti ja hulk kasvab iga teenusega.
Nimed muudavad selle keerulisemaks. Pöördedastus võib seista TCP-puhverserveri taga, mis marsruudib SNI järgi, samas kui tõlgitud port on tavaliselt üks port teenuse kohta. Kui teenus lõpetab TLS-i ise ja vajab algset hostinime, säilitab puhverserveri lähenemine selle ja DNAT-i lähenemine säilitab selle ainult siis, kui teenus aktsepteerib seda nime sellel pordil.
Kirjutage üles, milline kolmest tingimusest kuju otsustas. Muidu avab järgmine inimene, kes teise teenuse lisab, sama võrdluse väiksema kontekstiga uuesti.
Otsustage ja seejärel testige väljast
Testige teed võrgust, millel pole sülearvutini ühtki marsruuti, ja jälgige serveri loendureid, kuni päring töötab. Testimine serverist tema enda avaliku aadressi suunas ei tõesta siin midagi, sest pakett luuakse kohapeal ega jõua kunagi sissetuleva tõlke konksuni, seega võib test läbida, kuigi tegelik tee on katki.
sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20
Lamedaks jäävad loendurid tähendavad, et pakett ei jõudnud kunagi reeglini, mis osutab teenusepakkujale või hosti tulemüürile. Loendurid, mis liiguvad, kui teenus keeldub, osutavad kliendi enda tulemüürile või aadressile, millel teenus kuulab. Tunnel, mis paketti kannab, kuid midagi ei tagasta, on marsruudi või tagasitee probleem, ja ühtki neist kolmest tulemusest ei tohiks siluda kliendi adapterit muutes. Kirjutage üles, milline loendur liikus, enne kui midagi muudate, sest järgmine test vajab seda baasjoont.
Kui kuju töötab, märkige port, omanik ja järelevalvemeetod tunneli konfiguratsiooni kõrvale. Kättesaadavuse parandus, mis eksisteerib ainult kellegi kestaajaloos, on ühe taaskäivituse kaugusel korduvast juhtumist.