Was Sie sehen
Die Sitzung startet normal. Die Meldung erscheint, wenn etwas den Tunnel benutzt, nicht beim Verbinden, und zwar in dem Terminal, in dem ssh läuft:
channel 3: open failed: administratively prohibited: open failed
Das Programm, das den Tunnel nutzt, scheitert getrennt davon mit eigener Meldung. Ein SSH-Client, der hindurchgeht, gibt zum Beispiel kex_exchange_identification: read: Connection reset by peer aus.
Verwandte Formen derselben Einstellungen:
| Befehl | Ausgabe |
|---|---|
ssh -L oder ssh -D | channel 3: open failed: administratively prohibited: open failed |
ssh -W oder ssh -J | channel 0: open failed: administratively prohibited: open failed, danach stdio forwarding failed |
ssh -R | Warning: remote port forwarding failed for listen port 8080 |
Ein anderes Ende der Meldung bedeutet ein anderes Problem. open failed: connect failed: Connection refused heißt, die Weiterleitung war erlaubt, aber auf dem Zielhost und -port lauscht nichts. Korrigieren Sie dann das Ziel, nicht die Konfiguration.
Welche Einstellung das auslöst
| Wo | Einstellung | Blockiert |
|---|---|---|
sshd_config | AllowTcpForwarding no | -L, -D, -W, -J und -R |
sshd_config | AllowTcpForwarding remote | -L, -D, -W und -J |
sshd_config | AllowTcpForwarding local | -R |
sshd_config | DisableForwarding yes | Jede Weiterleitung, überschreibt die anderen Einstellungen |
sshd_config | PermitOpen 127.0.0.1:5432 | -L zu jedem Ziel, das nicht in der Liste steht |
sshd_config | PermitListen 9000 | -R auf jedem Port, der nicht in der Liste steht |
authorized_keys | restrict oder no-port-forwarding | Weiterleitung bei Anmeldung mit diesem Schlüssel |
authorized_keys | permitopen="127.0.0.1:5432" | -L mit diesem Schlüssel zu jedem anderen Ziel |
Was Schlüsseloptionen wie restrict und permitopen bewirken, steht Zeile für Zeile in die Datei authorized_keys erklärt.
Herausfinden, welche Einstellung bei Ihnen gilt
Dafür brauchen Sie Admin-Rechte auf dem Server. Fragen Sie sshd, was er auf Ihren Benutzer anwenden würde. Das einfache sshd -T ignoriert Match-Blöcke, geben Sie deshalb die Verbindungsdaten mit an. In einem Test zeigte die einfache Form yes, obwohl der echte Wert des Benutzers no war:
sudo sshd -T -C user=name,host=server,addr=203.0.113.10 | grep -iE '^(allowtcpforwarding|disableforwarding|permitopen|permitlisten)'
Sehen Sie sich auch die Optionen vor dem Schlüssel in der Datei dieses Benutzers an:
sudo cut -c1-60 ~name/.ssh/authorized_keys
Das Log des Servers nennt das abgelehnte Ziel:
refused local port forward: originator 127.0.0.1 port 65535, target 127.0.0.1 port 22
Beheben
Wenn es nicht Ihr Server ist, fragen Sie dessen Administrator. Die Sperre ist meist Absicht, denn ein Tunnel erlaubt einem Benutzer, interne Systeme von außen zu erreichen. Nennen Sie, welchen Host und Port Sie brauchen, damit nur genau das freigegeben werden kann.
Wenn es Ihr Server ist, bevorzugen Sie eine enge Regel, statt die Weiterleitung für alle einzuschalten. Setzen Sie dies ans Ende der sshd_config:
Match User name
AllowTcpForwarding local
PermitOpen 127.0.0.1:5432
Prüfen Sie dann die Konfiguration und laden Sie sie neu. Der Dienst heißt unter Debian und Ubuntu ssh und auf Red-Hat-artigen Systemen sshd:
sudo sshd -t && sudo systemctl reload ssh
Beachten Sie, dass bei den meisten Schlüsselwörtern sshd den ersten Wert verwendet, den er liest. Steht weiter oben eine Zeile AllowTcpForwarding no, bewirkt ein yes weiter unten nichts. Unter Debian und Ubuntu werden Dateien in /etc/ssh/sshd_config.d/ zuerst gelesen, schauen Sie also auch dort nach. Führen Sie nach der Änderung sshd -T erneut aus, um das Ergebnis zu sehen.
Bei einem eingeschränkten Schlüssel ändern Sie die Optionen in seiner Zeile in der authorized_keys. Das gilt ab der nächsten Anmeldung, ohne Neuladen. Ein Schlüssel mit restrict kann zum Beispiel einen einzelnen Tunnel zurückbekommen:
restrict,port-forwarding,permitopen="127.0.0.1:5432" ssh-ed25519 AAAA... user@laptop
Siehe SSH-Schlüssel einschränken.
Fragen
Bedeutet administratively prohibited, dass Passwort oder Schlüssel falsch sind?
Nein. Die Anmeldung hat geklappt. Die Serverkonfiguration lehnt genau diese Weiterleitung ab, daher ändern nur ihre Einstellungen oder die Optionen Ihres Schlüssels das Ergebnis.
Wie erlaube ich Portweiterleitung nur für einen Benutzer?
Fügen Sie am Ende von sshd_config einen Block Match User name mit AllowTcpForwarding local und einer PermitOpen-Zeile für das Ziel ein, prüfen Sie mit sshd -t und laden Sie den Dienst neu.
Warum scheitert ssh -J mit administratively prohibited?
Ein Jump-Host muss TCP weiterleiten, um Ihre Verbindung durchzureichen. Hat er AllowTcpForwarding no oder remote, oder trägt Ihr Schlüssel restrict, scheitert die Verbindung mit -J genauso.
Quellen
- sshd_config(5), AllowTcpForwarding, PermitOpen, DisableForwarding
- sshd(8), Optionen in authorized_keys