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