Ich versuche, GitLab auf meinem Heimserver einzurichten. HTTPS funktioniert und ich kann auf die Schnittstelle von GitLab zugreifen, SSH jedoch nicht und daher kann ich keinen Code auf den Server übertragen.
Hier ist das Setup:
Cloudflare <--> Reverse Proxy (nginx, hosted on Digital Ocean) <--- VPN ---> Untangle Firewall <--> GitLab Server (on ESXi)
Wenn ich versuche, per SSH direkt vom Reverse Proxy auf den GitLab-Server zuzugreifen (über eine VPN-Verbindung), funktioniert es einwandfrei.
Wenn ich versuche, von meinem Laptop aus über den Domänennamen eine SSH-Verbindung herzustellen, erhalte ich Folgendes:
kex_exchange_identification: Connection closed by remote host
Connection closed by 104.31.73.156 port 2095
Wenn ich versuche, von meinem Laptop aus eine SSH-Verbindung über die IP des Reverse-Proxys herzustellen (und so Cloudflare ausschalte), erhalte ich Folgendes:
Bad packet length 1231976033.
ssh_dispatch_run_fatal: Connection to {{ IP }} port 2095: message authentication code incorrect
Ich versuche derzeit, hierfür das Nginx-Stream-Modul zu verwenden. Dies ist das Stream-Setup:
stream {
upstream git-ssh {
server {{INTERNAL GITLAB IP}}:22;
}
server {
listen 2095;
proxy_pass {{INTERNAL GITLAB IP}}:22;
proxy_protocol on;
}
}
Der Grund, warum ich Upstream-Git-SSH habe und es dann nicht verwende, war, dass ich mich gefragt habe, ob das das Problem war, aber es macht keinen Unterschied, ob ich es verwende oder nicht.
Ich kenne mich mit iptables nicht aus, habe aber die folgenden Befehle ausprobiert:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2095 -j DNAT --to-destination {{GITLAB IP}}:22
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 2095 -j SNAT --to-source {{PROXY IP}}
Aber es schien nicht zu funktionieren. SSH sitzt einfach da, gibt nichts zurück und läuft schließlich ab.
UFW ist derzeit auf dem Proxy zu Testzwecken deaktiviert, daher passiert dort nichts. 2095 ist ein zugelassener Port für Cloudflare (https://support.cloudflare.com/hc/en-us/articles/200169156-Identifying-network-ports-compatible-with-Cloudflare-s-proxy), also sollte es das nicht sein. SSH ist durch die GitLab-Firewall erlaubt, also sollte es das nicht sein. Ich habe die Firewall in DigitalOcean noch nicht eingerichtet, also sollte es das nicht sein.
Ich bin jetzt ratlos und hoffe, dass mir jemand Tipps geben kann.
Antwort1
Egal, ich konnte das Problem schließlich beheben, wenn auch nicht ganz zu meiner Zufriedenheit.
Aus meiner Stream-Konfiguration musste ich proxy_protocol entfernen;
Cloudflare war weiterhin ein Problem. Wenn ich ssh -vvv zum Host/Protokoll über Cloudflare ausführte, wurde angezeigt, dass eine 400-HTML-Seite zurückgegeben wurde, anstatt sie durchzulassen. Ich musste also einen neuen Eintrag hinzufügen, um den Datenverkehr durch das Cloudflare-Netzwerk zuzulassen, ohne ihn zu proxyen, weshalb ich mit meiner Lösung nicht ganz zufrieden bin.
Schließlich musste ich meine Datei ~/.ssh/config bearbeiten und einen HostName-Parameter hinzufügen, damit ich den Git-Upstream-Ursprung nicht für jedes meiner Projekte korrigieren musste.
Wenn jemand eine bessere Lösung hat, mit der ich Cloudflare weiterhin mit Proxy verwenden kann, würde ich sie gerne hören.