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 Gateway 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)
- Client verbindet sich per SSH auf nginxproxymanager als User git
- sshd bekommt den Public Key und ruft den
AuthorizedKeysCommandauf - Dieser fragt bei Forgejo remote an:
forgejo keys ... - Forgejo antwortet mit einer kompletten authorized_keys Zeile inkl.
command="... forgejo serv key-X"und Restrictions - sshd akzeptiert den Key nur, wenn die Antwort passt
- Der Login landet nicht in einer Bash, sondern in unserem
git-shell, der den Git-Befehl an Forgejo weiterleitet - Forgejo macht dann das eigentliche
servund 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™