Menü aufrufen
Toggle preferences menu
Persönliches Menü aufrufen
Nicht angemeldet
Ihre IP-Adresse wird öffentlich sichtbar sein, wenn Sie Änderungen vornehmen.
Version vom 8. Februar 2026, 19:33 Uhr von Aylen (Diskussion | Beiträge) (TL;DR)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Forgejo SSH über Gateway Host (wegen Fritzbox IPv6 / nur ein Endpoint)

TL;DR

Forgejo läuft auf einem eigenen Server (forgejo), aber der SSH-Endpoint ist nginxproxymanager. Der nginxproxymanager Host nimmt SSH auf Port 22 an, fragt Forgejo nach Keys (AuthorizedKeysCommand) und leitet die Git-Commands an Forgejo weiter.

Usecase: Fritzbox / IPv6 kann (praktisch) nur einen internen Host sauber als "den Server" bedienen, und wir wollen:

  • 80/443 → nginxproxymanager (Web/Reverse Proxy)
  • 22 → nicht direkt auf Forgejo (geht so nicht sauber / nur ein Endpoint)

Also: 22 landet auch auf nginxproxymanager und wird von dort „weitergereicht“.

Problem / Hintergrund

Auf einer Fritzbox mit IPv6-Setup ist es manchmal nervig bis unmöglich, mehrere interne Hosts mit unterschiedlichen Ports „schön“ ins Internet zu exposen:

  • NPM braucht 80/443
  • Forgejo braucht 22 (SSH)

Wenn man nicht direkt Port 22 auf Forgejo forwarden kann/will, muss der Host, der eh exposed ist (NPM), auch SSH annehmen.

Architektur

Internet
  |
  v
Fritzbox
  |
  v
nginxproxymanager (Port 22/80/443 exposed)
  |
  +-- Web: 80/443 -> NPM -> Forgejo HTTP (normaler Reverse Proxy Kram)
  |
  +-- SSH: 22 -> sshd (User git) -> forgejo keys lookup -> git-shell -> forgejo serv -> repo

Voraussetzungen

  • Forgejo läuft auf einem separaten Server forgejo
  • Forgejo SSH ist aktiv
  • Forgejo soll keine lokale authorized_keys Datei pflegen (weil Keys remote abgefragt werden)

Forgejo Config (auf Server forgejo)

Datei: /etc/forgejo/app.ini

Relevante Werte:

[server]
DISABLE_SSH = false
SSH_PORT = 22
SSH_CREATE_AUTHORIZED_KEYS_FILE = false

Hinweis: Forgejo wurde via Proxmox Community Helper Script erzeugt.

Setup auf nginxproxymanager (SSH Gateway)

1) Linux User git anlegen

adduser git

2) git-shell Wrapper (forward SSH_ORIGINAL_COMMAND nach forgejo)

Datei: /home/git/git-shell

#!/bin/sh
shift
ssh -o StrictHostKeyChecking=no git@forgejo "SSH_ORIGINAL_COMMAND=\"$SSH_ORIGINAL_COMMAND\" $@"

Rechte setzen:

chmod +x /home/git/git-shell
chown git:git /home/git/git-shell

Shell für User git setzen:

usermod -s /home/git/git-shell git

3) SSH Multiplexing (optional, aber schneller)

Weil sshd bei jedem Login den AuthorizedKeysCommand ausführt, ist es nett, wenn der SSH-Client vom User git die Verbindung zu forgejo re-used.

Datei: /home/git/.ssh/config

Host *
  ControlPath ~/.ssh/cm-%r@%h:%p
  ControlMaster auto
  ControlPersist 24h
  ServerAliveInterval 8
  ServerAliveCountMax 3

Rechte:

mkdir -p /home/git/.ssh
chown -R git:git /home/git/.ssh
chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/config

4) sshd: AuthorizedKeysCommand auf Forgejo zeigen lassen

Datei: /etc/ssh/sshd_config.d/50-forgejo.conf

Match User git
  AuthorizedKeysCommandUser git
  AuthorizedKeysCommand /usr/bin/ssh -o StrictHostKeyChecking=no git@forgejo /opt/forgejo/forgejo --config /etc/forgejo/app.ini keys -e git -u %u -t %t -k %k

Danach sshd neu starten:

systemctl restart sshd

Wie funktioniert das? (grob)

  1. Client verbindet sich per SSH auf nginxproxymanager als User git
  2. sshd bekommt den Public Key und ruft den AuthorizedKeysCommand auf
  3. Dieser fragt bei Forgejo remote an: forgejo keys ...
  4. Forgejo antwortet mit einer kompletten authorized_keys Zeile inkl. command="... forgejo serv key-X" und Restrictions
  5. sshd akzeptiert den Key nur, wenn die Antwort passt
  6. Der Login landet nicht in einer Bash, sondern in unserem git-shell, der den Git-Befehl an Forgejo weiterleitet
  7. Forgejo macht dann das eigentliche serv und Repo-Access

Test / Debug

A) Forgejo keys lookup manuell testen

Auf nginxproxymanager:

sudo -u git /usr/bin/ssh -o BatchMode=yes -o ControlMaster=no -o ControlPath=none \
  -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \
  git@forgejo /usr/local/bin/forgejo --config /etc/forgejo/app.ini \
  keys -e git -u git -t ssh-ed25519 -k AAAAC3NzaC1lZDI1NTE5AAAA...

Wenn alles gut ist, kommt sowas zurück:

# gitea public key
command="/usr/local/bin/forgejo --config=/etc/forgejo/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAA... comment

B) SSH Login debuggen

Auf Client:

ssh -vvv git@git.nerdberg.de

Auf nginxproxymanager parallel:

journalctl -u sshd -f

Ergebnis

Git-SSH läuft über nginxproxymanager, Forgejo bleibt intern und entscheidet trotzdem über Keys und Berechtigungen. Port-Forward-Chaos auf der Fritzbox umgangen. Works™