From eb29db0130d2b5d2acb96e4d3ee3cb2f3e01bafd Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sun, 20 Sep 2026 23:44:07 +0200 Subject: [PATCH] no_proxy vergleicht Namen, keine Adressen - NPM_API_HOST Der Kern des Problems, und die Stelle, an der man am laengsten sucht: "no_proxy=localhost" deckt eine Anfrage an 127.0.0.1 NICHT ab, und umgekehrt genauso wenig. An curl 7.88 nachgemessen: no_proxy an 127.0.0.1 an localhost localhost ueber den Proxy direkt 127.0.0.1 direkt ueber den Proxy In Firmennetzen steht oft nur "localhost" in der Ausnahmeliste - dann laeuft ausgerechnet der Zugriff auf die Schnittstelle des Proxy Managers ueber den Proxy, obwohl no_proxy dem Anschein nach gesetzt ist. Deshalb NPM_API_HOST: damit laesst sich die Schnittstelle als "localhost" ansprechen, ohne die Ausnahmeliste zu aendern - was im Kundennetz oft nicht in der eigenen Hand liegt. Vorgabe bleibt 127.0.0.1, denn das kommt ohne Namensaufloesung aus und zeigt immer auf IPv4. "noproxy" prueft jetzt beide Schreibweisen einzeln und sagt, welche fehlt, statt nur "geht nicht" zu melden: http://127.0.0.1:81/ geht an den Proxy http://localhost:81/ direkt [ WARN ] Nur 'localhost' ist ausgenommen, 127.0.0.1 nicht. Bis das geaendert ist, hilft sofort: cmk-manage.sh config set NPM_API_HOST localhost Co-Authored-By: Claude Opus 5 (1M context) --- .env.example | 6 ++++++ README.md | 32 +++++++++++++++++++++++++++ README_en.md | 31 +++++++++++++++++++++++++++ scripts/cmk-manage.sh | 50 +++++++++++++++++++++++++++++++++++++------ 4 files changed, 112 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 2f493c9..6b2c302 100644 --- a/.env.example +++ b/.env.example @@ -134,6 +134,12 @@ NPM_ADMIN_PASSWORD=bitte-aendern-mindestens-8-zeichen # oder im Menue unter "Einstellungen". NPM_ADMIN_PORT=81 +# Unter welchem Namen die Schnittstelle des Proxy Managers angesprochen +# wird. Wichtig nur in Netzen mit Zwangsproxy: no_proxy vergleicht NAMEN, +# nicht Adressen - steht dort nur "localhost", laeuft eine Anfrage an +# 127.0.0.1 trotzdem ueber den Proxy. Dann hier auf localhost stellen. +NPM_API_HOST=127.0.0.1 + # ===================================================================== # TERMINAL-BROWSER (lokale Bedienung des Proxy Managers) # Fuer den Fall, dass Port 81 von aussen nicht erreichbar ist. diff --git a/README.md b/README.md index 1884482..c9dc8c4 100644 --- a/README.md +++ b/README.md @@ -553,6 +553,7 @@ Die wichtigsten Schalter: | `TZ` | Zeitzone, z. B. `Europe/Berlin` | | `NPM_ENABLED` | `on`/`off` – soll der Proxy-Manager-Container überhaupt laufen? Siehe [12.4](#124-proxy-manager-ganz-abschalten-externer-nginx) | | `NPM_ADMIN_PORT` | Port der Proxy-Manager-Oberfläche (Vorgabe 81) – nur über `npm-port` bzw. das Menü ändern | +| `NPM_API_HOST` | Name für die Schnittstelle (`127.0.0.1` oder `localhost`) – siehe [Kapitel 14.6](#146-netze-mit-zwangsproxy-api-fehler-der-keiner-ist) | | `NPM_ADMIN_URL` | Startseite des Terminal-Browsers; leer = automatisch aus `NPM_ADMIN_PORT` | | `BACKUP_DIR` | Ablage für **manuelle** Backups (Vorgabe `./backups`); geplante Jobs haben eigene Pfade | | `BACKUP_AUTO` | `on`/`off` – sollen die Backup-Jobs per cron laufen? | @@ -2665,6 +2666,37 @@ Erkannt wird das nicht geraten, sondern an dem, was `curl -v` selbst sagt (`Uses proxy env variable http_proxy == …`) – dafür muss auf der Zieladresse nichts laufen. +### `no_proxy` vergleicht Namen, keine Adressen + +Das ist der Punkt, an dem man am längsten sucht: `no_proxy=localhost` deckt +eine Anfrage an `127.0.0.1` **nicht** ab – und umgekehrt. Nachgemessen mit +curl 7.88: + +| `no_proxy` | Anfrage an `127.0.0.1` | Anfrage an `localhost` | +|---|---|---| +| `localhost` | **geht an den Proxy** | direkt | +| `127.0.0.1` | direkt | **geht an den Proxy** | +| beide | direkt | direkt | + +In Firmennetzen steht oft nur `localhost` in der Ausnahmeliste. Dann läuft +ausgerechnet der Zugriff auf die Schnittstelle des Proxy Managers über den +Proxy. `noproxy` prüft deshalb **beide** Schreibweisen und sagt, welche fehlt: + +``` +Gehen lokale Anfragen daran vorbei? + http://127.0.0.1:81/ geht an den Proxy + http://localhost:81/ direkt + + [ WARN ] Nur 'localhost' ist ausgenommen, 127.0.0.1 nicht. + Bis das geaendert ist, hilft sofort: + cmk-manage.sh config set NPM_API_HOST localhost +``` + +`NPM_API_HOST` bestimmt, unter welchem Namen die Schnittstelle angesprochen +wird – Vorgabe `127.0.0.1`, weil das ohne Namensauflösung auskommt und immer +auf IPv4 zeigt. Lässt sich die Ausnahmeliste im Kundennetz nicht ändern, ist +das Umstellen auf `localhost` der kürzere Weg. + **In der laufenden Sitzung** – ein Programm kann die Umgebung seiner Elternshell nicht ändern, deshalb der Umweg über `eval`: diff --git a/README_en.md b/README_en.md index a88b33a..a54ee3d 100644 --- a/README_en.md +++ b/README_en.md @@ -556,6 +556,7 @@ The most important settings: | `TZ` | time zone, e.g. `Europe/Berlin` | | `NPM_ENABLED` | `on`/`off` – should the Proxy Manager container run at all? See [12.4](#124-turning-the-proxy-manager-off-entirely-external-nginx) | | `NPM_ADMIN_PORT` | port of the Proxy Manager interface (default 81) – change only via `npm-port` or the menu | +| `NPM_API_HOST` | name the API is addressed by (`127.0.0.1` or `localhost`) – see [chapter 14.6](#146-networks-with-a-mandatory-proxy-an-api-error-that-is-none) | | `NPM_ADMIN_URL` | start page of the terminal browser; empty = derived from `NPM_ADMIN_PORT` | | `BACKUP_DIR` | location for **manual** backups (default `./backups`); scheduled jobs have their own paths | | `BACKUP_AUTO` | `on`/`off` – should the backup jobs run via cron? | @@ -2649,6 +2650,36 @@ This is not guessed but read from what `curl -v` reports itself (`Uses proxy env variable http_proxy == …`) – nothing needs to be listening on the target address for that. +### `no_proxy` matches names, not addresses + +This is where the search takes longest: `no_proxy=localhost` does **not** cover +a request to `127.0.0.1` – and vice versa. Measured with curl 7.88: + +| `no_proxy` | request to `127.0.0.1` | request to `localhost` | +|---|---|---| +| `localhost` | **goes to the proxy** | direct | +| `127.0.0.1` | direct | **goes to the proxy** | +| both | direct | direct | + +Corporate networks often list only `localhost`. Then of all things the access +to the Proxy Manager's API goes through the proxy. `noproxy` therefore checks +**both** spellings and says which one is missing: + +``` +Gehen lokale Anfragen daran vorbei? + http://127.0.0.1:81/ geht an den Proxy + http://localhost:81/ direkt + + [ WARN ] Nur 'localhost' ist ausgenommen, 127.0.0.1 nicht. + Bis das geaendert ist, hilft sofort: + cmk-manage.sh config set NPM_API_HOST localhost +``` + +`NPM_API_HOST` decides which name the API is addressed by – default +`127.0.0.1`, because that needs no name resolution and always points at IPv4. +If the exception list in the customer network cannot be changed, switching to +`localhost` is the shorter path. + **In the running session** – a program cannot change its parent shell's environment, hence the detour via `eval`: diff --git a/scripts/cmk-manage.sh b/scripts/cmk-manage.sh index 8d0da58..cf99fb5 100755 --- a/scripts/cmk-manage.sh +++ b/scripts/cmk-manage.sh @@ -3271,6 +3271,7 @@ npm|NPM_ENABLED|choice|Proxy Manager betreiben|on:off| npm|NPM_ADMIN_EMAIL|text|Konto des Proxy Managers (E-Mail)||1 npm|NPM_ADMIN_PASSWORD|password|Kennwort des Proxy-Manager-Kontos||1 npm|NPM_ADMIN_PORT|port|Port der Adminoberflaeche|| +npm|NPM_API_HOST|text|Name fuer die Schnittstelle (127.0.0.1 oder localhost)||1 npm|PROXY_DOMAIN|text|Vorgabe-Domain fuer Proxy-Hosts||1 npm|PROXY_FORWARD_HOST|text|Weiterleitungsziel (Host)|| npm|PROXY_FORWARD_PORT|port|Weiterleitungsziel (Port)|| @@ -3704,7 +3705,15 @@ EOF # "letsencrypt_email" im Aufruf gibt es in 2.15 nicht mehr. # ===================================================================== -npm_api_base() { printf 'http://127.0.0.1:%s\n' "${NPM_ADMIN_PORT:-81}"; } +# Unter welchem Namen wird die Schnittstelle angesprochen? +# +# no_proxy vergleicht NAMEN, nicht Adressen: steht dort nur "localhost", +# laeuft eine Anfrage an 127.0.0.1 trotzdem ueber den Proxy - und +# umgekehrt. In Firmennetzen ist meist "localhost" eingetragen. Die +# eigenen Aufrufe gehen zwar ohnehin mit --noproxy daran vorbei; wer +# aber von Hand prueft oder andere Werkzeuge nutzt, stellt hier um: +# cmk-manage.sh config set NPM_API_HOST localhost +npm_api_base() { printf 'http://%s:%s\n' "${NPM_API_HOST:-127.0.0.1}" "${NPM_ADMIN_PORT:-81}"; } # Hat der Proxy Manager schon eine Datenbank? Davon haengt ab, wie das # Konto entsteht: der Container legt es NUR beim ersten Start mit leerer @@ -8257,14 +8266,41 @@ EOF return 0 fi - printf '\n%sGeht %s daran vorbei?%s\n' "$C_BLD" "$url" "$C_RST" - if noproxy_would_use_proxy "$url"; then - test_result fail "Nein - curl schickt auch diese Anfrage an den Proxy." + # no_proxy vergleicht Namen, nicht Adressen. Deshalb beide pruefen - + # oft steht nur einer von beiden in der Ausnahmeliste. + printf '\n%sGehen lokale Anfragen daran vorbei?%s\n' "$C_BLD" "$C_RST" + local n ok_ip="" ok_name="" + for n in 127.0.0.1 localhost; do + printf ' %-28s ' "http://$n:${NPM_ADMIN_PORT:-81}/" + if noproxy_would_use_proxy "http://$n:${NPM_ADMIN_PORT:-81}/"; then + printf '%bgeht an den Proxy%b\n' "$C_RED" "$C_RST" + else + printf '%bdirekt%b\n' "$C_GRN" "$C_RST" + if [ "$n" = 127.0.0.1 ]; then ok_ip=1; else ok_name=1; fi + fi + done + echo + + if [ -z "$ok_ip" ] && [ -n "$ok_name" ]; then + test_result warn "Nur 'localhost' ist ausgenommen, 127.0.0.1 nicht." + printf ' no_proxy vergleicht Namen, keine Adressen - beides muss + einzeln drinstehen. Bis das geaendert ist, hilft sofort: + %s config set NPM_API_HOST localhost\n' "$SELF" + printf '\n Angesprochen wird die Schnittstelle derzeit als: %s\n' \ + "${NPM_API_HOST:-127.0.0.1}" + elif [ -n "$ok_ip" ] && [ -z "$ok_name" ]; then + test_result warn "Nur 127.0.0.1 ist ausgenommen, 'localhost' nicht." + printf ' Fuer dieses Werkzeug genuegt das (NPM_API_HOST=%s).\n' \ + "${NPM_API_HOST:-127.0.0.1}" + fi + + if [ -z "$ok_ip" ] && [ -z "$ok_name" ]; then + test_result fail "Nein - curl schickt auch lokale Anfragen an den Proxy." printf ' Daher kommen Meldungen wie "API-Fehler" beim Anmelden am Proxy Manager: nicht der Proxy Manager antwortet nicht, sondern - der HTTP-Proxy weiss mit 127.0.0.1 nichts anzufangen.\n' - else - test_result ok "Ja - lokale Anfragen gehen direkt." + der HTTP-Proxy weiss mit der Adresse nichts anzufangen.\n' + elif [ -n "$ok_ip" ] && [ -n "$ok_name" ]; then + test_result ok "Ja - beide Schreibweisen gehen direkt." if [ -z "$fix" ]; then printf '\n Die eigenen Aufrufe dieses Werkzeugs gehen ohnehin daran vorbei (curl --noproxy). Fuer eigene Tests und andere Programme ist es