Selfs 'n skootrekenaar agter 'n diensverskaffer se NAT kan 'n kollega bedien, solank die VPN-bediener as die ontmoetingspunt optree. Twee meganismes bereik dit: die kliënt skakel uit en vra die bediener om 'n luisterpoort te hou, of die bediener publiseer 'n poort en vertaal dit in die tonnel in. Albei los dieselfde bereikbaarheidsprobleem op en gedra hulle anders onder faling, toesig en logboeke. Drie voorwaardes bepaal watter een in jou opstelling hoort.

Twee vorms, een ontmoetingspunt

In die eerste vorm maak die kliënt 'n SSH-sessie na buite oop en vra die bediener om op 'n gekose poort te luister, terwyl elke verbinding deur daardie sessie teruggevoer word. Op die bediener word niks deurgestuur nie en geen pakkievertaling vind plaas nie, so die enigste vereistes is 'n SSH-rekening, 'n toegelate deurstuur en 'n brandmuurreël vir die poort. Die diens bly op loopback by die kliënt gebind, wat gewoonlik is wat jy wil hê.

ssh -N -R 8081:127.0.0.1:8080 -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 [email protected]

In die tweede vorm besit die bediener die openbare poort en herlei elke verbinding na die kliënt se tonneladres. Dit vereis dat IP-deurstuur geaktiveer is, 'n bestemmingsvertaling op die inkomende pad en 'n brontvertaling op die uitgaande pad, en dit werk steeds wanneer daar geen SSH-sessie bestaan nie. Die poort behoort aan die bediener en nie aan 'n sessie nie, en dit is die eienskap wat die meeste werklike gevalle beslis.

Geen van die twee vorms is inherent veiliger nie. Albei stel een dienspoort bloot aan enigiemand wat die bediener se openbare adres kan bereik, en albei bly afhanklik van die diens se eie verifikasie.

Voorwaarde een: moet die poort langer as die sessie leef

'n Omgekeerde deurstuur leef presies so lank as die SSH-sessie wat dit geskep het. Wanneer die skakel val, verdwyn die luisteraar en sien die kollega 'n geweierde verbinding eerder as 'n stadige pad. Om die opdrag met 'n systemd-eenheid en 'n herbeginbeleid te monitor los dit op, en ExitOnForwardFailure=yes maak 'n mislukte binding onmiddellik sigbaar in plaas daarvan om 'n sessie te laat loop sonder enige deurstuur.

'n Vertaalde poort oorleef herlaai as die reëls volgehou word, maar dit hang daarvan af dat die kliënt dieselfde tonneladres behou. 'n Dinamiese poel wat die skootrekenaar ná 'n herverbinding 'n ander adres gee, wys die reël stilweg na niks. Resenteer die tonneladres eerste, skryf dan die reël, en hanteer die twee as een verandering.

As die diens om drie in die oggend moet antwoord sonder dat iemand kyk, is die bediener-gepubliseerde poort die vorm met minder bewegende dele, want die enigste proses wat aan die gang moet bly, is die tonnel self.

Voorwaarde twee: wie besit die brandmuur en die logboeke

Die omgekeerde vorm hou alle beleid op twee plekke. sshd besluit of afgeleë deurstuur hoegenaamd toegelaat word deur AllowTcpForwarding, en GatewayPorts besluit of die luisteraar aan loopback of aan elke adres bind. Met die verstek no kan 'n kollega buite die bediener nie die poort bereik nie, selfs al was die deurstuur suksesvol, en dit lyk soos 'n stukkende tonnel terwyl dit eintlik 'n bindadres is.

sudo ss -ltn '( sport = :8081 )'
sudo grep -E '^(GatewayPorts|AllowTcpForwarding)' /etc/ssh/sshd_config

Die vertaalde vorm vereis deurstuur en twee reëls, en die tweede reël is waar die meeste resepte fout gaan. Om die brontvertaling met die conntrack-toestand DNAT te beperk, beteken dat slegs die verbindings wat die bestemmingsreël geskep het herskryf word, in plaas van elke pakkie wat die bediener in die tonnel stuur.

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

Daardie herskrywing vernietig ook toeskrywing. Ná daardie herskrywing sien die kliënt elke oproeper as die bediener se tonneladres, wat enige limiet per adres in een emmer laat val en verberg wie wat gestuur het. As toeskrywing saak maak, beëindig die verbinding op die bediener of hou die toelatingsbesluit daar en gee 'n identiteit deur in 'n kopstuk wat die diens vertrou. Om tussen daardie twee regstellings te kies, hang daarvan af of die diens hoegenaamd 'n proxy-kopstuk lees.

Voorwaarde drie: een poort of baie, en wie besit die naam

'n Enkele diens op 'n enkele poort is die geval waar die omgekeerde deurstuur op moeite wen. Jy het een opdrag, een rekening en een brandmuurreël nodig, en opruiming is om die sessie te beëindig. Verskeie dienste op dieselfde openbare adres dwing jou na die bediener-gepubliseerde vorm, want elke omgekeerde deurstuur het sy eie bedienerpoort nodig en die stel groei met elke diens.

Name maak dit verder ingewikkeld. 'n Omgekeerde deurstuur kan agter 'n TCP-proxy sit wat volgens SNI roeteer, terwyl 'n vertaalde poort gewoonlik een poort per diens is. As die diens self TLS beëindig en die oorspronklike gasheernaam nodig het, behou die proxy-benadering dit, en die DNAT-benadering behou dit net as die diens daardie gasheernaam op daardie poort aanvaar.

Skryf neer watter van die drie voorwaardes die vorm bepaal het. Die volgende persoon wat 'n tweede diens byvoeg, sal anders die dieselfde vergelyking met minder konteks heropen.

Besluit, en toets dan van buite

Toets die pad vanaf 'n netwerk sonder enige roete na die skootrekenaar, en kyk na die tellers op die bediener terwyl die versoek loop. Om van die bediener na sy eie openbare adres te toets, bewys hier niks, want die pakkie word plaaslik geskep en bereik nooit die inkomende vertalingshaak nie, so die toets kan slaag terwyl die werklike pad stukkend is.

sudo iptables -t nat -L PREROUTING -n -v
sudo tcpdump -ni any 'tcp port 8081' -c 20

Tellers wat plat bly, beteken die pakkie het nooit by die reël uitgekom nie, wat op die verskaffer of die gasheer se brandmuur dui. Tellers wat beweeg terwyl die diens weier, dui op die kliënt se eie brandmuur of die adres waarop die diens luister. 'n Tonnel wat die pakkie dra maar niks terugstuur nie, is 'n roete- of terugpadprobleem, en nie een van hierdie drie uitkomste moet deur die kliëntadapter te wysig ontfout word nie. Skryf neer watter teller beweeg het voordat jy iets verander, want die volgende toets het daardie basislyn nodig.

Sodra die vorm werk, teken die poort, die eienaar en die toesigmetode by die tonnelkonfigurasie aan. 'n Bereikbaarheidsoplossing wat net in iemand se dopgeskiedenis bestaan, is een herlaai weg van 'n herhaalde voorval.

Verwante artikels