SSH duerch eng NGINX-Streamrelais ouni se ze briechen
En PROXY-Header ass eng Noriicht un en Empfänger, deen en erwaart, an en proxyten DNS-Record ass keng TCP-Relais. Reparéiert de Rand an den Upstream getrennt.
Öffentlech SSH duerch eng Relais schléit op zwou onverbonnenne Grenzen feel, an d'Reparatur vun der enger weist meeschtens déi aner. Entweder gëtt de Rand eng HTTP-Antwert zréck amplaz e Stream ze droen, oder d'Relais setzt en Header virun, deen den Backend ni zougestëmmt huet ze liesen. Dräi Bedingunge bestëmmen, wéi eng Dir gesitt: wourop den öffentlechen Record tatsächlech weist, wat de Streamblock an den Upstream schéckt, a wéi en Numm den SSH-Client iwwerpréift. Schafft se an där Reihenfolg of.
Zwou Grenzen, zwou Symptomer
E Feeler um Rand gesäit aus wéi eng HTTP-Statussäit, déi do ukënnt, wou en SSH-Banner sollt sinn. D'Verbindung gëtt um TCP-Niveau fäerdeg an déi éischt Byte sinn Text, dee vun engem Webserver ass. Dat ass eng Protokoll-Onstëmmegkeet, keen verluerene Pak. Et seet Iech och, datt de Rand fir deen Numm bewosst eppes anescht zerwéiert.
E Feeler am Upstream gesäit anescht aus. D'Verbindung erreecht sshd, sshd liest Byte, déi net den erwaarten Identifikatiounsaustausch sinn, an d'Sessioun stierft oder hänkt ouni jeemools e Schlëssel uzedroen.
Déi zwou sinn einfach ze verwiesselen, well béid e Client produzéieren, dee sech verbënnt an dann feelt. Déi éischt Protokolläntwert, déi Dir kritt, ass dat wat se ënnerscheet, dofir gehéiert se an den Ticket.
Den PROXY-Header ass eng Noriicht, keen Schalter
Am Streammodul seet proxy_protocol on dem NGINX, virun der Notzlaascht en PROXY-Protokollheader a Richtung Upstream ze schreiwen. Et aktivéiert keen TCP-Proxy, an et huet näischt mat SSH-Verschlësselung ze dinn. Et ass eng Notiz un den Empfänger. Kann den Empfänger se net liesen, gëtt se Schrott um Ufank vum Stream.
Den empfangende Service muss deen Header bewosst konsuméieren. En normale sshd erwaart den SSH-Identifikatiounsaustausch als éischt Byte vun der Verbindung, dofir brécht eng onerwaart Präambel den Handshake sou, datt et wéi en beschiedegte Server ausgesäit.
stream {
server {
listen 2222;
proxy_pass 10.77.0.20:22;
}
}
Dee Fragment ass de ganzen funktionéierende Relais fir en Backend, deen iwwer d'VPN erreechbar ass. Et erschéngt keng PROXY-Direktiv, well den Empfänger de Protokoll net schwätzt, an dat Fehlen ass eng Entscheedung, keen Auslooss.
Trennt och déi zwou Richtungen. proxy_protocol op der listen-Linn ze setzen heescht, datt den NGINX erwaart, datt säin eegene Client den Header fir d'éischt schéckt; et fir en normale SSH-Client anzeschalten produzéiert genee dat Géigendeel vum Problem, deen d'Leit meeschtens ze léisen versichen.
Wat den öffentlechen Hostnumm tatsächlech erreecht
Eng HTTP 400-Säit an enger SSH-Sessioun ass en Beweis iwwer de Rand. Eppes um Wee schwätzt HTTP, an keng Schlëssel- oder Kontosaarbecht um Backend wäert dat änneren. Ophalen de Backend ze änneren, bis de Rand gekläert ass.
Den normale proxyte Record vum Cloudflare dréit säin ënnerstëtzten HTTP- an HTTPS-Trafic op definéierte Porten. De Proxy fir en Hostnumm anzeschalten erstellt keng allgemeng TCP-Relais, an SSH op de Port 443 ze verleeën mécht et net zu HTTPS.
Et gëtt zwou gangbar Richtungen. En DNS-nëmme Record kann op Är eege TCP-Relais weisen, wat d'Entscheedung iwwer d'Expositioun an Ären Hänn léisst. Alternativ benotzt e Produkt, dat den SSH-Transport ausdrécklech dokumentéiert, mat senger eegener Origin-, Client- an Zougrëffskonfiguratioun.
Wat Dir och wielt, d'Relais brauch nach eng VPN-Route zum Backend, eng erlaabte Verbindung an e Réckwee. D'Route ass net fakultativ, well d'öffentlech Säit funktionéiert.
Halt d'SSH-Identitéit duerch en Alias stabil
Benotzer wëllen meeschtens weiderhiiren existéierenden Hostnumm tippen. En Alias an der SSH-Konfiguratioun kann dat ouni eppes un der Relais ze änneren, an et hält d'Ännerung op der Client-Säit, wou se gehéiert.
Host git.example.com
HostName ssh-entry.example.net
Port 2222
User git
HostKeyAlias git.example.com
Ouni HostKeyAlias sicht den OpenSSH de Hostschlëssel ënner dem Numm, mat deem et sech verbënnt, dofir beweegt sech den Entrée an all Benotzer gesäit beim éischte Gebrauch eng Warnung iwwer ee geännerten Schlëssel. Den Alias ze setzen hält known-hosts-Entréeë stabil, wärend d'Verbindung nach ëmmer an d'Relais geet.
Dësen Alias gëllt nëmme fir SSH-baséiert Remote-Repositoiren. Eng HTTPS-Git-URL konsultéiert en net, an déi typesch Remote-URL muss zum Transport passen, deen Dir tatsächlech virbereet hutt.
Wat Dir net däerft maachen, ass d'Hostschlësselpréifung auszeschalten, fir d'Warnung lass ze ginn. Dat hëlt eng Protektioun ewech, déi d'Reparatur vun der Weiderleeung ni gefrot huet ze beréieren, an et mécht eng kosmetesch Middegkeet zu enger realer Expositioun.
Iwwerpréift all Sprong getrennt
Test de öffentlechen Nolauschterer eleng, dann d'Verbindung vun der Relais zum Backend vum Relais-Host aus, an eréischt duerno de Client vum Enn bis zum Enn. Jiddwereen vun deenen dräi Tester schléisst eng aner Schicht aus. Ee gëtt iwwersprongen, heescht datt déi zwou aner Resultater net kënnen interpretéiert ginn. Dräi Observatiounen, dräi Plazen, wou e Feeler ka liewen.
Halt d'Destinatiounsadress, de Port an déi éischt Protokollbyte bei all Resultat. Dat Dräiheet ënnerscheet e Randfeeler vun engem VPN-Routingproblem an vun engem SSH-Authentifikatiounsfeeler, an et ass den Ënnerscheed tëscht enger Reparatur an enger Vermutung.
Dokumentéiert zum Schluss déi virgesinn Expositioun. Eng TCP-Relais, déi SSH zu engem private Backend dréit, ass eng bewosst oppen Plaz am öffentleche Perimeter, an se verdéngt déi selwecht Iwwerpréifung wéi all aneren agäende Service.